Skip to content

Commit

Permalink
HasPreviousCommit causes recursive load of commits unnecessarily (#14598
Browse files Browse the repository at this point in the history
) (#14649)

This PR improves HasPreviousCommit to prevent the automatic and recursive loading
of previous commits using git merge-base --is-ancestor and git rev-list

Fix #13684

Signed-off-by: Andrew Thornton <art27@cantab.net>

Co-authored-by: 6543 <6543@obermui.de>
  • Loading branch information
zeripath and 6543 authored Feb 14, 2021
1 parent f305cff commit d3200db
Showing 1 changed file with 25 additions and 13 deletions.
38 changes: 25 additions & 13 deletions modules/git/commit.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"bufio"
"bytes"
"container/list"
"errors"
"fmt"
"image"
"image/color"
Expand All @@ -17,6 +18,7 @@ import (
_ "image/png" // for processing png images
"io"
"net/http"
"os/exec"
"strconv"
"strings"

Expand Down Expand Up @@ -309,23 +311,33 @@ func (c *Commit) CommitsBefore() (*list.List, error) {

// HasPreviousCommit returns true if a given commitHash is contained in commit's parents
func (c *Commit) HasPreviousCommit(commitHash SHA1) (bool, error) {
for i := 0; i < c.ParentCount(); i++ {
commit, err := c.Parent(i)
if err != nil {
return false, err
}
if commit.ID == commitHash {
this := c.ID.String()
that := commitHash.String()

if this == that {
return false, nil
}

if err := CheckGitVersionConstraint(">= 1.8.0"); err == nil {
_, err := NewCommand("merge-base", "--is-ancestor", that, this).RunInDir(c.repo.Path)
if err == nil {
return true, nil
}
commitInParentCommit, err := commit.HasPreviousCommit(commitHash)
if err != nil {
return false, err
}
if commitInParentCommit {
return true, nil
var exitError *exec.ExitError
if errors.As(err, &exitError) {
if exitError.ProcessState.ExitCode() == 1 && len(exitError.Stderr) == 0 {
return false, nil
}
}
return false, err
}

result, err := NewCommand("rev-list", "--ancestry-path", "-n1", that+".."+this, "--").RunInDir(c.repo.Path)
if err != nil {
return false, err
}
return false, nil

return len(strings.TrimSpace(result)) > 0, nil
}

// CommitsBeforeLimit returns num commits before current revision
Expand Down

0 comments on commit d3200db

Please sign in to comment.