summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCalin Seciu <[email protected]>2015-07-24 19:46:57 +0300
committerCalin Seciu <[email protected]>2015-07-24 19:52:51 +0300
commit64c160f6f2300fc675453761471dc8d4726756e0 (patch)
treeada7d9570cccdeee8bc64cab435ab77b9094a6b7
parentb4ba35d85c4d2967c7e70350c98cb944de96d51d (diff)
Find tree entry by id
Add support for 'git_tree_entry_byid'.
-rw-r--r--tree.go18
-rw-r--r--tree_test.go22
2 files changed, 40 insertions, 0 deletions
diff --git a/tree.go b/tree.go
index aad2c8d..f543c11 100644
--- a/tree.go
+++ b/tree.go
@@ -55,6 +55,24 @@ func (t Tree) EntryByName(filename string) *TreeEntry {
return newTreeEntry(entry)
}
+// EntryById performs a lookup for a tree entry with the given SHA value.
+//
+// It returns a *TreeEntry that is owned by the Tree. You don't have to
+// free it, but you must not use it after the Tree is freed.
+//
+// Warning: this must examine every entry in the tree, so it is not fast.
+func (t Tree) EntryById(id *Oid) *TreeEntry {
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ entry := C.git_tree_entry_byid(t.cast_ptr, id.toC())
+ if entry == nil {
+ return nil
+ }
+
+ return newTreeEntry(entry)
+}
+
// EntryByPath looks up an entry by its full path, recursing into
// deeper trees if necessary (i.e. if there are slashes in the path)
func (t Tree) EntryByPath(path string) (*TreeEntry, error) {
diff --git a/tree_test.go b/tree_test.go
new file mode 100644
index 0000000..4c6a4ed
--- /dev/null
+++ b/tree_test.go
@@ -0,0 +1,22 @@
+package git
+
+import "testing"
+
+func TestTreeEntryById(t *testing.T) {
+ repo := createTestRepo(t)
+ defer cleanupTestRepo(t, repo)
+
+ _, treeID := seedTestRepo(t, repo)
+
+ tree, err := repo.LookupTree(treeID)
+ checkFatal(t, err)
+
+ id, err := NewOid("257cc5642cb1a054f08cc83f2d943e56fd3ebe99")
+ checkFatal(t, err)
+
+ entry := tree.EntryById(id)
+
+ if entry == nil {
+ t.Fatalf("entry id %v was not found", id)
+ }
+}