aboutsummaryrefslogtreecommitdiffstats
path: root/repository/tree_entry.go
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2018-07-14 22:11:38 +0200
committerMichael Muré <batolettre@gmail.com>2018-07-14 22:11:38 +0200
commitf8e07748743f7e66ff1adf101a797cb1bedfc140 (patch)
treeb9754c9402c2e4f0a4236c6540431e9ee8666227 /repository/tree_entry.go
parent499669c144218704c0942860564325d76adb13e2 (diff)
downloadgit-bug-f8e07748743f7e66ff1adf101a797cb1bedfc140.tar.gz
add TreeEntry to manage the talking with git mktree and git ls-tree
Diffstat (limited to 'repository/tree_entry.go')
-rw-r--r--repository/tree_entry.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/repository/tree_entry.go b/repository/tree_entry.go
new file mode 100644
index 00000000..486c4a74
--- /dev/null
+++ b/repository/tree_entry.go
@@ -0,0 +1,72 @@
+package repository
+
+import (
+ "fmt"
+ "github.com/MichaelMure/git-bug/util"
+ "github.com/pkg/errors"
+ "strings"
+)
+
+type TreeEntry struct {
+ ObjectType ObjectType
+ Hash util.Hash
+ Name string
+}
+
+type ObjectType int
+
+const (
+ Unknown ObjectType = iota
+ Blob
+ Tree
+)
+
+func ParseTreeEntry(line string) (TreeEntry, error) {
+ fields := strings.Fields(line)
+
+ if len(fields) < 4 {
+ return TreeEntry{}, errors.New("Invalid input to parse as a TreeEntry")
+ }
+
+ objType, err := ParseObjectType(fields[0], fields[1])
+
+ if err != nil {
+ return TreeEntry{}, err
+ }
+
+ hash := util.Hash(fields[2])
+ name := strings.Join(fields[3:], "")
+
+ return TreeEntry{
+ ObjectType: objType,
+ Hash: hash,
+ Name: name,
+ }, nil
+}
+
+// Format the entry as a git ls-tree compatible line
+func (entry TreeEntry) Format() string {
+ return fmt.Sprintf("%s %s\t%s\n", entry.ObjectType.Format(), entry.Hash, entry.Name)
+}
+
+func (ot ObjectType) Format() string {
+ switch ot {
+ case Blob:
+ return "100644 blob"
+ case Tree:
+ return "040000 tree"
+ default:
+ panic("Unknown git object type")
+ }
+}
+
+func ParseObjectType(mode, objType string) (ObjectType, error) {
+ switch {
+ case mode == "100644" && objType == "blob":
+ return Blob, nil
+ case mode == "040000" && objType == "tree":
+ return Tree, nil
+ default:
+ return Unknown, errors.Errorf("Unknown git object type %s %s", mode, objType)
+ }
+}