tree_entry.go

 1package repository
 2
 3import (
 4	"fmt"
 5	"github.com/MichaelMure/git-bug/util"
 6	"github.com/pkg/errors"
 7	"strings"
 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{}, errors.New("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, errors.Errorf("Unknown git object type %s %s", mode, objType)
71	}
72}