diff options
Diffstat (limited to 'helperPatches.go')
| -rw-r--r-- | helperPatches.go | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/helperPatches.go b/helperPatches.go new file mode 100644 index 0000000..3450452 --- /dev/null +++ b/helperPatches.go @@ -0,0 +1,225 @@ +// Copyright 2017-2025 WIT.COM Inc. All rights reserved. +// Use of this source code is governed by the GPL 3.0 + +package main + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "regexp" + "strings" + + "go.wit.com/lib/protobuf/forgepb" + "go.wit.com/log" +) + +/* +type stdPatchsetTableWin struct { + sync.Mutex + win *gadgets.GenericWindow // the machines gui window + box *gui.Node // the machines gui parent box widget + TB *forgepb.PatchsetsTable // the gui table buffer + update bool // if the window should be updated +} + +func (w *stdPatchsetTableWin) Toggle() { + if w == nil { + return + } + if w.win == nil { + return + } + w.win.Toggle() +} +*/ + +/* + etimef := func(e *forgepb.Patchset) string { + etime := e.Etime.AsTime() + s := etime.Format("2006/01/02 15:04") + if strings.HasPrefix(s, "1970/") { + // just show a blank if it's not set + return "" + } + return s + } + t.AddStringFunc("etime", etimef) +*/ + +/* + ctimef := func(p *forgepb.Patchset) string { + ctime := p.Ctime.AsTime() + return ctime.Format("2006/01/02 15:04") + } +} +*/ + +func setPatchsetState(p *forgepb.Patchset) { + var bad bool + var good bool + var done bool = true + + all := p.Patches.All() + for all.Scan() { + patch := all.Next() + // log.Info("patch:", patch.StartHash, patch.CommitHash, patch.Namespace, patch.Filename) + repo := me.forge.FindByGoPath(patch.Namespace) + if repo == nil { + log.Info("could not find repo", patch.Namespace) + bad = true + continue + } + if _, err := repo.GetHashName(patch.CommitHash); err == nil { + // this patch has been applied + patch.Applied = true + done = true + continue + } + if name, err := repo.GetHashName(patch.StartHash); err == nil { + // it might be possible to apply this patch + log.Info("patch may be good:", patch.Namespace, name, patch.CommitHash, patch.Filename) + good = true + } else { + // probably screwed up git trees + log.Info("patch with unknown origin:", patch.Namespace, name, err, patch.CommitHash, patch.Filename) + bad = true + } + } + if bad { + p.State = "BAD" + return + } + if good { + p.State = "TRY" + return + } + if done { + p.State = "DONE" + return + } +} + +func cleanSubject(line string) string { + // Regular expression to remove "Subject:" and "[PATCH...]" patterns + re := regexp.MustCompile(`(?i)^Subject:\s*(\[\s*PATCH[^\]]*\]\s*)?`) + cleaned := re.ReplaceAllString(line, "") + return strings.TrimSpace(cleaned) +} + +func findCommitByHash(hash string, subject string) (string, error) { + cmd := exec.Command("git", "log", "--pretty=format:%H %s") + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + return "", err + } + + lines := strings.Split(out.String(), "\n") + for _, line := range lines { + if strings.Contains(strings.ToLower(line), strings.ToLower(subject)) { + return strings.Fields(line)[0], nil // return the commit hash + } + if strings.Fields(line)[0] == hash { + return "", fmt.Errorf("start commit found: %s", hash) + } + } + return "", fmt.Errorf("no commit found for subject: %s", subject) +} + +func findCommitBySubject(subject string) (string, error) { + cmd := exec.Command("git", "log", "--pretty=format:%H %s", "--grep="+subject, "-i") + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + return "", err + } + + lines := strings.Split(out.String(), "\n") + for _, line := range lines { + if strings.Contains(strings.ToLower(line), strings.ToLower(subject)) { + return strings.Fields(line)[0], nil // return the commit hash + } + } + return "", fmt.Errorf("no commit found for subject: %s", subject) +} + +func setNewCommitHash(p *forgepb.Patchset) bool { + var done bool = true + for patch := range p.Patches.IterAll() { + // parts := strings.Fields(patch.Comment) + + repo := me.forge.FindByGoPath(patch.Namespace) + if repo == nil { + log.Info("could not find repo", patch.Namespace) + continue + } + + comment := cleanSubject(patch.Comment) + + if patch.NewHash != "na" { + log.Info("patch: newhash:", patch.NewHash, "commithash:", patch.CommitHash, patch.Namespace, comment) + continue + } + done = false + os.Chdir(repo.GetFullPath()) + newhash, err := findCommitBySubject(comment) + if err != nil { + log.Info("patch: not found hash:", patch.CommitHash, patch.Namespace, comment, newhash, err) + continue + } + patch.NewHash = newhash + log.Info("patch: found hash:", patch.CommitHash, newhash, patch.Namespace, comment) + } + + return done +} + +/* +func AddNotDonePatches(notdone *forgepb.Patches, pset *forgepb.Patchset, full bool) { + for patch := range pset.Patches.IterAll() { + comment := cleanSubject(patch.Comment) + + if found := notdone.FindByCommitHash(patch.CommitHash); found != nil { + log.Info("duplicate notdone", patch.Namespace, "patch:", patch.NewHash, "commithash:", patch.CommitHash, comment) + continue + } + + repo := me.forge.FindByGoPath(patch.Namespace) + if repo == nil { + log.Info("could not find repo", patch.Namespace) + if full { + notdone.AppendByCommitHash(patch) // double check to ensure the commit hash isn't added twice + } + continue + } + + if patch.NewHash != "na" { + log.Info("already applied patch", patch.Namespace, ": newhash:", patch.NewHash, "commithash:", patch.CommitHash, comment) + continue + } + os.Chdir(repo.GetFullPath()) + newhash, err := findCommitByHash(patch.StartHash, comment) + if err != nil { + // this patch has not been applied yet + log.Info("patch: not found hash:", patch.Namespace, patch.CommitHash, comment, err) + notdone.AppendByCommitHash(patch) // double check to ensure the commit hash isn't added twice + continue + } + + newhash, err = findCommitBySubject(comment) + if err == nil { + patch.NewHash = newhash + log.Info("patch: found hash:", patch.Namespace, "commit patch", patch.CommitHash, "new hash", newhash, "start hash", patch.StartHash, comment) + continue + } + + // this patch has not been applied yet + log.Info("patch: not found hash:", patch.Namespace, patch.CommitHash, comment, newhash, err) + notdone.AppendByCommitHash(patch) // double check to ensure the commit hash isn't added twice + } +} +*/ |
