package repoinfo import ( "path" "slices" "github.com/bluesky-social/indigo/atproto/syntax" "tangled.org/core/appview/models" "tangled.org/core/appview/state/userutil" ) func (r RepoInfo) Owner() string { if r.OwnerHandle != "" { return r.OwnerHandle } else { return r.OwnerDid } } func (r RepoInfo) FullName() string { return path.Join(r.Owner(), r.Name) } func (r RepoInfo) OwnerWithoutAt() string { if r.OwnerHandle != "" { return r.OwnerHandle } else { return userutil.FlattenDid(r.OwnerDid) } } func (r RepoInfo) FullNameWithoutAt() string { return path.Join(r.OwnerWithoutAt(), r.Name) } func (r RepoInfo) GetTabs() [][]string { tabs := [][]string{ {"overview", "/", "square-chart-gantt"}, {"issues", "/issues", "circle-dot"}, {"pulls", "/pulls", "git-pull-request"}, {"pipelines", "/pipelines", "layers-2"}, } if r.Roles.SettingsAllowed() { tabs = append(tabs, []string{"settings", "/settings", "cog"}) } return tabs } type RepoInfo struct { Name string Rkey string OwnerDid string OwnerHandle string Description string Website string Topics []string Knot string Spindle string RepoAt syntax.ATURI IsStarred bool Stats models.RepoStats Roles RolesInRepo Source *models.Repo SourceHandle string Ref string DisableFork bool CurrentDir string } // each tab on a repo could have some metadata: // // issues -> number of open issues etc. // settings -> a warning icon to setup branch protection? idk // // we gather these bits of info here, because go templates // are difficult to program in func (r RepoInfo) TabMetadata() map[string]any { meta := make(map[string]any) meta["pulls"] = r.Stats.PullCount.Open meta["issues"] = r.Stats.IssueCount.Open // more stuff? return meta } type RolesInRepo struct { Roles []string } func (r RolesInRepo) SettingsAllowed() bool { return slices.Contains(r.Roles, "repo:settings") } func (r RolesInRepo) CollaboratorInviteAllowed() bool { return slices.Contains(r.Roles, "repo:invite") } func (r RolesInRepo) RepoDeleteAllowed() bool { return slices.Contains(r.Roles, "repo:delete") } func (r RolesInRepo) IsOwner() bool { return slices.Contains(r.Roles, "repo:owner") } func (r RolesInRepo) IsCollaborator() bool { return slices.Contains(r.Roles, "repo:collaborator") } func (r RolesInRepo) IsPushAllowed() bool { return slices.Contains(r.Roles, "repo:push") }