@@ -8,11 +8,20 @@ import (
88 "fmt"
99 "strconv"
1010 "strings"
11+
12+ "code.gitea.io/gitea/modules/optional"
1113)
1214
1315var sepSpace = []byte {' ' }
1416
15- func parseLsTreeLine (line []byte ) (* TreeEntry , error ) {
17+ type LsTreeEntry struct {
18+ ID ObjectID
19+ EntryMode EntryMode
20+ Name string
21+ Size optional.Option [int64 ]
22+ }
23+
24+ func parseLsTreeLine (line []byte ) (* LsTreeEntry , error ) {
1625 // expect line to be of the form:
1726 // <mode> <type> <sha> <space-padded-size>\t<filename>
1827 // <mode> <type> <sha>\t<filename>
@@ -23,7 +32,7 @@ func parseLsTreeLine(line []byte) (*TreeEntry, error) {
2332 return nil , fmt .Errorf ("invalid ls-tree output (no tab): %q" , line )
2433 }
2534
26- entry := new (TreeEntry )
35+ entry := new (LsTreeEntry )
2736
2837 entryAttrs := line [:posTab ]
2938 entryName := line [posTab + 1 :]
@@ -33,21 +42,21 @@ func parseLsTreeLine(line []byte) (*TreeEntry, error) {
3342 entryObjectID , entryAttrs , _ := bytes .Cut (entryAttrs , sepSpace )
3443 if len (entryAttrs ) > 0 {
3544 entrySize := entryAttrs // the last field is the space-padded-size
36- entry . size , _ = strconv .ParseInt (strings .TrimSpace (string (entrySize )), 10 , 64 )
37- entry .sized = true
45+ size , _ : = strconv .ParseInt (strings .TrimSpace (string (entrySize )), 10 , 64 )
46+ entry .Size = optional . Some ( size )
3847 }
3948
4049 switch string (entryMode ) {
4150 case "100644" :
42- entry .entryMode = EntryModeBlob
51+ entry .EntryMode = EntryModeBlob
4352 case "100755" :
44- entry .entryMode = EntryModeExec
53+ entry .EntryMode = EntryModeExec
4554 case "120000" :
46- entry .entryMode = EntryModeSymlink
55+ entry .EntryMode = EntryModeSymlink
4756 case "160000" :
48- entry .entryMode = EntryModeCommit
57+ entry .EntryMode = EntryModeCommit
4958 case "040000" , "040755" : // git uses 040000 for tree object, but some users may get 040755 for unknown reasons
50- entry .entryMode = EntryModeTree
59+ entry .EntryMode = EntryModeTree
5160 default :
5261 return nil , fmt .Errorf ("unknown type: %v" , string (entryMode ))
5362 }
@@ -58,12 +67,12 @@ func parseLsTreeLine(line []byte) (*TreeEntry, error) {
5867 }
5968
6069 if len (entryName ) > 0 && entryName [0 ] == '"' {
61- entry .name , err = strconv .Unquote (string (entryName ))
70+ entry .Name , err = strconv .Unquote (string (entryName ))
6271 if err != nil {
6372 return nil , fmt .Errorf ("invalid ls-tree output (invalid name): %q, err: %w" , line , err )
6473 }
6574 } else {
66- entry .name = string (entryName )
75+ entry .Name = string (entryName )
6776 }
6877 return entry , nil
6978}
0 commit comments