Fix issue with DiffIndex on initial commit (#11677)
Unfortunately #11614 introduced a bug whereby the initial commit of a repository could not be seen due to there being no parent commit to create a clear diff from. Here we create a diffstat from the difference between the parentless SHA and the SHA of the empty tree - a constant known to git. (With thanks to @L0veSunshine for informing me of this SHA) Thanks to @a1012112796 for initial attempt to fix. Fix #11650 Closes #11674 Signed-off-by: Andrew Thornton <art27@cantab.net> Co-Authored-By: L0veSunshine <xuan199651@gmail.com>
This commit is contained in:
parent
141d52cc0f
commit
6e4480835f
|
@ -17,6 +17,9 @@ import (
|
||||||
// EmptySHA defines empty git SHA
|
// EmptySHA defines empty git SHA
|
||||||
const EmptySHA = "0000000000000000000000000000000000000000"
|
const EmptySHA = "0000000000000000000000000000000000000000"
|
||||||
|
|
||||||
|
// EmptyTreeSHA is the SHA of an empty tree
|
||||||
|
const EmptyTreeSHA = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"
|
||||||
|
|
||||||
// SHAPattern can be used to determine if a string is an valid sha
|
// SHAPattern can be used to determine if a string is an valid sha
|
||||||
var SHAPattern = regexp.MustCompile(`^[0-9a-f]{4,40}$`)
|
var SHAPattern = regexp.MustCompile(`^[0-9a-f]{4,40}$`)
|
||||||
|
|
||||||
|
|
|
@ -664,7 +664,7 @@ func GetDiffRangeWithWhitespaceBehavior(repoPath, beforeCommitID, afterCommitID
|
||||||
ctx, cancel := context.WithCancel(git.DefaultContext)
|
ctx, cancel := context.WithCancel(git.DefaultContext)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
if len(beforeCommitID) == 0 && commit.ParentCount() == 0 {
|
if (len(beforeCommitID) == 0 || beforeCommitID == git.EmptySHA) && commit.ParentCount() == 0 {
|
||||||
cmd = exec.CommandContext(ctx, git.GitExecutable, "show", afterCommitID)
|
cmd = exec.CommandContext(ctx, git.GitExecutable, "show", afterCommitID)
|
||||||
} else {
|
} else {
|
||||||
actualBeforeCommitID := beforeCommitID
|
actualBeforeCommitID := beforeCommitID
|
||||||
|
@ -711,7 +711,11 @@ func GetDiffRangeWithWhitespaceBehavior(repoPath, beforeCommitID, afterCommitID
|
||||||
return nil, fmt.Errorf("Wait: %v", err)
|
return nil, fmt.Errorf("Wait: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(repoPath, beforeCommitID+"..."+afterCommitID)
|
shortstatArgs := []string{beforeCommitID + "..." + afterCommitID}
|
||||||
|
if len(beforeCommitID) == 0 || beforeCommitID == git.EmptySHA {
|
||||||
|
shortstatArgs = []string{git.EmptyTreeSHA, afterCommitID}
|
||||||
|
}
|
||||||
|
diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(repoPath, shortstatArgs...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue