From 7292cafac2d2c4462f3bc0b850e702d6d87f629e Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Tue, 16 Apr 2013 23:18:35 +0200 Subject: [PATCH] Add @carlosmn's tests --- git_test.go | 47 ++++++++++++++++++++++++++++++++ index_test.go | 15 ----------- object_test.go | 68 +++++++++++++++++++++++++++++++++++++++++++++++ reference_test.go | 24 ++--------------- repository.go | 24 ++++++++++++++--- 5 files changed, 137 insertions(+), 41 deletions(-) create mode 100644 git_test.go create mode 100644 object_test.go diff --git a/git_test.go b/git_test.go new file mode 100644 index 00000000..52aea1df --- /dev/null +++ b/git_test.go @@ -0,0 +1,47 @@ +package git + +import ( + "testing" + "io/ioutil" + "time" +) + +func createTestRepo(t *testing.T) *Repository { + // figure out where we can create the test repo + path, err := ioutil.TempDir("", "git2go") + checkFatal(t, err) + repo, err := InitRepository(path, false) + checkFatal(t, err) + + tmpfile := "README" + err = ioutil.WriteFile(path + "/" + tmpfile, []byte("foo\n"), 0644) + checkFatal(t, err) + + return repo +} + +func seedTestRepo(t *testing.T, repo *Repository) (*Oid, *Oid) { + loc, err := time.LoadLocation("Europe/Berlin") + checkFatal(t, err) + sig := &Signature{ + Name: "Rand Om Hacker", + Email: "random@hacker.com", + When: time.Date(2013, 03, 06, 14, 30, 0, 0, loc), + } + + idx, err := repo.Index() + checkFatal(t, err) + err = idx.AddByPath("README") + checkFatal(t, err) + treeId, err := idx.WriteTree() + checkFatal(t, err) + + message := "This is a commit\n" + tree, err := repo.LookupTree(treeId) + checkFatal(t, err) + commitId, err := repo.CreateCommit("HEAD", sig, sig, message, tree) + checkFatal(t, err) + + return commitId, treeId +} + diff --git a/index_test.go b/index_test.go index fe6fb87f..9828d0fc 100644 --- a/index_test.go +++ b/index_test.go @@ -4,23 +4,8 @@ import ( "os" "runtime" "testing" - "io/ioutil" ) -func createTestRepo(t *testing.T) *Repository { - // figure out where we can create the test repo - path, err := ioutil.TempDir("", "git2go") - checkFatal(t, err) - repo, err := InitRepository(path, false) - checkFatal(t, err) - - tmpfile := "README" - err = ioutil.WriteFile(path + "/" + tmpfile, []byte("foo\n"), 0644) - checkFatal(t, err) - - return repo -} - func TestCreateRepoAndStage(t *testing.T) { repo := createTestRepo(t) defer os.RemoveAll(repo.Workdir()) diff --git a/object_test.go b/object_test.go new file mode 100644 index 00000000..82dce98f --- /dev/null +++ b/object_test.go @@ -0,0 +1,68 @@ +package git + +import ( + "os" + "testing" +) + +func TestObjectPoymorphism(t *testing.T) { + repo := createTestRepo(t) + defer os.RemoveAll(repo.Workdir()) + commitId, treeId := seedTestRepo(t, repo) + + var obj Object + + commit, err := repo.LookupCommit(commitId) + checkFatal(t, err) + + obj = commit + if obj.Type() != OBJ_COMMIT { + t.Fatalf("Wrong object type, expected commit, have %v", obj.Type()) + } + + tree, err := repo.LookupTree(treeId) + checkFatal(t, err) + + obj = tree + if obj.Type() != OBJ_TREE { + t.Fatalf("Wrong object type, expected tree, have %v", obj.Type()) + } + + tree2, ok := obj.(*Tree) + if !ok { + t.Fatalf("Converting back to *Tree is not ok") + } + + if tree2.EntryByName("README") == nil { + t.Fatalf("Tree did not have expected \"README\" entry") + } + + _, ok = obj.(*Commit) + if ok { + t.Fatalf("*Tree is somehow the same as *Commit") + } + + obj, err = repo.Lookup(tree.Id()) + checkFatal(t, err) + + _, ok = obj.(*Tree) + if !ok { + t.Fatalf("Lookup creates the wrong type") + } + + 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") + } +} diff --git a/reference_test.go b/reference_test.go index 80438337..3ea421dd 100644 --- a/reference_test.go +++ b/reference_test.go @@ -4,35 +4,15 @@ import ( "os" "runtime" "testing" - "time" ) func TestRefModification(t *testing.T) { repo := createTestRepo(t) defer os.RemoveAll(repo.Workdir()) - loc, err := time.LoadLocation("Europe/Berlin") - checkFatal(t, err) - sig := &Signature{ - Name: "Rand Om Hacker", - Email: "random@hacker.com", - When: time.Date(2013, 03, 06, 14, 30, 0, 0, loc), - } - - idx, err := repo.Index() - checkFatal(t, err) - err = idx.AddByPath("README") - checkFatal(t, err) - treeId, err := idx.WriteTree() - checkFatal(t, err) - - message := "This is a commit\n" - tree, err := repo.LookupTree(treeId) - checkFatal(t, err) - commitId, err := repo.CreateCommit("HEAD", sig, sig, message, tree) - checkFatal(t, err) + commitId, treeId := seedTestRepo(t, repo) - _, err = repo.CreateReference("refs/tags/tree", treeId, true) + _, err := repo.CreateReference("refs/tags/tree", treeId, true) checkFatal(t, err) tag, err := repo.LookupReference("refs/tags/tree") diff --git a/repository.go b/repository.go index 015e5bf2..0a07dc33 100644 --- a/repository.go +++ b/repository.go @@ -72,7 +72,7 @@ func (v *Repository) Index() (*Index, error) { return newIndexFromC(ptr), nil } -func (v *Repository) Lookup(oid *Oid, t ObjectType) (Object, error) { +func (v *Repository) lookupType(oid *Oid, t ObjectType) (Object, error) { var ptr *C.git_object ret := C.git_object_lookup(&ptr, v.ptr, oid.toC(), C.git_otype(t)) if ret < 0 { @@ -82,8 +82,12 @@ func (v *Repository) Lookup(oid *Oid, t ObjectType) (Object, error) { return allocObject(ptr), nil } +func (v *Repository) Lookup(oid *Oid) (Object, error) { + return v.lookupType(oid, OBJ_ANY) +} + func (v *Repository) LookupTree(oid *Oid) (*Tree, error) { - obj, err := v.Lookup(oid, OBJ_TREE) + obj, err := v.lookupType(oid, OBJ_TREE) if err != nil { return nil, err } @@ -92,7 +96,7 @@ func (v *Repository) LookupTree(oid *Oid) (*Tree, error) { } func (v *Repository) LookupCommit(oid *Oid) (*Commit, error) { - obj, err := v.Lookup(oid, OBJ_COMMIT) + obj, err := v.lookupType(oid, OBJ_COMMIT) if err != nil { return nil, err } @@ -101,7 +105,7 @@ func (v *Repository) LookupCommit(oid *Oid) (*Commit, error) { } func (v *Repository) LookupBlob(oid *Oid) (*Blob, error) { - obj, err := v.Lookup(oid, OBJ_BLOB) + obj, err := v.lookupType(oid, OBJ_BLOB) if err != nil { return nil, err } @@ -247,3 +251,15 @@ func (v *Repository) TreeBuilder() (*TreeBuilder, error) { return bld, 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 allocObject(ptr), nil +}