diff options
author | Toon Claes <toon@gitlab.com> | 2021-04-01 15:52:41 +0300 |
---|---|---|
committer | Toon Claes <toon@gitlab.com> | 2021-04-22 14:44:41 +0300 |
commit | e660ef8ea350f695e13b10ec254f14e7131c3ba2 (patch) | |
tree | bcd5048142f7dfd9e7659dfdd78ec061ac9cca79 | |
parent | bcfc3c554d4fb79d99f850bfb35e11c84d8bf0ba (diff) |
gitaly-git2go: Rebase skips commits upstream has
When a branch was partially merged into upstream, rebase should only
pick commits that are not in upstream.
This change uses merge base between the branch and upstream to determine
which commits do not yet exist in upstream. Only the descendant commits
from merge base are taken into account for the rebase.
-rw-r--r-- | cmd/gitaly-git2go/rebase.go | 7 | ||||
-rw-r--r-- | cmd/gitaly-git2go/rebase_test.go | 24 |
2 files changed, 30 insertions, 1 deletions
diff --git a/cmd/gitaly-git2go/rebase.go b/cmd/gitaly-git2go/rebase.go index ffb4630dd..3ca85cace 100644 --- a/cmd/gitaly-git2go/rebase.go +++ b/cmd/gitaly-git2go/rebase.go @@ -93,7 +93,12 @@ func (cmd *rebaseSubcommand) rebase(ctx context.Context, request *git2go.RebaseC return onto.Id().String(), nil } - rebase, err := repo.InitRebase(branch, onto, onto, &opts) + mergeCommit, err := repo.LookupAnnotatedCommit(mergeBase) + if err != nil { + return "", fmt.Errorf("look up merge base: %w", err) + } + + rebase, err := repo.InitRebase(branch, mergeCommit, onto, &opts) if err != nil { return "", fmt.Errorf("initiate rebase: %w", err) } diff --git a/cmd/gitaly-git2go/rebase_test.go b/cmd/gitaly-git2go/rebase_test.go index 45e63bc8d..899aaed63 100644 --- a/cmd/gitaly-git2go/rebase_test.go +++ b/cmd/gitaly-git2go/rebase_test.go @@ -8,6 +8,7 @@ import ( git "github.com/libgit2/git2go/v31" "github.com/stretchr/testify/require" + cmdtesthelper "gitlab.com/gitlab-org/gitaly/cmd/gitaly-git2go/testhelper" "gitlab.com/gitlab-org/gitaly/internal/git2go" "gitlab.com/gitlab-org/gitaly/internal/testhelper" "gitlab.com/gitlab-org/gitaly/internal/testhelper/testcfg" @@ -69,6 +70,7 @@ func TestRebase_rebase(t *testing.T) { desc string branch string commitsAhead int + setupRepo func(testing.TB, *git.Repository) expected string }{ { @@ -94,6 +96,24 @@ func TestRebase_rebase(t *testing.T) { branch: "branch-merged", expected: "1e292f8fedd741b75372e19097c76d327140c312", }, + { + desc: "Partially merged branch", + branch: "branch-merged-plus-one", + setupRepo: func(t testing.TB, repo *git.Repository) { + head, err := lookupCommit(repo, "branch-merged") + require.NoError(t, err) + + other, err := lookupCommit(repo, "gitaly-rename-test") + require.NoError(t, err) + tree, err := other.Tree() + require.NoError(t, err) + newOid, err := repo.CreateCommitFromIds("refs/heads/branch-merged-plus-one", &cmdtesthelper.DefaultAuthor, &cmdtesthelper.DefaultAuthor, "Message", tree.Object.Id(), head.Object.Id()) + require.NoError(t, err) + require.Equal(t, "5da601ef10e314884bbade9d5b063be37579ccf9", newOid.String()) + }, + commitsAhead: 1, + expected: "591b29084164bcc58fa4fb851a3c409290b17bfe", + }, } for _, tc := range testcases { @@ -111,6 +131,10 @@ func TestRebase_rebase(t *testing.T) { repo, err := git.OpenRepository(repoPath) require.NoError(t, err) + if tc.setupRepo != nil { + tc.setupRepo(t, repo) + } + request := git2go.RebaseCommand{ Repository: repoPath, Committer: committer, |