package repolist import ( "fmt" "os" "path/filepath" "sort" "github.com/go-cmd/cmd" "go.wit.com/gui" "go.wit.com/lib/gui/repostatus" "go.wit.com/log" ) func (r *RepoList) Hidden() bool { return r.reposbox.Hidden() } func (r *RepoList) Show() { r.reposbox.Show() } func (r *RepoList) Hide() { r.reposbox.Hide() } // better name: use this // matches by path or by name func (r *RepoList) FindByName(name string) *RepoRow { loop := r.ReposSortByName() for loop.Scan() { repo := loop.Repo() if repo.GoPath() == name { return repo } base := filepath.Base(repo.GoPath()) if base == name { return repo } } return nil } func (r *RepoList) FindByPath(path string) *RepoRow { return r.FindRepo(path) } func (r *RepoList) FindRepo(path string) *RepoRow { repo, _ := me.allrepos[path] return repo } /* func (r *RepoList) AllRepos() []*RepoRow { var all []*RepoRow for _, repo := range me.allrepos { all = append(all, repo) } return all } // deprecate this func AllRepos() []*RepoRow { var all []*RepoRow for _, repo := range me.allrepos { all = append(all, repo) } return all } */ // a human readable state of the current repo func (r *RepoRow) State() string { return r.gitState.String() } func (r *RepoRow) Scan() int { return r.NewScan() } // returns a name for human consuption only // todo: implement nicknames func (rs *RepoRow) Name() string { if rs.Status.IsGoLang() { return rs.Status.GoPath() } return rs.Status.Path() } func (r *RepoRow) GoPath() string { return r.Status.GoPath() } func (r *RepoRow) CheckDirty() bool { return r.Status.CheckDirty() } func (r *RepoRow) IsDirty() bool { return r.Status.IsDirty() } func (r *RepoRow) ReadOnly() bool { if r == nil { log.Warn("ReadOnly() repo == nil") return false } if r.Status == nil { log.Warn("ReadOnly() repo.Status == nil") return false } return r.Status.ReadOnly() } func (r *RepoRow) LastTag() string { if r == nil { log.Warn("LastTag() repo == nil") return "" } return r.lastTag.String() } func (r *RepoRow) IsPerfect() bool { if r.gitState.String() == "PERFECT" { return true } if r.gitState.String() == "unchanged" { return true } return false } func (r *RepoRow) Run(cmd []string) cmd.Status { return r.Status.Run(cmd) } func (r *RepoRow) AllTags() []*repostatus.Tag { return r.Status.Tags.ListAll() } func (r *RepoRow) TagsBox() *repostatus.GitTagBox { return r.Status.Tags } // todo, fix bool return for deletetag() func (r *RepoRow) DeleteTag(t *repostatus.Tag) bool { r.Status.DeleteTag(t) return true } func (rl *RepoList) MirrorShownCount() *gui.Node { return gui.RawMirror(rl.shownCount) } func (rl *RepoList) MirrorScanDuration() *gui.Node { return gui.RawMirror(rl.duration) } func (rl *RepoList) Total() int { return len(me.allrepos) } func (rl *RepoList) TotalGo() int { var count int for _, repo := range me.allrepos { if repo.Status.IsGoLang() { count += 1 } } return count } // very much a hack job func (rl *RepoList) MakeGoWork() error { goSrcDir := os.Getenv("REPO_WORK_PATH") filename := filepath.Join(goSrcDir, "go.work") f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0600) if err != nil { return err } defer f.Close() fmt.Fprintln(f, "go 1.21.4") // fix this fmt.Fprintln(f, "") fmt.Fprintln(f, "use (") keys := make([]string, 0, len(rl.allrepos)) for k := range rl.allrepos { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { repo := rl.allrepos[k] if repo.Status.GoPath() == "" { // skip repos that aren't go // todo: handle non-flat repos? log.Info("SKIPPED REPO", repo.Status.Path()) continue } if repo.Status.Exists("go.mod") { fmt.Fprintln(f, "\t"+repo.Status.GoPath()) log.Info("ADDING REPO", goSrcDir, repo.Status.GoPath()) } else { log.Log(REPO, "missing go.mod for", repo.Status.Path()) // repo.Status.MakeRedomod() } } fmt.Fprintln(f, ")") return nil }