diff options
Diffstat (limited to 'commit.go')
| -rw-r--r-- | commit.go | 55 |
1 files changed, 38 insertions, 17 deletions
@@ -10,49 +10,65 @@ import "C" import ( "runtime" - "unsafe" "time" + "unsafe" ) // Commit type Commit struct { - ptr *C.git_commit + gitObject } -func (c *Commit) Id() *Oid { - return newOidFromC(C.git_commit_id(c.ptr)) -} - -func (c *Commit) Message() string { +func (c Commit) Message() string { return C.GoString(C.git_commit_message(c.ptr)) } -func (c *Commit) Tree() (*Tree, error) { - tree := new(Tree) +func (c Commit) Tree() (*Tree, error) { + var ptr *C.git_object + + runtime.LockOSThread() + defer runtime.UnlockOSThread() - err := C.git_commit_tree(&tree.ptr, c.ptr) + err := C.git_commit_tree(&ptr, c.ptr) if err < 0 { return nil, LastError() } - runtime.SetFinalizer(tree, (*Tree).Free) - return tree, nil + return allocObject(ptr).(*Tree), nil } -func (c *Commit) TreeId() *Oid { +func (c Commit) TreeId() *Oid { return newOidFromC(C.git_commit_tree_id(c.ptr)) } -func (c *Commit) Author() *Signature { +func (c Commit) Author() *Signature { ptr := C.git_commit_author(c.ptr) return newSignatureFromC(ptr) } -func (c *Commit) Committer() *Signature { +func (c Commit) Committer() *Signature { ptr := C.git_commit_committer(c.ptr) return newSignatureFromC(ptr) } +func (c *Commit) Parent(n uint) *Commit { + var cobj *C.git_object + ret := C.git_commit_parent(&cobj, c.ptr, C.uint(n)) + if ret != 0 { + return nil + } + + return allocObject(cobj).(*Commit) +} + +func (c *Commit) ParentId(n uint) *Oid { + return newOidFromC(C.git_commit_parent_id(c.ptr, C.uint(n))) +} + +func (c *Commit) ParentCount() uint { + return uint(C.git_commit_parentcount(c.ptr)) +} + // Signature type Signature struct { @@ -74,10 +90,15 @@ func newSignatureFromC(sig *C.git_signature) *Signature { // the offset in mintes, which is what git wants func (v *Signature) Offset() int { _, offset := v.When.Zone() - return offset/60 + return offset / 60 } -func (sig *Signature) toC() (*C.git_signature) { +func (sig *Signature) toC() *C.git_signature { + + if sig == nil { + return nil + } + var out *C.git_signature name := C.CString(sig.Name) |
