-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
505 additions
and
384 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -106,11 +106,12 @@ func (d *Diff) finalize() error { | |
|
||
// Commit contains commit header info and diffs. | ||
type Commit struct { | ||
Hash string | ||
Author string | ||
Date time.Time | ||
Message strings.Builder | ||
Size int // in bytes | ||
SourceRef string | ||
Hash string | ||
Author string | ||
Date time.Time | ||
Message strings.Builder | ||
Size int // in bytes | ||
|
||
hasDiffs bool | ||
} | ||
|
@@ -209,13 +210,22 @@ func NewParser(options ...Option) *Parser { | |
// RepoPath parses the output of the `git log` command for the `source` path. | ||
// The Diff chan will return diffs in the order they are parsed from the log. | ||
func (c *Parser) RepoPath(ctx context.Context, source string, head string, abbreviatedLog bool, excludedGlobs []string, isBare bool) (chan *Diff, error) { | ||
args := []string{"-C", source, "log", "-p", "--full-history", "--date=format:%a %b %d %H:%M:%S %Y %z"} | ||
args := []string{ | ||
"-C", source, | ||
"log", | ||
"-p", // https://git-scm.com/docs/git-log#Documentation/git-log.txt---patch | ||
"--full-history", // https://git-scm.com/docs/git-log#Documentation/git-log.txt---full-history | ||
"--date=format:%a %b %d %H:%M:%S %Y %z", // https://git-scm.com/docs/git-log#Documentation/git-log.txt---dateltformatgt | ||
"--source", // https://git-scm.com/docs/git-log#Documentation/git-log.txt---source | ||
} | ||
if abbreviatedLog { | ||
// https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203 | ||
args = append(args, "--diff-filter=AM") | ||
} | ||
if head != "" { | ||
args = append(args, head) | ||
} else { | ||
// https://git-scm.com/docs/git-log#Documentation/git-log.txt---all | ||
args = append(args, "--all") | ||
} | ||
for _, glob := range excludedGlobs { | ||
|
@@ -302,10 +312,9 @@ func (c *Parser) FromReader(ctx context.Context, stdOut io.Reader, diffChan chan | |
outReader := bufio.NewReader(stdOut) | ||
var ( | ||
currentCommit *Commit | ||
|
||
totalLogSize int | ||
totalLogSize int | ||
latestState = Initial | ||
) | ||
var latestState = Initial | ||
|
||
diff := func(c *Commit, opts ...diffOption) *Diff { | ||
opts = append(opts, withCustomContentWriter(bufferwriter.New(ctx))) | ||
|
@@ -365,10 +374,18 @@ func (c *Parser) FromReader(ctx context.Context, stdOut io.Reader, diffChan chan | |
// Create a new currentDiff and currentCommit | ||
currentCommit = &Commit{Message: strings.Builder{}} | ||
currentDiff = diff(currentCommit) | ||
// Check that the commit line contains a hash and set it. | ||
if len(line) >= 47 { | ||
currentCommit.Hash = string(line[7:47]) | ||
|
||
hash, ref := parseCommitLine(line) | ||
if hash == nil || ref == nil { | ||
ctx.Logger().Error( | ||
fmt.Errorf(`expected line to match 'commit <hash> <ref>', got "%s"`, line), | ||
"Failed to parse CommitLine") | ||
latestState = ParseFailure | ||
continue | ||
} | ||
|
||
currentCommit.Hash = string(hash) | ||
currentCommit.SourceRef = string(ref) | ||
case isMergeLine(isStaged, latestState, line): | ||
latestState = MergeLine | ||
case isAuthorLine(isStaged, latestState, line): | ||
|
@@ -566,6 +583,22 @@ func isCommitLine(isStaged bool, latestState ParseState, line []byte) bool { | |
return false | ||
} | ||
|
||
func parseCommitLine(line []byte) (hash []byte, ref []byte) { | ||
// Check that the commit line contains a 40-character hash and set it. | ||
// `commit e5575cd6f2d21d3a1a604287c7bf4a7eab2266e0\n` | ||
if len(line) >= 47 { | ||
hash = line[7:47] | ||
} | ||
|
||
// Check if the commit line includes branch references. | ||
// `commit 2dbbb28727c7c2954438666dafba57bb8c714d3b refs/heads/fix/github-enterprise-gist\n` | ||
if len(line) > 48 { | ||
ref = line[48 : len(line)-1] | ||
} | ||
|
||
return | ||
} | ||
|
||
// Author: Bill Rich <[email protected]> | ||
func isAuthorLine(isStaged bool, latestState ParseState, line []byte) bool { | ||
if isStaged || !(latestState == CommitLine || latestState == MergeLine) { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.