mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	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:
		@@ -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...
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
<EFBFBD>0@a<>=E<><45>̤I<CCA4><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>$<24>Zl<1A><><EFBFBD><EFBFBD><1C>|<7C>G<EFBFBD><47><EFBFBD>)<29>îm̊uO<75>"<22><><EFBFBD><EFBFBD>&`<02><>8Gt<>I<>7<EFBFBD>#n<>6%<25>09<30>)<29>8<><38>F<EFBFBD>(hl<><6C>@<40><><EFBFBD><EFBFBD>MuS<75><53>\<5C><><EFBFBD><EFBFBD>1<EFBFBD>y=<3D>%?i<>u<EFBFBD>"<22><0F>O
 | 
			
		||||
<EFBFBD><EFBFBD>Dm<08>ڃ<06><>w<EFBFBD><77><1F>ź{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 New Issue
	
	Block a user