1package repository
2
3import (
4 "fmt"
5 "strings"
6)
7
8type TreeEntry struct {
9 ObjectType ObjectType
10 Hash Hash
11 Name string
12}
13
14type ObjectType int
15
16const (
17 Unknown ObjectType = iota
18 Blob
19 Tree
20)
21
22func ParseTreeEntry(line string) (TreeEntry, error) {
23 fields := strings.Fields(line)
24
25 if len(fields) < 4 {
26 return TreeEntry{}, fmt.Errorf("Invalid input to parse as a TreeEntry")
27 }
28
29 objType, err := ParseObjectType(fields[0], fields[1])
30
31 if err != nil {
32 return TreeEntry{}, err
33 }
34
35 hash := Hash(fields[2])
36 name := strings.Join(fields[3:], "")
37
38 return TreeEntry{
39 ObjectType: objType,
40 Hash: hash,
41 Name: name,
42 }, nil
43}
44
45// Format the entry as a git ls-tree compatible line
46func (entry TreeEntry) Format() string {
47 return fmt.Sprintf("%s %s\t%s\n", entry.ObjectType.Format(), entry.Hash, entry.Name)
48}
49
50func (ot ObjectType) Format() string {
51 switch ot {
52 case Blob:
53 return "100644 blob"
54 case Tree:
55 return "040000 tree"
56 default:
57 panic("Unknown git object type")
58 }
59}
60
61func ParseObjectType(mode, objType string) (ObjectType, error) {
62 switch {
63 case mode == "100644" && objType == "blob":
64 return Blob, nil
65 case mode == "040000" && objType == "tree":
66 return Tree, nil
67 default:
68 return Unknown, fmt.Errorf("Unknown git object type %s %s", mode, objType)
69 }
70}