diff options
Diffstat (limited to 'tree.go')
| -rw-r--r-- | tree.go | 70 |
1 files changed, 47 insertions, 23 deletions
@@ -13,41 +13,37 @@ 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 { - ptr *C.git_tree + gitObject } type TreeEntry struct { Name string Id *Oid - Type int + Type ObjectType + Filemode int } func newTreeEntry(entry *C.git_tree_entry) *TreeEntry { return &TreeEntry{ C.GoString(C.git_tree_entry_name(entry)), newOidFromC(C.git_tree_entry_id(entry)), - int(C.git_tree_entry_type(entry)), + ObjectType(C.git_tree_entry_type(entry)), + int(C.git_tree_entry_filemode(entry)), } } -func (t *Tree) Free() { - runtime.SetFinalizer(t, nil) - C.git_tree_free(t.ptr) -} - -func TreeLookup(repo *Repository, oid *Oid) (*Tree, error) { - tree := new(Tree) - err := C.git_tree_lookup(&tree.ptr, repo.ptr, oid.toC()) - if err < 0 { - return nil, LastError() - } - - runtime.SetFinalizer(tree, (*Tree).Free) - return tree, nil -} - -func (t *Tree) EntryByName(filename string) *TreeEntry { +func (t Tree) EntryByName(filename string) *TreeEntry { cname := C.CString(filename) defer C.free(unsafe.Pointer(cname)) @@ -59,7 +55,25 @@ func (t *Tree) EntryByName(filename string) *TreeEntry { return newTreeEntry(entry) } -func (t *Tree) EntryByIndex(index uint64) *TreeEntry { +// 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 + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + 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 { return nil @@ -68,7 +82,7 @@ func (t *Tree) EntryByIndex(index uint64) *TreeEntry { return newTreeEntry(entry) } -func (t *Tree) EntryCount() uint64 { +func (t Tree) EntryCount() uint64 { num := C.git_tree_entrycount(t.ptr) return uint64(num) } @@ -84,7 +98,10 @@ func CallbackGitTreeWalk(_root unsafe.Pointer, _entry unsafe.Pointer, ptr unsafe return C.int(callback(root, newTreeEntry(entry))) } -func (t *Tree) Walk(callback TreeWalkCallback) error { +func (t Tree) Walk(callback TreeWalkCallback) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + err := C._go_git_treewalk( t.ptr, C.GIT_TREEWALK_PRE, @@ -112,6 +129,9 @@ func (v *TreeBuilder) Insert(filename string, id *Oid, filemode int) (error) { cfilename := C.CString(filename) defer C.free(unsafe.Pointer(cfilename)) + runtime.LockOSThread() + defer runtime.UnlockOSThread() + err := C.git_treebuilder_insert(nil, v.ptr, cfilename, id.toC(), C.git_filemode_t(filemode)) if err < 0 { return LastError() @@ -122,6 +142,10 @@ func (v *TreeBuilder) Insert(filename string, id *Oid, filemode int) (error) { func (v *TreeBuilder) Write() (*Oid, error) { oid := new(Oid) + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + err := C.git_treebuilder_write(oid.toC(), v.repo.ptr, v.ptr) if err < 0 { |
