@@ -10,8 +10,6 @@ import (
10
10
"bytes"
11
11
"fmt"
12
12
"io"
13
- "strconv"
14
- "strings"
15
13
16
14
"code.gitea.io/gitea/modules/log"
17
15
)
@@ -21,71 +19,30 @@ func ParseTreeEntries(data []byte) ([]*TreeEntry, error) {
21
19
return parseTreeEntries (data , nil )
22
20
}
23
21
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
26
23
func parseTreeEntries (data []byte , ptree * Tree ) ([]* TreeEntry , error ) {
27
- var err error
28
24
entries := make ([]* TreeEntry , 0 , bytes .Count (data , []byte {'\n' })+ 1 )
29
25
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>
33
26
posEnd := bytes .IndexByte (data [pos :], '\n' )
34
27
if posEnd == - 1 {
35
28
posEnd = len (data )
36
29
} else {
37
30
posEnd += pos
38
31
}
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
- }
59
32
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 )
76
35
if err != nil {
77
- return nil , fmt . Errorf ( "invalid ls-tree output (invalid object id): %q, err: %w" , line , err )
36
+ return nil , err
78
37
}
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 (),
87
45
}
88
-
89
46
pos = posEnd + 1
90
47
entries = append (entries , entry )
91
48
}
@@ -100,7 +57,7 @@ func catBatchParseTreeEntries(objectFormat ObjectFormat, ptree *Tree, rd *bufio.
100
57
101
58
loop:
102
59
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 )
104
61
if err != nil {
105
62
if err == io .EOF {
106
63
break loop
0 commit comments