diff --git a/object.go b/object.go index 101d15e..9241ae2 100644 --- a/object.go +++ b/object.go @@ -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) diff --git a/object_test.go b/object_test.go index 85daf78..f525351 100644 --- a/object_test.go +++ b/object_test.go @@ -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) +} diff --git a/reference.go b/reference.go index 8c8b282..9a2a8e5 100644 --- a/reference.go +++ b/reference.go @@ -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 { diff --git a/reference_test.go b/reference_test.go index cb7a5fc..c7d52fb 100644 --- a/reference_test.go +++ b/reference_test.go @@ -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())