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 | ||||||
		Loading…
	
		Reference in a new issue