repolist/common.go

217 lines
3.9 KiB
Go

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) RepoType() string {
return r.pb.RepoType()
}
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
}