Implement Repository.RevparseSingle()

Look up an object with rev-parse syntax.
This commit is contained in:
Carlos Martín Nieto 2013-03-10 02:38:14 +01:00
parent 2639455664
commit 00d9149e7d
2 changed files with 42 additions and 8 deletions

View File

@ -53,4 +53,16 @@ func TestObjectPoymorphism(t *testing.T) {
if obj.Type() != OBJ_TREE {
t.Fatalf("Type() doesn't agree with dynamic type")
}
obj, err = repo.RevparseSingle("HEAD")
checkFatal(t, err)
if obj.Type() != OBJ_COMMIT || obj.Id().String() != commit.Id().String() {
t.Fatalf("Failed to parse the right revision")
}
obj, err = repo.RevparseSingle("HEAD^{tree}")
checkFatal(t, err)
if obj.Type() != OBJ_TREE || obj.Id().String() != tree.Id().String() {
t.Fatalf("Failed to parse the right revision")
}
}

View File

@ -103,6 +103,19 @@ func (v *Repository) LookupBlob(o *Oid) (*Blob, error) {
return newBlobFromC(ptr), nil
}
func ptrToObject(ptr *C.git_object) Object {
switch int(C.git_object_type(ptr)) {
case OBJ_COMMIT:
return newCommitFromC(ptr)
case OBJ_TREE:
return newTreeFromC(ptr)
case OBJ_BLOB:
return newBlobFromC(ptr)
}
return nil
}
func (v *Repository) LookupObject(o *Oid) (Object, error) {
var ptr *C.git_object
ecode := C.git_object_lookup(&ptr, v.ptr, o.toC(), C.git_otype(OBJ_ANY))
@ -110,16 +123,25 @@ func (v *Repository) LookupObject(o *Oid) (Object, error) {
return nil, LastError()
}
switch int(C.git_object_type(ptr)) {
case OBJ_COMMIT:
return newCommitFromC(ptr), nil
case OBJ_TREE:
return newTreeFromC(ptr), nil
case OBJ_BLOB:
return newBlobFromC(ptr), nil
obj := ptrToObject(ptr)
if obj == nil {
return nil, errors.New("Unkown object type")
}
return nil, errors.New("Unkown object type")
return obj, 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 ptrToObject(ptr), nil
}
func (v *Repository) LookupReference(name string) (*Reference, error) {