Implement Repository.RevparseSingle()
Look up an object with rev-parse syntax.
This commit is contained in:
parent
2639455664
commit
00d9149e7d
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue