Fix webhook commits wrong hash on HEAD reset (#16283)
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
This commit is contained in:
parent
66bf74d1b9
commit
7d70a6eff8
16 changed files with 48 additions and 5 deletions
|
@ -264,14 +264,15 @@ func (repo *Repository) FilesCountBetween(startCommitID, endCommitID string) (in
|
||||||
return len(strings.Split(stdout, "\n")) - 1, nil
|
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) {
|
func (repo *Repository) CommitsBetween(last *Commit, before *Commit) (*list.List, error) {
|
||||||
var stdout []byte
|
var stdout []byte
|
||||||
var err error
|
var err error
|
||||||
if before == nil {
|
if before == nil {
|
||||||
stdout, err = NewCommand("rev-list", last.ID.String()).RunInDirBytes(repo.Path)
|
stdout, err = NewCommand("rev-list", last.ID.String()).RunInDirBytes(repo.Path)
|
||||||
} else {
|
} 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") {
|
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.
|
// 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...
|
// 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))
|
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) {
|
func (repo *Repository) CommitsBetweenLimit(last *Commit, before *Commit, limit, skip int) (*list.List, error) {
|
||||||
var stdout []byte
|
var stdout []byte
|
||||||
var err error
|
var err error
|
||||||
if before == nil {
|
if before == nil {
|
||||||
stdout, err = NewCommand("rev-list", "--max-count", strconv.Itoa(limit), "--skip", strconv.Itoa(skip), last.ID.String()).RunInDirBytes(repo.Path)
|
stdout, err = NewCommand("rev-list", "--max-count", strconv.Itoa(limit), "--skip", strconv.Itoa(skip), last.ID.String()).RunInDirBytes(repo.Path)
|
||||||
} else {
|
} 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") {
|
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.
|
// 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...
|
// 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
|
// CommitsCountBetween return numbers of commits between two commits
|
||||||
func (repo *Repository) CommitsCountBetween(start, end string) (int64, error) {
|
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") {
|
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.
|
// 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...
|
// previously it would return the results of git rev-list before last so let's try that...
|
||||||
|
|
|
@ -78,3 +78,25 @@ func TestIsCommitInBranch(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.False(t, result)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
1
modules/git/tests/repos/repo4_commitsbetween/HEAD
Normal file
1
modules/git/tests/repos/repo4_commitsbetween/HEAD
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ref: refs/heads/main
|
7
modules/git/tests/repos/repo4_commitsbetween/config
Normal file
7
modules/git/tests/repos/repo4_commitsbetween/config
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
[core]
|
||||||
|
repositoryformatversion = 0
|
||||||
|
filemode = false
|
||||||
|
bare = false
|
||||||
|
logallrefupdates = true
|
||||||
|
symlinks = false
|
||||||
|
ignorecase = true
|
4
modules/git/tests/repos/repo4_commitsbetween/logs/HEAD
Normal file
4
modules/git/tests/repos/repo4_commitsbetween/logs/HEAD
Normal file
|
@ -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
|
|
@ -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
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
x<01>ÎM
|
||||||
|
Â0@a×=Eö‚̤Iš€ˆà²àÂ$“Zl©ñþþÁ|¼Gµ”¹)<29>îmÌŠuOä"€·€‚&`ã<>8GtÀIœ7Ý#n¼6%™09´)“8ë“F—(hl™Ò@ƒïâ«MuSãÕ\Æþ¦Ž1—y=×%?iªu™"Ý…O
|
||||||
|
<EFBFBD>þDm½ÚƒèèwØøûź{p‹C_
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
a78e5638b66ccfe7e1b4689d3d5684e42c97d7ca
|
Reference in a new issue