diff --git a/knotserver/git/cmd.go b/knotserver/git/cmd.go --- a/knotserver/git/cmd.go +++ b/knotserver/git/cmd.go @@ -40,3 +40,7 @@ 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 --- a/knotserver/git/diff.go +++ b/knotserver/git/diff.go @@ -77,6 +77,16 @@ 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 --- a/knotserver/xrpc/repo_compare.go +++ b/knotserver/xrpc/repo_compare.go @@ -76,12 +76,17 @@ var combinedPatch []*gitdiff.File 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 + } } }