tree_entry.go

 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}