diff options
| author | Carlos Martín Nieto <[email protected]> | 2015-07-29 01:53:10 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <[email protected]> | 2015-07-29 01:53:10 +0200 |
| commit | a2e4e9259be7fcd4019e85accc7f25f130c27d3c (patch) | |
| tree | ada7d9570cccdeee8bc64cab435ab77b9094a6b7 | |
| parent | b4ba35d85c4d2967c7e70350c98cb944de96d51d (diff) | |
| parent | 64c160f6f2300fc675453761471dc8d4726756e0 (diff) | |
Merge pull request #230 from clns/tree-entry-by-id
Find tree entry by id
| -rw-r--r-- | tree.go | 18 | ||||
| -rw-r--r-- | tree_test.go | 22 |
2 files changed, 40 insertions, 0 deletions
@@ -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) + } +} |
