diff options
Diffstat (limited to 'tree.go')
| -rw-r--r-- | tree.go | 27 |
1 files changed, 27 insertions, 0 deletions
@@ -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 { |
