diff options
| author | Vicent Martà <[email protected]> | 2013-06-13 10:15:36 -0700 |
|---|---|---|
| committer | Vicent Martà <[email protected]> | 2013-06-13 10:15:36 -0700 |
| commit | 62f65d071d0671fb53aaca54a2d59a636267c2b0 (patch) | |
| tree | e03dd9af8fb0e7287abfc0597c1a325013ee0073 /repository.go | |
| parent | 01d1a5c5d5fede6f054e50a1154ff747e3879cf8 (diff) | |
| parent | 5766c4accf913bb4a98189177261e1db939397e2 (diff) | |
Merge pull request #13 from libgit2/polymorphism-take-2
My take on polymorphism
Diffstat (limited to 'repository.go')
| -rw-r--r-- | repository.go | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/repository.go b/repository.go index b9a10ad..3a44000 100644 --- a/repository.go +++ b/repository.go @@ -72,35 +72,45 @@ func (v *Repository) Index() (*Index, error) { return newIndexFromC(ptr), nil } -func (v *Repository) LookupTree(oid *Oid) (*Tree, error) { - tree := new(Tree) - ret := C.git_tree_lookup(&tree.ptr, v.ptr, oid.toC()) +func (v *Repository) lookupType(oid *Oid, t ObjectType) (Object, error) { + var ptr *C.git_object + ret := C.git_object_lookup(&ptr, v.ptr, oid.toC(), C.git_otype(t)) if ret < 0 { return nil, LastError() } - return tree, nil + return allocObject(ptr), nil } -func (v *Repository) LookupCommit(o *Oid) (*Commit, error) { - commit := new(Commit) - ecode := C.git_commit_lookup(&commit.ptr, v.ptr, o.toC()) - if ecode < 0 { - return nil, LastError() +func (v *Repository) Lookup(oid *Oid) (Object, error) { + return v.lookupType(oid, OBJ_ANY) +} + +func (v *Repository) LookupTree(oid *Oid) (*Tree, error) { + obj, err := v.lookupType(oid, OBJ_TREE) + if err != nil { + return nil, err } - return commit, nil + return obj.(*Tree), nil } -func (v *Repository) LookupBlob(o *Oid) (*Blob, error) { - blob := new(Blob) - ecode := C.git_blob_lookup(&blob.ptr, v.ptr, o.toC()) - if ecode < 0 { - return nil, LastError() +func (v *Repository) LookupCommit(oid *Oid) (*Commit, error) { + obj, err := v.lookupType(oid, OBJ_COMMIT) + if err != nil { + return nil, err + } + + return obj.(*Commit), nil +} + +func (v *Repository) LookupBlob(oid *Oid) (*Blob, error) { + obj, err := v.lookupType(oid, OBJ_BLOB) + if err != nil { + return nil, err } - runtime.SetFinalizer(blob, (*Blob).Free) - return blob, nil + return obj.(*Blob), nil } func (v *Repository) LookupReference(name string) (*Reference, error) { @@ -245,3 +255,15 @@ func (v *Repository) TreeBuilder() (*TreeBuilder, error) { return bld, nil } +func (v *Repository) RevparseSingle(spec string) (Object, error) { + cspec := C.CString(spec) + defer C.free(unsafe.Pointer(cspec)) + + var ptr *C.git_object + ecode := C.git_revparse_single(&ptr, v.ptr, cspec) + if ecode < 0 { + return nil, LastError() + } + + return allocObject(ptr), nil +} |
