From 7ab5e5fc5c91d66f04a2dd256592a4f8db255bce Mon Sep 17 00:00:00 2001 From: Lewis Date: Wed, 1 Apr 2026 14:56:57 +0300 Subject: [PATCH] knotserver/xrpc: merge-base for combined patch in repo compare Lewis: May this revision serve well! --- knotserver/git/cmd.go | 4 ++++ knotserver/git/diff.go | 10 ++++++++++ knotserver/xrpc/repo_compare.go | 11 ++++++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/knotserver/git/cmd.go b/knotserver/git/cmd.go index 0a5dec73..b359d7a4 100644 --- a/knotserver/git/cmd.go +++ b/knotserver/git/cmd.go @@ -40,3 +40,7 @@ func (g *GitRepo) forEachRef(extraArgs ...string) ([]byte, error) { func (g *GitRepo) revParse(extraArgs ...string) ([]byte, error) { return g.runGitCmd("rev-parse", extraArgs...) } + +func (g *GitRepo) mergeBase(extraArgs ...string) ([]byte, error) { + return g.runGitCmd("merge-base", extraArgs...) +} diff --git a/knotserver/git/diff.go b/knotserver/git/diff.go index e5ccd1f8..b58e2d3d 100644 --- a/knotserver/git/diff.go +++ b/knotserver/git/diff.go @@ -77,6 +77,16 @@ func (g *GitRepo) Diff() (*types.NiceDiff, error) { return &nd, nil } +func (g *GitRepo) MergeBase(a, b *object.Commit) (*object.Commit, error) { + out, err := g.mergeBase(a.Hash.String(), b.Hash.String()) + if err != nil { + return nil, fmt.Errorf("merge-base %s %s: %w", a.Hash, b.Hash, err) + } + + hash := plumbing.NewHash(strings.TrimSpace(string(out))) + return g.r.CommitObject(hash) +} + func (g *GitRepo) DiffTree(commit1, commit2 *object.Commit) (*types.DiffTree, error) { tree1, err := commit1.Tree() if err != nil { diff --git a/knotserver/xrpc/repo_compare.go b/knotserver/xrpc/repo_compare.go index aeb23a1a..2d4bde31 100644 --- a/knotserver/xrpc/repo_compare.go +++ b/knotserver/xrpc/repo_compare.go @@ -76,12 +76,17 @@ func (x *Xrpc) RepoCompare(w http.ResponseWriter, r *http.Request) { var combinedPatchRaw string // we need the combined patch if len(formatPatch) >= 2 { - diffTree, err := gr.DiffTree(commit1, commit2) + mergeBaseCommit, err := gr.MergeBase(commit1, commit2) if err != nil { x.Logger.Error("error comparing revisions", "msg", err.Error()) } else { - combinedPatch = diffTree.Diff - combinedPatchRaw = diffTree.Patch + diffTree, err := gr.DiffTree(mergeBaseCommit, commit2) + if err != nil { + x.Logger.Error("error comparing revisions", "msg", err.Error()) + } else { + combinedPatch = diffTree.Diff + combinedPatchRaw = diffTree.Patch + } } } -- 2.51.2