tree_entry.go

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