summaryrefslogtreecommitdiff
path: root/tree.go
diff options
context:
space:
mode:
Diffstat (limited to 'tree.go')
-rw-r--r--tree.go27
1 files changed, 27 insertions, 0 deletions
diff --git a/tree.go b/tree.go
index 9a9fd63..3abd31c 100644
--- a/tree.go
+++ b/tree.go
@@ -13,6 +13,16 @@ import (
"unsafe"
)
+type Filemode int
+const (
+ FilemodeNew Filemode = C.GIT_FILEMODE_NEW
+ FilemodeTree = C.GIT_FILEMODE_TREE
+ FilemodeBlob = C.GIT_FILEMODE_BLOB
+ FilemodeBlobExecutable = C.GIT_FILEMODE_BLOB_EXECUTABLE
+ FilemodeLink = C.GIT_FILEMODE_LINK
+ FilemodeCommit = C.GIT_FILEMODE_COMMIT
+)
+
type Tree struct {
gitObject
}
@@ -21,6 +31,7 @@ type TreeEntry struct {
Name string
Id *Oid
Type ObjectType
+ Filemode int
}
func newTreeEntry(entry *C.git_tree_entry) *TreeEntry {
@@ -28,6 +39,7 @@ func newTreeEntry(entry *C.git_tree_entry) *TreeEntry {
C.GoString(C.git_tree_entry_name(entry)),
newOidFromC(C.git_tree_entry_id(entry)),
ObjectType(C.git_tree_entry_type(entry)),
+ int(C.git_tree_entry_filemode(entry)),
}
}
@@ -43,6 +55,21 @@ func (t Tree) EntryByName(filename string) *TreeEntry {
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) {
+ cpath := C.CString(path)
+ defer C.free(unsafe.Pointer(cpath))
+ var entry *C.git_tree_entry
+
+ ret := C.git_tree_entry_bypath(&entry, t.ptr, cpath)
+ if ret < 0 {
+ return nil, LastError()
+ }
+
+ return newTreeEntry(entry), nil
+}
+
func (t Tree) EntryByIndex(index uint64) *TreeEntry {
entry := C.git_tree_entry_byindex(t.ptr, C.size_t(index))
if entry == nil {