package gitpb import ( "path/filepath" "slices" "strings" "time" "go.wit.com/lib/gui/shell" "go.wit.com/log" timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) // this is becoming a standard format // todo: autogenerate this from the .proto file? // Update version and timestamp. // returns ok (ok == true if not found) func (r *Repo) Update() error { // delete the old hash // r.DeleteByHash(hash) r.Refs = nil tags := []string{"%(objectname)", "%(creatordate)", "%(*authordate)", "%(refname)", "%(subject)"} format := strings.Join(tags, "_,,,_") cmd := []string{"git", "for-each-ref", "--sort=taggerdate", "--format", format} // log.Info("RUNNING:", strings.Join(cmd, " ")) result := shell.PathRunQuiet(r.FullPath, cmd) if result.Error != nil { log.Warn("git for-each-ref error:", result.Error) return result.Error } lines := result.Stdout // reverse the git order slices.Reverse(lines) var refName string var hash string var subject string var ctime time.Time for i, line := range lines { var parts []string parts = make([]string, 0) parts = strings.Split(line, "_,,,_") if len(parts) != 5 { log.Info("tag error:", i, parts) continue } refName = parts[3] hash = parts[0] ctime = getGitDateStamp(parts[1]) subject = parts[4] } newr := Ref{ Hash: hash, Subject: subject, RefName: refName, Ctime: timestamppb.New(ctime), } r.AppendRef(&newr) return nil } // converts a git for-each-ref date. "Wed Feb 7 10:13:38 2024 -0600" func getGitDateStamp(gitdefault string) time.Time { // now := time.Now().Format("Wed Feb 7 10:13:38 2024 -0600") const gitLayout = "Mon Jan 2 15:04:05 2006 -0700" tagTime, err := time.Parse(gitLayout, gitdefault) if err != nil { log.Warn("GOT THIS IN PARSE AAA." + gitdefault + ".AAA") log.Warn(err) return time.Now() } return tagTime } // scans in a new git repo. If it detects the repo is a golang project, // then it parses the go.mod/go.sum files // TODO: try adding python, rails, perl, rust, other language things? // I probably will never have time to try that, but I'd take patches for anyone // that might see this note and feel so inclined. func (r *Repos) InitNewGoPath(basepath string, gopath string) *Repo { if oldr := r.FindByPath(gopath); oldr != nil { // already had this gopath return oldr } // add a new one here newr := Repo{ FullPath: filepath.Join(basepath, gopath), GoPath: gopath, } newr.Update() r.Append(&newr) return &newr }