diff options
| author | Jeff Carr <[email protected]> | 2025-10-14 18:04:51 -0500 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-10-14 18:04:51 -0500 |
| commit | 946d8dfc137792a072521d0290fac280b4781965 (patch) | |
| tree | 91d6a07e2b9e36a2eea33d574ad59dd031c8762f /compare.go | |
| parent | 09ba8b90f02c2b482c2cc8af29be35991af05701 (diff) | |
add stats
Diffstat (limited to 'compare.go')
| -rw-r--r-- | compare.go | 79 |
1 files changed, 79 insertions, 0 deletions
@@ -1,5 +1,12 @@ package gitpb +import ( + "strings" + + "go.wit.com/lib/config" + "go.wit.com/log" +) + type RepoTag struct { r *Repo t *GitTag @@ -53,6 +60,25 @@ func (t1 *RepoTag) CompareBranch(t2 *RepoTag) ([]string, []string, []string, []s return lines1, lines2, cmd1, cmd2, nil } +func (r *Repo) CompareHashes(keepHash string, deleteHash string) ([]string, []string, []string, []string, error) { + lines1, cmd1, err1 := r.CountDiffObjectsNEWNEW(keepHash, deleteHash) + // log.Info("lessthan", t1.t.Refname, t2.t.Refname, count, t1.r.FullPath) + if err1 != nil { + // log.Info("lessthan", t1.t.Refname, t2.t.Refname, count, t1.r.FullPath, err) + return nil, nil, cmd1, nil, err1 + } + lines2, cmd2, err2 := r.CountDiffObjectsNEWNEW(deleteHash, keepHash) + // log.Info("lessthan", t1.t.Refname, t2.t.Refname, count, t1.r.FullPath) + if err2 != nil { + // log.Info("lessthan", t1.t.Refname, t2.t.Refname, count, t1.r.FullPath, err) + return nil, nil, cmd1, cmd2, err2 + } + if (len(lines1) != 0) || (len(lines2) != 0) { + return lines1, lines2, cmd1, cmd2, nil + } + return lines1, lines2, cmd1, cmd2, nil +} + /* func (t1 *RepoTag) LessThanVerbose(t2 *RepoTag) []string { count, err := t1.r.CountDiffObjectsNew(t1.t.Refname, t2.t.Refname) @@ -96,3 +122,56 @@ func (r *Repo) GetLocalDevelRef() *GitTag { func (r *Repo) GetLocalMasterRef() *GitTag { return r.IsBranchLocal(r.GetMasterBranchName()) } + +// It's safe to remove a tag if the deleteHash is completely contained in the keepHash +// This determines the git PatchId's for each hash and finds out if they are there +// brute force so it can be slow, but it worth it because it works (todo: detect rare duplicate patchId's) +func (repo *Repo) SafeDelete(deleteHash string, keepHash string) error { + // compare the branches + hashok, hashbad, cmd1, cmd2, err := repo.CompareHashes(keepHash, deleteHash) + + if err != nil { + // things are really really messed up. might be 'branchless' at this point (?) + log.Printf("%-13.13s %-55.55s err='%v' %s %v\n", "CMD ERR", repo.FullPath, err, "NOT SAFE TO DELETE. Reload()?", cmd1) + log.Printf("%-13.13s %-55.55s err='%v' %s %v\n", "CMD ERR", repo.FullPath, err, "NOT SAFE TO DELETE. Reload()?", cmd2) + return err + } + + // things only in the master branch (safe to ignore) + for _, line := range hashok { + log.Info("OK", repo.Namespace, "in keepHash", cmd1, line) + } + + // things still only in the local branch (bad to delete) + for _, line := range hashbad { + // notes.addTextNote("BAD", repo, localRef.GetRef(), cmd2, line) + log.Info("BAD", repo.Namespace, "in deleteHash", cmd2, line) + parts := strings.Split(line, "%00") // git log doesn't actually convert %00 to NULL + if len(parts) != 4 { + log.Info("len", len(parts)) + panic("nope") + } + findThisHash := parts[0] + log.Info(findThisHash, deleteHash, "need to figure out the patchID for this to be deleted hash") + } + + if len(hashbad) == 0 { + // todo: force checkout to local master branch + // before doing this + cmd := []string{"git", "update-ref", "-d", deleteHash} + log.Printf("%-13.13s %-55.55s %v %s\n", "CMD OK", repo.FullPath, cmd1, "") + log.Printf("%-13.13s %-55.55s %v %s\n", "CMD OK", repo.FullPath, cmd2, "") + log.Printf("%-13.13s %-55.55s %v %s\n", "SAFE TO DELETE", repo.FullPath, cmd, "add --fix") + if config.Get("Fix") == "true" { + err := repo.RunVerbose(cmd) + if err != nil { + log.Info(deleteHash, repo.FullPath) + s := "local user branch could not be deleted" + config.BadExit(s, err) + } + } + return config.ErrdKeyFalse("Fix") + } + + return log.Errorf("NOT SAFE") +} |
