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:
Carlos Martín Nieto 2014-05-25 09:06:18 +02:00
parent ec97cb4473
commit 2942e18d05
4 changed files with 61 additions and 0 deletions

View File

@ -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)

View File

@ -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)
}

View File

@ -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 {

View File

@ -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())