Give Object and Reference an Onwer accessor
This reduces the need to carry around a pointer to the repository as well as the objects.
This commit is contained in:
parent
ec97cb4473
commit
2942e18d05
|
@ -22,6 +22,7 @@ type Object interface {
|
|||
Free()
|
||||
Id() *Oid
|
||||
Type() ObjectType
|
||||
Owner() *Repository
|
||||
}
|
||||
|
||||
type gitObject struct {
|
||||
|
@ -55,6 +56,14 @@ func (o gitObject) Type() ObjectType {
|
|||
return ObjectType(C.git_object_type(o.ptr))
|
||||
}
|
||||
|
||||
// Owner returns a weak reference to the repository which owns this
|
||||
// object
|
||||
func (o gitObject) Owner() *Repository {
|
||||
return &Repository{
|
||||
ptr: C.git_object_owner(o.ptr),
|
||||
}
|
||||
}
|
||||
|
||||
func (o *gitObject) Free() {
|
||||
runtime.SetFinalizer(o, nil)
|
||||
C.git_object_free(o.ptr)
|
||||
|
|
|
@ -75,3 +75,29 @@ func TestObjectPoymorphism(t *testing.T) {
|
|||
t.Fatalf("Failed to parse the right revision")
|
||||
}
|
||||
}
|
||||
|
||||
func checkOwner(t *testing.T, repo *Repository, obj Object) {
|
||||
owner := obj.Owner()
|
||||
if owner == nil {
|
||||
t.Fatal("bad owner")
|
||||
}
|
||||
|
||||
if owner.ptr != repo.ptr {
|
||||
t.Fatalf("bad owner, got %v expected %v\n", owner.ptr, repo.ptr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestObjectOwner(t *testing.T) {
|
||||
repo := createTestRepo(t)
|
||||
defer os.RemoveAll(repo.Workdir())
|
||||
commitId, treeId := seedTestRepo(t, repo)
|
||||
|
||||
commit, err := repo.LookupCommit(commitId)
|
||||
checkFatal(t, err)
|
||||
|
||||
tree, err := repo.LookupTree(treeId)
|
||||
checkFatal(t, err)
|
||||
|
||||
checkOwner(t, repo, commit)
|
||||
checkOwner(t, repo, tree)
|
||||
}
|
||||
|
|
|
@ -161,6 +161,14 @@ func (v *Reference) Peel(t ObjectType) (Object, error) {
|
|||
return allocObject(cobj), nil
|
||||
}
|
||||
|
||||
// Owner returns a weak reference to the repository which owns this
|
||||
// reference.
|
||||
func (v *Reference) Owner() *Repository {
|
||||
return &Repository{
|
||||
ptr: C.git_reference_owner(v.ptr),
|
||||
}
|
||||
}
|
||||
|
||||
// Cmp compares both references, retursn 0 on equality, otherwise a
|
||||
// stable sorting.
|
||||
func (v *Reference) Cmp(ref2 *Reference) int {
|
||||
|
|
|
@ -138,6 +138,24 @@ func TestReferenceIterator(t *testing.T) {
|
|||
|
||||
}
|
||||
|
||||
func TestReferenceOwner(t *testing.T) {
|
||||
repo := createTestRepo(t)
|
||||
defer os.RemoveAll(repo.Workdir())
|
||||
commitId, _ := seedTestRepo(t, repo)
|
||||
|
||||
ref, err := repo.CreateReference("refs/heads/foo", commitId, true, nil, "")
|
||||
checkFatal(t, err)
|
||||
|
||||
owner := ref.Owner()
|
||||
if owner == nil {
|
||||
t.Fatal("nil owner")
|
||||
}
|
||||
|
||||
if owner.ptr != repo.ptr {
|
||||
t.Fatalf("bad ptr, expected %v have %v\n", repo.ptr, owner.ptr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUtil(t *testing.T) {
|
||||
repo := createTestRepo(t)
|
||||
defer os.RemoveAll(repo.Workdir())
|
||||
|
|
Loading…
Reference in New Issue