Ok, now with shared base object

This commit is contained in:
Vicent Marti 2013-04-18 00:54:46 +02:00
parent 7292cafac2
commit 2bf17ba2f1
4 changed files with 41 additions and 66 deletions

20
blob.go
View File

@ -8,31 +8,17 @@ package git
import "C" import "C"
import ( import (
"unsafe" "unsafe"
"runtime"
) )
type Blob struct { type Blob struct {
ptr *C.git_blob gitObject
} }
func (o *Blob) Id() *Oid { func (v Blob) Size() int64 {
return newOidFromC(C.git_blob_id(o.ptr))
}
func (o *Blob) Type() ObjectType {
return OBJ_BLOB
}
func (o *Blob) Free() {
runtime.SetFinalizer(o, nil)
C.git_blob_free(o.ptr)
}
func (v *Blob) Size() int64 {
return int64(C.git_blob_rawsize(v.ptr)) return int64(C.git_blob_rawsize(v.ptr))
} }
func (v *Blob) Contents() []byte { func (v Blob) Contents() []byte {
size := C.int(C.git_blob_rawsize(v.ptr)) size := C.int(C.git_blob_rawsize(v.ptr))
buffer := unsafe.Pointer(C.git_blob_rawcontent(v.ptr)) buffer := unsafe.Pointer(C.git_blob_rawcontent(v.ptr))
return C.GoBytes(buffer, size) return C.GoBytes(buffer, size)

View File

@ -9,34 +9,20 @@ extern int _go_git_treewalk(git_tree *tree, git_treewalk_mode mode, void *ptr);
import "C" import "C"
import ( import (
"runtime"
"unsafe" "unsafe"
"time" "time"
) )
// Commit // Commit
type Commit struct { type Commit struct {
ptr *C.git_commit gitObject
} }
func (o *Commit) Id() *Oid { func (c Commit) Message() string {
return newOidFromC(C.git_commit_id(o.ptr))
}
func (o *Commit) Type() ObjectType {
return OBJ_COMMIT
}
func (o *Commit) Free() {
runtime.SetFinalizer(o, nil)
C.git_commit_free(o.ptr)
}
func (c *Commit) Message() string {
return C.GoString(C.git_commit_message(c.ptr)) return C.GoString(C.git_commit_message(c.ptr))
} }
func (c *Commit) Tree() (*Tree, error) { func (c Commit) Tree() (*Tree, error) {
var ptr *C.git_object var ptr *C.git_object
err := C.git_commit_tree(&ptr, c.ptr) err := C.git_commit_tree(&ptr, c.ptr)
@ -47,16 +33,16 @@ func (c *Commit) Tree() (*Tree, error) {
return allocObject(ptr).(*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)) 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) ptr := C.git_commit_author(c.ptr)
return newSignatureFromC(ptr) return newSignatureFromC(ptr)
} }
func (c *Commit) Committer() *Signature { func (c Commit) Committer() *Signature {
ptr := C.git_commit_committer(c.ptr) ptr := C.git_commit_committer(c.ptr)
return newSignatureFromC(ptr) return newSignatureFromC(ptr)
} }

View File

@ -25,25 +25,41 @@ type Object interface {
Type() ObjectType Type() ObjectType
} }
type gitObject struct {
ptr *C.git_object
}
func (o gitObject) Id() *Oid {
return newOidFromC(C.git_commit_id(o.ptr))
}
func (o gitObject) Type() ObjectType {
return ObjectType(C.git_object_type(o.ptr))
}
func (o gitObject) Free() {
runtime.SetFinalizer(o, nil)
C.git_commit_free(o.ptr)
}
func allocObject(cobj *C.git_object) Object { func allocObject(cobj *C.git_object) Object {
var object Object
switch ObjectType(C.git_object_type(cobj)) { switch ObjectType(C.git_object_type(cobj)) {
case OBJ_COMMIT: case OBJ_COMMIT:
object = &Commit{cobj} commit := &Commit{gitObject{cobj}}
runtime.SetFinalizer(object, (*Commit).Free) runtime.SetFinalizer(commit, (*Commit).Free)
return commit
case OBJ_TREE: case OBJ_TREE:
object = &Tree{cobj} tree := &Tree{gitObject{cobj}}
runtime.SetFinalizer(object, (*Tree).Free) runtime.SetFinalizer(tree, (*Tree).Free)
return tree
case OBJ_BLOB: case OBJ_BLOB:
object = &Blob{cobj} blob := &Blob{gitObject{cobj}}
runtime.SetFinalizer(object, (*Blob).Free) runtime.SetFinalizer(blob, (*Blob).Free)
return blob
default:
return nil
} }
return object return nil
} }

23
tree.go
View File

@ -14,20 +14,7 @@ import (
) )
type Tree struct { type Tree struct {
ptr *C.git_tree gitObject
}
func (o *Tree) Id() *Oid {
return newOidFromC(C.git_tree_id(o.ptr))
}
func (o *Tree) Type() ObjectType {
return OBJ_TREE
}
func (o *Tree) Free() {
runtime.SetFinalizer(o, nil)
C.git_tree_free(o.ptr)
} }
type TreeEntry struct { type TreeEntry struct {
@ -44,7 +31,7 @@ func newTreeEntry(entry *C.git_tree_entry) *TreeEntry {
} }
} }
func (t *Tree) EntryByName(filename string) *TreeEntry { func (t Tree) EntryByName(filename string) *TreeEntry {
cname := C.CString(filename) cname := C.CString(filename)
defer C.free(unsafe.Pointer(cname)) defer C.free(unsafe.Pointer(cname))
@ -56,7 +43,7 @@ func (t *Tree) EntryByName(filename string) *TreeEntry {
return newTreeEntry(entry) return newTreeEntry(entry)
} }
func (t *Tree) EntryByIndex(index uint64) *TreeEntry { func (t Tree) EntryByIndex(index uint64) *TreeEntry {
entry := C.git_tree_entry_byindex(t.ptr, C.size_t(index)) entry := C.git_tree_entry_byindex(t.ptr, C.size_t(index))
if entry == nil { if entry == nil {
return nil return nil
@ -65,7 +52,7 @@ func (t *Tree) EntryByIndex(index uint64) *TreeEntry {
return newTreeEntry(entry) return newTreeEntry(entry)
} }
func (t *Tree) EntryCount() uint64 { func (t Tree) EntryCount() uint64 {
num := C.git_tree_entrycount(t.ptr) num := C.git_tree_entrycount(t.ptr)
return uint64(num) return uint64(num)
} }
@ -81,7 +68,7 @@ func CallbackGitTreeWalk(_root unsafe.Pointer, _entry unsafe.Pointer, ptr unsafe
return C.int(callback(root, newTreeEntry(entry))) return C.int(callback(root, newTreeEntry(entry)))
} }
func (t *Tree) Walk(callback TreeWalkCallback) error { func (t Tree) Walk(callback TreeWalkCallback) error {
err := C._go_git_treewalk( err := C._go_git_treewalk(
t.ptr, t.ptr,
C.GIT_TREEWALK_PRE, C.GIT_TREEWALK_PRE,