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:
Diffstat (limited to 'cmd/gitaly-git2go/rebase_test.go')
-rw-r--r--cmd/gitaly-git2go/rebase_test.go203
1 files changed, 203 insertions, 0 deletions
diff --git a/cmd/gitaly-git2go/rebase_test.go b/cmd/gitaly-git2go/rebase_test.go
new file mode 100644
index 000000000..a169b4a1f
--- /dev/null
+++ b/cmd/gitaly-git2go/rebase_test.go
@@ -0,0 +1,203 @@
+// +build static,system_libgit2
+
+package main
+
+import (
+ "testing"
+ "time"
+
+ 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/git/gittest"
+ "gitlab.com/gitlab-org/gitaly/internal/git2go"
+ "gitlab.com/gitlab-org/gitaly/internal/testhelper"
+ "gitlab.com/gitlab-org/gitaly/internal/testhelper/testcfg"
+)
+
+var (
+ masterRevision = "1e292f8fedd741b75372e19097c76d327140c312"
+)
+
+func TestRebase_validation(t *testing.T) {
+ cfg, _, repoPath := testcfg.BuildWithRepo(t)
+ testhelper.ConfigureGitalyGit2GoBin(t, cfg)
+ committer := git2go.NewSignature("Foo", "foo@example.com", time.Now())
+
+ testcases := []struct {
+ desc string
+ request git2go.RebaseCommand
+ expectedErr string
+ }{
+ {
+ desc: "no arguments",
+ expectedErr: "rebase: missing repository",
+ },
+ {
+ desc: "missing repository",
+ request: git2go.RebaseCommand{Committer: committer, BranchName: "feature", UpstreamRevision: masterRevision},
+ expectedErr: "rebase: missing repository",
+ },
+ {
+ desc: "missing committer name",
+ request: git2go.RebaseCommand{Repository: repoPath, Committer: git2go.Signature{Email: "foo@example.com"}, BranchName: "feature", UpstreamRevision: masterRevision},
+ expectedErr: "rebase: missing committer name",
+ },
+ {
+ desc: "missing committer email",
+ request: git2go.RebaseCommand{Repository: repoPath, Committer: git2go.Signature{Name: "Foo"}, BranchName: "feature", UpstreamRevision: masterRevision},
+ expectedErr: "rebase: missing committer email",
+ },
+ {
+ desc: "missing branch name",
+ request: git2go.RebaseCommand{Repository: repoPath, Committer: committer, UpstreamRevision: masterRevision},
+ expectedErr: "rebase: missing branch name",
+ },
+ {
+ desc: "missing upstream branch",
+ request: git2go.RebaseCommand{Repository: repoPath, Committer: committer, BranchName: "feature"},
+ expectedErr: "rebase: missing upstream revision",
+ },
+ }
+ for _, tc := range testcases {
+ t.Run(tc.desc, func(t *testing.T) {
+ ctx, cancel := testhelper.Context()
+ defer cancel()
+
+ _, err := tc.request.Run(ctx, cfg)
+ require.EqualError(t, err, tc.expectedErr)
+ })
+ }
+}
+
+func TestRebase_rebase(t *testing.T) {
+ testcases := []struct {
+ desc string
+ branch string
+ commitsAhead int
+ setupRepo func(testing.TB, *git.Repository)
+ expected string
+ expectedErr string
+ }{
+ {
+ desc: "Single commit rebase",
+ branch: "gitaly-rename-test",
+ commitsAhead: 1,
+ expected: "a08ed4bc45f9e686db93c5d0519f63d7b537270c",
+ },
+ {
+ desc: "Multiple commits",
+ branch: "csv",
+ commitsAhead: 5,
+ expected: "2f8365edc69d3683e22c4209ae9641642d84dd4a",
+ },
+ {
+ desc: "Branch zero commits behind",
+ branch: "sha-starting-with-large-number",
+ commitsAhead: 1,
+ expected: "842616594688d2351480dfebd67b3d8d15571e6d",
+ },
+ {
+ desc: "Merged branch",
+ branch: "branch-merged",
+ expected: masterRevision,
+ },
+ {
+ 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",
+ },
+ {
+ desc: "With upstream merged into",
+ branch: "csv-plus-merge",
+ setupRepo: func(t testing.TB, repo *git.Repository) {
+ ours, err := lookupCommit(repo, "csv")
+ require.NoError(t, err)
+ theirs, err := lookupCommit(repo, "b83d6e391c22777fca1ed3012fce84f633d7fed0")
+ require.NoError(t, err)
+
+ index, err := repo.MergeCommits(ours, theirs, nil)
+ require.NoError(t, err)
+ tree, err := index.WriteTreeTo(repo)
+ require.NoError(t, err)
+
+ newOid, err := repo.CreateCommitFromIds("refs/heads/csv-plus-merge", &cmdtesthelper.DefaultAuthor, &cmdtesthelper.DefaultAuthor, "Message", tree, ours.Object.Id(), theirs.Object.Id())
+ require.NoError(t, err)
+ require.Equal(t, "5cfe4a597b54c8f2b7ae85212f67599a1492009c", newOid.String())
+ },
+ commitsAhead: 5, // Same as "Multiple commits"
+ expected: "2f8365edc69d3683e22c4209ae9641642d84dd4a",
+ },
+ {
+ desc: "Rebase with conflict",
+ branch: "rebase-encoding-failure-trigger",
+ expectedErr: "rebase: commit \"eb8f5fb9523b868cef583e09d4bf70b99d2dd404\": conflicts have not been resolved",
+ },
+ {
+ desc: "Orphaned branch",
+ branch: "orphaned-branch",
+ expectedErr: "rebase: find merge base: no merge base found",
+ },
+ }
+
+ for _, tc := range testcases {
+ t.Run(tc.desc, func(t *testing.T) {
+ ctx, cancel := testhelper.Context()
+ defer cancel()
+
+ committer := git2go.NewSignature(string(gittest.TestUser.Name),
+ string(gittest.TestUser.Email),
+ time.Date(2021, 3, 1, 13, 45, 50, 0, time.FixedZone("", +2*60*60)))
+
+ cfg, _, repoPath := testcfg.BuildWithRepo(t)
+ testhelper.ConfigureGitalyGit2GoBin(t, cfg)
+
+ repo, err := git.OpenRepository(repoPath)
+ require.NoError(t, err)
+
+ if tc.setupRepo != nil {
+ tc.setupRepo(t, repo)
+ }
+
+ request := git2go.RebaseCommand{
+ Repository: repoPath,
+ Committer: committer,
+ BranchName: tc.branch,
+ UpstreamRevision: masterRevision,
+ }
+
+ response, err := request.Run(ctx, cfg)
+ if tc.expectedErr != "" {
+ require.EqualError(t, err, tc.expectedErr)
+ } else {
+ require.NoError(t, err)
+
+ result := response.String()
+ require.Equal(t, tc.expected, result)
+
+ commit, err := lookupCommit(repo, result)
+ require.NoError(t, err)
+
+ for i := tc.commitsAhead; i > 0; i-- {
+ commit = commit.Parent(0)
+ }
+ masterCommit, err := lookupCommit(repo, masterRevision)
+ require.NoError(t, err)
+ require.Equal(t, masterCommit, commit)
+ }
+ })
+ }
+}