|
|
|
@ -1157,12 +1157,11 @@ func getCommitIDsFromRepo(repo *Repository, oldCommitID, newCommitID, baseBranch |
|
|
|
|
return nil, false, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
oldCommitBranch, err := oldCommit.GetBranchName() |
|
|
|
|
if err != nil { |
|
|
|
|
if err = oldCommit.LoadBranchName(); err != nil { |
|
|
|
|
return nil, false, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if oldCommitBranch == "" { |
|
|
|
|
if len(oldCommit.Branch) == 0 { |
|
|
|
|
commitIDs = make([]string, 2) |
|
|
|
|
commitIDs[0] = oldCommitID |
|
|
|
|
commitIDs[1] = newCommitID |
|
|
|
@ -1175,25 +1174,102 @@ func getCommitIDsFromRepo(repo *Repository, oldCommitID, newCommitID, baseBranch |
|
|
|
|
return nil, false, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var commits *list.List |
|
|
|
|
var ( |
|
|
|
|
commits *list.List |
|
|
|
|
commitChecks map[string]commitBranchCheckItem |
|
|
|
|
) |
|
|
|
|
commits, err = newCommit.CommitsBeforeUntil(oldCommitID) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, false, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
commitIDs = make([]string, 0, commits.Len()) |
|
|
|
|
commitChecks = make(map[string]commitBranchCheckItem) |
|
|
|
|
|
|
|
|
|
for e := commits.Front(); e != nil; e = e.Next() { |
|
|
|
|
commitChecks[e.Value.(*git.Commit).ID.String()] = commitBranchCheckItem{ |
|
|
|
|
Commit: e.Value.(*git.Commit), |
|
|
|
|
Checked: false, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err = commitBranchCheck(gitRepo, newCommit, oldCommitID, baseBranch, commitChecks); err != nil { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for e := commits.Back(); e != nil; e = e.Prev() { |
|
|
|
|
commit := e.Value.(*git.Commit) |
|
|
|
|
commitBranch, err := commit.GetBranchName() |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, false, err |
|
|
|
|
commitID := e.Value.(*git.Commit).ID.String() |
|
|
|
|
if item, ok := commitChecks[commitID]; ok && item.Checked { |
|
|
|
|
commitIDs = append(commitIDs, commitID) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type commitBranchCheckItem struct { |
|
|
|
|
Commit *git.Commit |
|
|
|
|
Checked bool |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func commitBranchCheck(gitRepo *git.Repository, startCommit *git.Commit, endCommitID, baseBranch string, commitList map[string]commitBranchCheckItem) (err error) { |
|
|
|
|
var ( |
|
|
|
|
item commitBranchCheckItem |
|
|
|
|
ok bool |
|
|
|
|
listItem *list.Element |
|
|
|
|
tmp string |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
if startCommit.ID.String() == endCommitID { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if commitBranch != baseBranch { |
|
|
|
|
commitIDs = append(commitIDs, commit.ID.String()) |
|
|
|
|
checkStack := list.New() |
|
|
|
|
checkStack.PushBack(startCommit.ID.String()) |
|
|
|
|
listItem = checkStack.Back() |
|
|
|
|
|
|
|
|
|
for listItem != nil { |
|
|
|
|
tmp = listItem.Value.(string) |
|
|
|
|
checkStack.Remove(listItem) |
|
|
|
|
|
|
|
|
|
if item, ok = commitList[tmp]; !ok { |
|
|
|
|
listItem = checkStack.Back() |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if item.Commit.ID.String() == endCommitID { |
|
|
|
|
listItem = checkStack.Back() |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err = item.Commit.LoadBranchName(); err != nil { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if item.Commit.Branch == baseBranch { |
|
|
|
|
listItem = checkStack.Back() |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if item.Checked { |
|
|
|
|
listItem = checkStack.Back() |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
item.Checked = true |
|
|
|
|
commitList[tmp] = item |
|
|
|
|
|
|
|
|
|
parentNum := item.Commit.ParentCount() |
|
|
|
|
for i := 0; i < parentNum; i++ { |
|
|
|
|
var parentCommit *git.Commit |
|
|
|
|
parentCommit, err = item.Commit.Parent(i) |
|
|
|
|
if err != nil { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
checkStack.PushBack(parentCommit.ID.String()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
listItem = checkStack.Back() |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|