@@ -10,8 +10,6 @@ import (
1010 "bytes"
1111 "fmt"
1212 "io"
13- "strconv"
14- "strings"
1513
1614 "code.gitea.io/gitea/modules/log"
1715)
@@ -21,71 +19,30 @@ func ParseTreeEntries(data []byte) ([]*TreeEntry, error) {
2119 return parseTreeEntries (data , nil )
2220}
2321
24- var sepSpace = []byte {' ' }
25-
22+ // parseTreeEntries FIXME this function's design is not right, it should make the caller read all data into memory
2623func parseTreeEntries (data []byte , ptree * Tree ) ([]* TreeEntry , error ) {
27- var err error
2824 entries := make ([]* TreeEntry , 0 , bytes .Count (data , []byte {'\n' })+ 1 )
2925 for pos := 0 ; pos < len (data ); {
30- // expect line to be of the form:
31- // <mode> <type> <sha> <space-padded-size>\t<filename>
32- // <mode> <type> <sha>\t<filename>
3326 posEnd := bytes .IndexByte (data [pos :], '\n' )
3427 if posEnd == - 1 {
3528 posEnd = len (data )
3629 } else {
3730 posEnd += pos
3831 }
39- line := data [pos :posEnd ]
40- posTab := bytes .IndexByte (line , '\t' )
41- if posTab == - 1 {
42- return nil , fmt .Errorf ("invalid ls-tree output (no tab): %q" , line )
43- }
44-
45- entry := new (TreeEntry )
46- entry .ptree = ptree
47-
48- entryAttrs := line [:posTab ]
49- entryName := line [posTab + 1 :]
50-
51- entryMode , entryAttrs , _ := bytes .Cut (entryAttrs , sepSpace )
52- _ /* entryType */ , entryAttrs , _ = bytes .Cut (entryAttrs , sepSpace ) // the type is not used, the mode is enough to determine the type
53- entryObjectID , entryAttrs , _ := bytes .Cut (entryAttrs , sepSpace )
54- if len (entryAttrs ) > 0 {
55- entrySize := entryAttrs // the last field is the space-padded-size
56- entry .size , _ = strconv .ParseInt (strings .TrimSpace (string (entrySize )), 10 , 64 )
57- entry .sized = true
58- }
5932
60- switch string (entryMode ) {
61- case "100644" :
62- entry .entryMode = EntryModeBlob
63- case "100755" :
64- entry .entryMode = EntryModeExec
65- case "120000" :
66- entry .entryMode = EntryModeSymlink
67- case "160000" :
68- entry .entryMode = EntryModeCommit
69- case "040000" , "040755" : // git uses 040000 for tree object, but some users may get 040755 for unknown reasons
70- entry .entryMode = EntryModeTree
71- default :
72- return nil , fmt .Errorf ("unknown type: %v" , string (entryMode ))
73- }
74-
75- entry .ID , err = NewIDFromString (string (entryObjectID ))
33+ line := data [pos :posEnd ]
34+ lsTreeLine , err := parseLsTreeLine (line )
7635 if err != nil {
77- return nil , fmt . Errorf ( "invalid ls-tree output (invalid object id): %q, err: %w" , line , err )
36+ return nil , err
7837 }
79-
80- if len (entryName ) > 0 && entryName [0 ] == '"' {
81- entry .name , err = strconv .Unquote (string (entryName ))
82- if err != nil {
83- return nil , fmt .Errorf ("invalid ls-tree output (invalid name): %q, err: %w" , line , err )
84- }
85- } else {
86- entry .name = string (entryName )
38+ entry := & TreeEntry {
39+ ptree : ptree ,
40+ ID : lsTreeLine .ID ,
41+ entryMode : lsTreeLine .EntryMode ,
42+ name : lsTreeLine .Name ,
43+ size : lsTreeLine .Size .Value (),
44+ sized : lsTreeLine .Size .Has (),
8745 }
88-
8946 pos = posEnd + 1
9047 entries = append (entries , entry )
9148 }
@@ -100,7 +57,7 @@ func catBatchParseTreeEntries(objectFormat ObjectFormat, ptree *Tree, rd *bufio.
10057
10158loop:
10259 for sz > 0 {
103- mode , fname , sha , count , err := ParseTreeLine (objectFormat , rd , modeBuf , fnameBuf , shaBuf )
60+ mode , fname , sha , count , err := ParseCatFileTreeLine (objectFormat , rd , modeBuf , fnameBuf , shaBuf )
10461 if err != nil {
10562 if err == io .EOF {
10663 break loop
0 commit comments