Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToon Claes <toon@gitlab.com>2021-04-01 15:52:41 +0300
committerToon Claes <toon@gitlab.com>2021-04-22 14:44:41 +0300
commite660ef8ea350f695e13b10ec254f14e7131c3ba2 (patch)
treebcd5048142f7dfd9e7659dfdd78ec061ac9cca79
parentbcfc3c554d4fb79d99f850bfb35e11c84d8bf0ba (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.go7
-rw-r--r--cmd/gitaly-git2go/rebase_test.go24
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,