]> source.dussan.org Git - gitea.git/commitdiff
Fix webhook commits wrong hash on HEAD reset (#16283)
authorKN4CK3R <admin@oldschoolhack.me>
Wed, 30 Jun 2021 17:49:06 +0000 (19:49 +0200)
committerGitHub <noreply@github.com>
Wed, 30 Jun 2021 17:49:06 +0000 (19:49 +0200)
Use `..` instead of `...` with `rev-list`. In combination with #16282 the receiver can get the correct commit. The behaviour is now like Github.

fixes #11802

16 files changed:
modules/git/repo_commit.go
modules/git/repo_commit_test.go
modules/git/tests/repos/repo4_commitsbetween/HEAD [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/config [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/logs/HEAD [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/logs/refs/heads/main [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/objects/27/734c860ab19650d48e71f9f12d9bd194ed82ea [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1de [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/objects/78/a445db1eac62fe15e624e1137965969addf344 [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/objects/a7/8e5638b66ccfe7e1b4689d3d5684e42c97d7ca [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/objects/ad/74ceca1b8fde10c7d933bd2e56d347dddb4ab5 [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/objects/b5/d8dd0ddd9d8d752bb47b5f781f09f478316098 [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4 [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/objects/e2/3cc6a008501f1491b0480cedaef160e41cf684 [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/objects/fd/c1b615bdcff0f0658b216df0c9209e5ecb7c78 [new file with mode: 0644]
modules/git/tests/repos/repo4_commitsbetween/refs/heads/main [new file with mode: 0644]

index 815aa141e532f34f20ea1da61fddd39261073619..5b417cd77455cca3b5b451512175fb2869c80456 100644 (file)
@@ -264,14 +264,15 @@ func (repo *Repository) FilesCountBetween(startCommitID, endCommitID string) (in
        return len(strings.Split(stdout, "\n")) - 1, nil
 }
 
-// CommitsBetween returns a list that contains commits between [last, before).
+// CommitsBetween returns a list that contains commits between [before, last).
+// If before is detached (removed by reset + push) it is not included.
 func (repo *Repository) CommitsBetween(last *Commit, before *Commit) (*list.List, error) {
        var stdout []byte
        var err error
        if before == nil {
                stdout, err = NewCommand("rev-list", last.ID.String()).RunInDirBytes(repo.Path)
        } else {
-               stdout, err = NewCommand("rev-list", before.ID.String()+"..."+last.ID.String()).RunInDirBytes(repo.Path)
+               stdout, err = NewCommand("rev-list", before.ID.String()+".."+last.ID.String()).RunInDirBytes(repo.Path)
                if err != nil && strings.Contains(err.Error(), "no merge base") {
                        // future versions of git >= 2.28 are likely to return an error if before and last have become unrelated.
                        // previously it would return the results of git rev-list before last so let's try that...
@@ -284,14 +285,14 @@ func (repo *Repository) CommitsBetween(last *Commit, before *Commit) (*list.List
        return repo.parsePrettyFormatLogToList(bytes.TrimSpace(stdout))
 }
 
-// CommitsBetweenLimit returns a list that contains at most limit commits skipping the first skip commits between [last, before)
+// CommitsBetweenLimit returns a list that contains at most limit commits skipping the first skip commits between [before, last)
 func (repo *Repository) CommitsBetweenLimit(last *Commit, before *Commit, limit, skip int) (*list.List, error) {
        var stdout []byte
        var err error
        if before == nil {
                stdout, err = NewCommand("rev-list", "--max-count", strconv.Itoa(limit), "--skip", strconv.Itoa(skip), last.ID.String()).RunInDirBytes(repo.Path)
        } else {
-               stdout, err = NewCommand("rev-list", "--max-count", strconv.Itoa(limit), "--skip", strconv.Itoa(skip), before.ID.String()+"..."+last.ID.String()).RunInDirBytes(repo.Path)
+               stdout, err = NewCommand("rev-list", "--max-count", strconv.Itoa(limit), "--skip", strconv.Itoa(skip), before.ID.String()+".."+last.ID.String()).RunInDirBytes(repo.Path)
                if err != nil && strings.Contains(err.Error(), "no merge base") {
                        // future versions of git >= 2.28 are likely to return an error if before and last have become unrelated.
                        // previously it would return the results of git rev-list --max-count n before last so let's try that...
@@ -322,7 +323,7 @@ func (repo *Repository) CommitsBetweenIDs(last, before string) (*list.List, erro
 
 // CommitsCountBetween return numbers of commits between two commits
 func (repo *Repository) CommitsCountBetween(start, end string) (int64, error) {
-       count, err := CommitsCountFiles(repo.Path, []string{start + "..." + end}, []string{})
+       count, err := CommitsCountFiles(repo.Path, []string{start + ".." + end}, []string{})
        if err != nil && strings.Contains(err.Error(), "no merge base") {
                // future versions of git >= 2.28 are likely to return an error if before and last have become unrelated.
                // previously it would return the results of git rev-list before last so let's try that...
index 8f8acbdfed67ea0997b56bbfee9db7bc136c85dd..a6c27ea4d55bd69382901c51941a532c83c2b5e0 100644 (file)
@@ -78,3 +78,25 @@ func TestIsCommitInBranch(t *testing.T) {
        assert.NoError(t, err)
        assert.False(t, result)
 }
+
+func TestRepository_CommitsBetweenIDs(t *testing.T) {
+       bareRepo1Path := filepath.Join(testReposDir, "repo4_commitsbetween")
+       bareRepo1, err := OpenRepository(bareRepo1Path)
+       assert.NoError(t, err)
+       defer bareRepo1.Close()
+
+       cases := []struct {
+               OldID           string
+               NewID           string
+               ExpectedCommits int
+       }{
+               {"fdc1b615bdcff0f0658b216df0c9209e5ecb7c78", "78a445db1eac62fe15e624e1137965969addf344", 1}, //com1 -> com2
+               {"78a445db1eac62fe15e624e1137965969addf344", "fdc1b615bdcff0f0658b216df0c9209e5ecb7c78", 0}, //reset HEAD~, com2 -> com1
+               {"78a445db1eac62fe15e624e1137965969addf344", "a78e5638b66ccfe7e1b4689d3d5684e42c97d7ca", 1}, //com2 -> com2_new
+       }
+       for i, c := range cases {
+               commits, err := bareRepo1.CommitsBetweenIDs(c.NewID, c.OldID)
+               assert.NoError(t, err)
+               assert.Equal(t, c.ExpectedCommits, commits.Len(), "case %d", i)
+       }
+}
diff --git a/modules/git/tests/repos/repo4_commitsbetween/HEAD b/modules/git/tests/repos/repo4_commitsbetween/HEAD
new file mode 100644 (file)
index 0000000..b870d82
--- /dev/null
@@ -0,0 +1 @@
+ref: refs/heads/main
diff --git a/modules/git/tests/repos/repo4_commitsbetween/config b/modules/git/tests/repos/repo4_commitsbetween/config
new file mode 100644 (file)
index 0000000..d545cda
--- /dev/null
@@ -0,0 +1,7 @@
+[core]
+       repositoryformatversion = 0
+       filemode = false
+       bare = false
+       logallrefupdates = true
+       symlinks = false
+       ignorecase = true
diff --git a/modules/git/tests/repos/repo4_commitsbetween/logs/HEAD b/modules/git/tests/repos/repo4_commitsbetween/logs/HEAD
new file mode 100644 (file)
index 0000000..24cc684
--- /dev/null
@@ -0,0 +1,4 @@
+0000000000000000000000000000000000000000 fdc1b615bdcff0f0658b216df0c9209e5ecb7c78 KN4CK3R <admin@oldschoolhack.me> 1624915979 +0200    commit (initial): com1
+fdc1b615bdcff0f0658b216df0c9209e5ecb7c78 78a445db1eac62fe15e624e1137965969addf344 KN4CK3R <admin@oldschoolhack.me> 1624915993 +0200    commit: com2
+78a445db1eac62fe15e624e1137965969addf344 fdc1b615bdcff0f0658b216df0c9209e5ecb7c78 KN4CK3R <admin@oldschoolhack.me> 1624916008 +0200    reset: moving to HEAD~1
+fdc1b615bdcff0f0658b216df0c9209e5ecb7c78 a78e5638b66ccfe7e1b4689d3d5684e42c97d7ca KN4CK3R <admin@oldschoolhack.me> 1624916029 +0200    commit: com2_new
diff --git a/modules/git/tests/repos/repo4_commitsbetween/logs/refs/heads/main b/modules/git/tests/repos/repo4_commitsbetween/logs/refs/heads/main
new file mode 100644 (file)
index 0000000..24cc684
--- /dev/null
@@ -0,0 +1,4 @@
+0000000000000000000000000000000000000000 fdc1b615bdcff0f0658b216df0c9209e5ecb7c78 KN4CK3R <admin@oldschoolhack.me> 1624915979 +0200    commit (initial): com1
+fdc1b615bdcff0f0658b216df0c9209e5ecb7c78 78a445db1eac62fe15e624e1137965969addf344 KN4CK3R <admin@oldschoolhack.me> 1624915993 +0200    commit: com2
+78a445db1eac62fe15e624e1137965969addf344 fdc1b615bdcff0f0658b216df0c9209e5ecb7c78 KN4CK3R <admin@oldschoolhack.me> 1624916008 +0200    reset: moving to HEAD~1
+fdc1b615bdcff0f0658b216df0c9209e5ecb7c78 a78e5638b66ccfe7e1b4689d3d5684e42c97d7ca KN4CK3R <admin@oldschoolhack.me> 1624916029 +0200    commit: com2_new
diff --git a/modules/git/tests/repos/repo4_commitsbetween/objects/27/734c860ab19650d48e71f9f12d9bd194ed82ea b/modules/git/tests/repos/repo4_commitsbetween/objects/27/734c860ab19650d48e71f9f12d9bd194ed82ea
new file mode 100644 (file)
index 0000000..5b26f8b
Binary files /dev/null and b/modules/git/tests/repos/repo4_commitsbetween/objects/27/734c860ab19650d48e71f9f12d9bd194ed82ea differ
diff --git a/modules/git/tests/repos/repo4_commitsbetween/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1de b/modules/git/tests/repos/repo4_commitsbetween/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1de
new file mode 100644 (file)
index 0000000..b17dfe3
Binary files /dev/null and b/modules/git/tests/repos/repo4_commitsbetween/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1de differ
diff --git a/modules/git/tests/repos/repo4_commitsbetween/objects/78/a445db1eac62fe15e624e1137965969addf344 b/modules/git/tests/repos/repo4_commitsbetween/objects/78/a445db1eac62fe15e624e1137965969addf344
new file mode 100644 (file)
index 0000000..6d23de0
--- /dev/null
@@ -0,0 +1,3 @@
+x\ 1\9dÎM
+Â0\10@a×=Eö\82̤I\9a\80\88à²àÂ\e$\93\19Zl\1a©ñþþ\1cÁ\ 3|¼Gµ\94¹)\8dîmÌ\8auOä"\80·\80\82&`\ 2ã\818G\16\ 6I\9c7Ý#n¼6%\9909´)\93\b\b\93F\97\ 5(h\bl\99Ò@\83ïâ«MuSãÕ\Æþ¦\8e1\97y=×%?iªu\99\ f\85O
+\9dþDm\b½Ú\83\ 6èèwØø\1fûź{\ 3p\8bC_
\ No newline at end of file
diff --git a/modules/git/tests/repos/repo4_commitsbetween/objects/a7/8e5638b66ccfe7e1b4689d3d5684e42c97d7ca b/modules/git/tests/repos/repo4_commitsbetween/objects/a7/8e5638b66ccfe7e1b4689d3d5684e42c97d7ca
new file mode 100644 (file)
index 0000000..d5c554a
Binary files /dev/null and b/modules/git/tests/repos/repo4_commitsbetween/objects/a7/8e5638b66ccfe7e1b4689d3d5684e42c97d7ca differ
diff --git a/modules/git/tests/repos/repo4_commitsbetween/objects/ad/74ceca1b8fde10c7d933bd2e56d347dddb4ab5 b/modules/git/tests/repos/repo4_commitsbetween/objects/ad/74ceca1b8fde10c7d933bd2e56d347dddb4ab5
new file mode 100644 (file)
index 0000000..26ed785
Binary files /dev/null and b/modules/git/tests/repos/repo4_commitsbetween/objects/ad/74ceca1b8fde10c7d933bd2e56d347dddb4ab5 differ
diff --git a/modules/git/tests/repos/repo4_commitsbetween/objects/b5/d8dd0ddd9d8d752bb47b5f781f09f478316098 b/modules/git/tests/repos/repo4_commitsbetween/objects/b5/d8dd0ddd9d8d752bb47b5f781f09f478316098
new file mode 100644 (file)
index 0000000..8060b57
Binary files /dev/null and b/modules/git/tests/repos/repo4_commitsbetween/objects/b5/d8dd0ddd9d8d752bb47b5f781f09f478316098 differ
diff --git a/modules/git/tests/repos/repo4_commitsbetween/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4 b/modules/git/tests/repos/repo4_commitsbetween/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4
new file mode 100644 (file)
index 0000000..4b1baef
Binary files /dev/null and b/modules/git/tests/repos/repo4_commitsbetween/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4 differ
diff --git a/modules/git/tests/repos/repo4_commitsbetween/objects/e2/3cc6a008501f1491b0480cedaef160e41cf684 b/modules/git/tests/repos/repo4_commitsbetween/objects/e2/3cc6a008501f1491b0480cedaef160e41cf684
new file mode 100644 (file)
index 0000000..0a70530
Binary files /dev/null and b/modules/git/tests/repos/repo4_commitsbetween/objects/e2/3cc6a008501f1491b0480cedaef160e41cf684 differ
diff --git a/modules/git/tests/repos/repo4_commitsbetween/objects/fd/c1b615bdcff0f0658b216df0c9209e5ecb7c78 b/modules/git/tests/repos/repo4_commitsbetween/objects/fd/c1b615bdcff0f0658b216df0c9209e5ecb7c78
new file mode 100644 (file)
index 0000000..2e6d945
Binary files /dev/null and b/modules/git/tests/repos/repo4_commitsbetween/objects/fd/c1b615bdcff0f0658b216df0c9209e5ecb7c78 differ
diff --git a/modules/git/tests/repos/repo4_commitsbetween/refs/heads/main b/modules/git/tests/repos/repo4_commitsbetween/refs/heads/main
new file mode 100644 (file)
index 0000000..9e1b981
--- /dev/null
@@ -0,0 +1 @@
+a78e5638b66ccfe7e1b4689d3d5684e42c97d7ca