diff options
Diffstat (limited to 'modules/git/parse_gogit.go')
-rw-r--r-- | modules/git/parse_gogit.go | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/modules/git/parse_gogit.go b/modules/git/parse_gogit.go index 434fb4160f..a50ebec3dd 100644 --- a/modules/git/parse_gogit.go +++ b/modules/git/parse_gogit.go @@ -10,12 +10,13 @@ import ( "bytes" "fmt" "strconv" + "strings" "github.com/go-git/go-git/v5/plumbing/filemode" "github.com/go-git/go-git/v5/plumbing/object" ) -// ParseTreeEntries parses the output of a `git ls-tree` command. +// ParseTreeEntries parses the output of a `git ls-tree -l` command. func ParseTreeEntries(data []byte) ([]*TreeEntry, error) { return parseTreeEntries(data, nil) } @@ -23,7 +24,7 @@ func ParseTreeEntries(data []byte) ([]*TreeEntry, error) { func parseTreeEntries(data []byte, ptree *Tree) ([]*TreeEntry, error) { entries := make([]*TreeEntry, 0, 10) for pos := 0; pos < len(data); { - // expect line to be of the form "<mode> <type> <sha>\t<filename>" + // expect line to be of the form "<mode> <type> <sha> <space-padded-size>\t<filename>" entry := new(TreeEntry) entry.gogitTreeEntry = &object.TreeEntry{} entry.ptree = ptree @@ -61,7 +62,16 @@ func parseTreeEntries(data []byte, ptree *Tree) ([]*TreeEntry, error) { entry.gogitTreeEntry.Hash = id pos += 41 // skip over sha and trailing space - end := pos + bytes.IndexByte(data[pos:], '\n') + end := pos + bytes.IndexByte(data[pos:], '\t') + if end < pos { + return nil, fmt.Errorf("Invalid ls-tree -l output: %s", string(data)) + } + entry.size, _ = strconv.ParseInt(strings.TrimSpace(string(data[pos:end])), 10, 64) + entry.sized = true + + pos = end + 1 + + end = pos + bytes.IndexByte(data[pos:], '\n') if end < pos { return nil, fmt.Errorf("Invalid ls-tree output: %s", string(data)) } |