From 7e4c35f1acffff751fe8ab2667ab2c6e9c88929a Mon Sep 17 00:00:00 2001 From: Sameer Puri <11097096+sameer@users.noreply.github.com> Date: Sat, 5 Jan 2019 19:30:11 -0500 Subject: [PATCH] Make Resolve(nil) return map of top-level objects, fixes #20 --- commit.go | 49 +++++++++++++++++++++++++++++++++++++++++++------ git_test.go | 21 +++++++++++++++++++++ tag.go | 9 +++++++++ tree.go | 4 ++++ 4 files changed, 77 insertions(+), 6 deletions(-) diff --git a/commit.go b/commit.go index 93abd86..ce0e790 100644 --- a/commit.go +++ b/commit.go @@ -42,15 +42,11 @@ type PersonInfo struct { } func (pi *PersonInfo) MarshalJSON() ([]byte, error) { - date, err := pi.date() + obj, _, err := pi.resolve(nil) if err != nil { return nil, err } - return json.Marshal(map[string]interface{}{ - "name": pi.Name, - "email": pi.Email, - "date": *date, - }) + return json.Marshal(obj) } func (pi *PersonInfo) String() string { @@ -76,6 +72,18 @@ func (pi *PersonInfo) tree(name string, depth int) []string { } func (pi *PersonInfo) resolve(p []string) (interface{}, []string, error) { + if p == nil { + date, err := pi.date() + if err != nil { + return nil, nil, err + } + return map[string]interface{}{ + "name": pi.Name, + "email": pi.Email, + "date": date.Format(time.RFC3339), + }, nil, nil + } + switch p[0] { case "name": return pi.Name, p[1:], nil @@ -181,6 +189,23 @@ func (c *Commit) RawData() []byte { } func (c *Commit) Resolve(path []string) (interface{}, []string, error) { + if path == nil { + obj := map[string]interface{}{ + "parents": c.Parents, + "author": c.Author, + "committer": c.Committer, + "message": c.Message, + "tree": &node.Link{Cid: c.GitTree}, + "mergetag": c.MergeTag, + } + + if c.Sig != nil { + obj["signature"] = c.Sig.Text + } + + return obj, nil, nil + } + if len(path) == 0 { return nil, nil, fmt.Errorf("zero length path") } @@ -212,6 +237,9 @@ func (c *Commit) Resolve(path []string) (interface{}, []string, error) { } return c.Committer.resolve(path[1:]) case "signature": + if c.Sig == nil { + return nil, nil, errors.New("no signature") + } return c.Sig.Text, path[1:], nil case "message": return c.Message, path[1:], nil @@ -284,6 +312,15 @@ func (c *Commit) GitSha() []byte { } func (t *MergeTag) resolve(path []string) (interface{}, []string, error) { + if path == nil { + return map[string]interface{}{ + "object": &node.Link{Cid: t.Object}, + "tag": t.Tag, + "tagger": t.Tagger, + "text": t.Text, + "type": t.Type, + }, nil, nil + } if len(path) == 0 { return nil, nil, fmt.Errorf("zero length path") } diff --git a/git_test.go b/git_test.go index 191b788..9160028 100644 --- a/git_test.go +++ b/git_test.go @@ -197,6 +197,9 @@ func testNode(t *testing.T, nd node.Node) error { if !ok { t.Fatal("Invalid mergetag") } + obj, _, err := tag.resolve(nil) + assert(t, err == nil) + assert(t, obj != nil) ttype, rest, err := commit.Resolve([]string{"mergetag", "0", "type"}) assert(t, err == nil) @@ -224,6 +227,10 @@ func testNode(t *testing.T, nd node.Node) error { assert(t, text.(string) == tag.Text) } + obj, _, err := commit.Resolve(nil) + assert(t, err == nil) + assert(t, obj != nil) + case "[git tag object]": tag, ok := nd.(*Tag) if !ok { @@ -235,12 +242,16 @@ func testNode(t *testing.T, nd node.Node) error { assert(t, tag.Object.Defined()) assert(t, tag.Loggable()["type"] == "git_tag") assert(t, tag.Tree("", -1) != nil) + var obj interface{} obj, rest, err := tag.ResolveLink([]string{"object", "aoeu"}) assert(t, err == nil) assert(t, obj != nil) assert(t, rest != nil) assert(t, len(rest) == 1) assert(t, rest[0] == "aoeu") + obj, _, err = tag.Resolve(nil) + assert(t, err == nil) + assert(t, obj != nil) case "[git tree object]": tree, ok := nd.(*Tree) if !ok { @@ -250,6 +261,9 @@ func testNode(t *testing.T, nd node.Node) error { assert(t, reflect.DeepEqual(tree.RawData(), tree.RawData())) assert(t, tree.entries != nil) assert(t, tree.Tree("", 0) == nil) + obj, _, err := tree.Resolve(nil) + assert(t, err == nil) + assert(t, reflect.DeepEqual(obj, tree.entries)) } return nil } @@ -348,6 +362,13 @@ func TestParsePersonInfo(t *testing.T) { date, _, err := pi.resolve([]string{"date"}) assert(t, string(piJSON) == `{"date":"2018-12-30T17:34:12+01:00","email":"magik6k@users.noreply.github.com","name":"Łukasz Magiera"}`) assert(t, date == "2018-12-30T17:34:12+01:00") + obj, _, err := pi.resolve(nil) + assert(t, err == nil) + assert(t, reflect.DeepEqual(obj, map[string]interface{}{ + "date": "2018-12-30T17:34:12+01:00", + "email": "magik6k@users.noreply.github.com", + "name": "Łukasz Magiera", + })) pi, err = parsePersonInfo([]byte("prefix Sameer 1545162499 -0500")) piJSON, err = pi.MarshalJSON() diff --git a/tag.go b/tag.go index 25245ac..bd52e0a 100644 --- a/tag.go +++ b/tag.go @@ -64,6 +64,15 @@ func (t *Tag) RawData() []byte { } func (t *Tag) Resolve(path []string) (interface{}, []string, error) { + if path == nil { + return map[string]interface{}{ + "object": &node.Link{Cid: t.Object}, + "type": t.Type, + "tagger": t.Tagger, + "message": t.Message, + "tag": t.Tag, + }, nil, nil + } if len(path) == 0 { return nil, nil, fmt.Errorf("zero length path") } diff --git a/tree.go b/tree.go index 5ce354a..5c5a5f0 100644 --- a/tree.go +++ b/tree.go @@ -112,6 +112,10 @@ func (t *Tree) RawData() []byte { } func (t *Tree) Resolve(p []string) (interface{}, []string, error) { + if p == nil { + return t.entries, nil, nil + } + e, ok := t.entries[p[0]] if !ok { return nil, nil, errors.New("no such link")