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