summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2014-05-25 09:06:18 +0200
committerCarlos Martín Nieto <[email protected]>2014-05-25 09:12:10 +0200
commit2942e18d056d725aa847d77492a75391a670de5f (patch)
tree56f80569a13584c33731cd2b51bfa363b7a89218
parentec97cb4473ead2d9111ba4a519f3eb87eb7fdc4f (diff)
Give Object and Reference an Onwer accessor
This reduces the need to carry around a pointer to the repository as well as the objects.
-rw-r--r--object.go9
-rw-r--r--object_test.go26
-rw-r--r--reference.go8
-rw-r--r--reference_test.go18
4 files changed, 61 insertions, 0 deletions
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())