diff --git a/pkg/commands/git_commands/reflog_commit_loader.go b/pkg/commands/git_commands/reflog_commit_loader.go index 5033b03c1..1160839d6 100644 --- a/pkg/commands/git_commands/reflog_commit_loader.go +++ b/pkg/commands/git_commands/reflog_commit_loader.go @@ -35,34 +35,19 @@ func (self *ReflogCommitLoader) GetReflogCommits(lastReflogCommit *models.Commit ToArgv() cmdObj := self.cmd.New(cmdArgs).DontLog() + onlyObtainedNewReflogCommits := false err := cmdObj.RunAndProcessLines(func(line string) (bool, error) { - fields := strings.SplitN(line, "\x00", 4) - if len(fields) <= 3 { + commit, ok := self.parseLine(line) + if !ok { return false, nil } - unixTimestamp, _ := strconv.Atoi(fields[1]) - - parentHashes := fields[3] - parents := []string{} - if len(parentHashes) > 0 { - parents = strings.Split(parentHashes, " ") - } - - commit := &models.Commit{ - Sha: fields[0], - Name: fields[2], - UnixTimestamp: int64(unixTimestamp), - Status: models.StatusReflog, - Parents: parents, - } - // note that the unix timestamp here is the timestamp of the COMMIT, not the reflog entry itself, // so two consecutive reflog entries may have both the same SHA and therefore same timestamp. // We use the reflog message to disambiguate, and fingers crossed that we never see the same of those // twice in a row. Reason being that it would mean we'd be erroneously exiting early. - if lastReflogCommit != nil && commit.Sha == lastReflogCommit.Sha && commit.UnixTimestamp == lastReflogCommit.UnixTimestamp && commit.Name == lastReflogCommit.Name { + if lastReflogCommit != nil && self.sameReflogCommit(commit, lastReflogCommit) { onlyObtainedNewReflogCommits = true // after this point we already have these reflogs loaded so we'll simply return the new ones return true, nil @@ -77,3 +62,30 @@ func (self *ReflogCommitLoader) GetReflogCommits(lastReflogCommit *models.Commit return commits, onlyObtainedNewReflogCommits, nil } + +func (self *ReflogCommitLoader) sameReflogCommit(a *models.Commit, b *models.Commit) bool { + return a.Sha == b.Sha && a.UnixTimestamp == b.UnixTimestamp && a.Name == b.Name +} + +func (self *ReflogCommitLoader) parseLine(line string) (*models.Commit, bool) { + fields := strings.SplitN(line, "\x00", 4) + if len(fields) <= 3 { + return nil, false + } + + unixTimestamp, _ := strconv.Atoi(fields[1]) + + parentHashes := fields[3] + parents := []string{} + if len(parentHashes) > 0 { + parents = strings.Split(parentHashes, " ") + } + + return &models.Commit{ + Sha: fields[0], + Name: fields[2], + UnixTimestamp: int64(unixTimestamp), + Status: models.StatusReflog, + Parents: parents, + }, true +}