diff --git a/reference_test.go b/reference_test.go new file mode 100644 index 0000000..c2da93e --- /dev/null +++ b/reference_test.go @@ -0,0 +1,74 @@ +package git + +import ( + "os" + "runtime" + "testing" + "time" +) + +func TestRefModification(t *testing.T) { + repo := createTestRepo(t) + defer os.RemoveAll(repo.Path()) + + 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) + + _, err = repo.CreateReference("refs/tags/tree", treeId, true) + checkFatal(t, err) + + tag, err := repo.LookupReference("refs/tags/tree") + checkFatal(t, err) + checkRefType(t, tag, OID) + + ref, err := repo.LookupReference("HEAD") + checkFatal(t, err) + checkRefType(t, ref, SYMBOLIC) + + ref, err = ref.Resolve() + checkFatal(t, err) + checkRefType(t, ref, OID) + + if commitId.String() != ref.Target().String() { + t.Fatalf("Wrong ref target") + } + + _, err = tag.Rename("refs/tags/renamed", false) + checkFatal(t, err) + tag, err = repo.LookupReference("refs/tags/renamed") + checkFatal(t, err) + checkRefType(t, ref, OID) + +} + +func checkRefType(t *testing.T, ref *Reference, kind int) { + if ref.Type() == kind { + return + } + + // The failure happens at wherever we were called, not here + _, file, line, ok := runtime.Caller(1) + if !ok { + t.Fatal() + } + + t.Fatalf("Wrong ref type at %v:%v; have %v, expected %v", file, line, ref.Type(), kind) +}