package git import ( "os" "runtime" "sort" "testing" "time" ) func TestRefModification(t *testing.T) { repo := createTestRepo(t) defer os.RemoveAll(repo.Workdir()) commitId, treeId := seedTestRepo(t, repo) 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), } _, err = repo.CreateReference("refs/tags/tree", treeId, true, sig, "testTreeTag") checkFatal(t, err) tag, err := repo.LookupReference("refs/tags/tree") checkFatal(t, err) checkRefType(t, tag, ReferenceOid) ref, err := repo.LookupReference("HEAD") checkFatal(t, err) checkRefType(t, ref, ReferenceSymbolic) if target := ref.Target(); target != nil { t.Fatalf("Expected nil *Oid, got %v", target) } ref, err = ref.Resolve() checkFatal(t, err) checkRefType(t, ref, ReferenceOid) if target := ref.Target(); target == nil { t.Fatalf("Expected valid target got nil") } if target := ref.SymbolicTarget(); target != "" { t.Fatalf("Expected empty string, got %v", target) } if commitId.String() != ref.Target().String() { t.Fatalf("Wrong ref target") } _, err = tag.Rename("refs/tags/renamed", false, nil, "") checkFatal(t, err) tag, err = repo.LookupReference("refs/tags/renamed") checkFatal(t, err) checkRefType(t, ref, ReferenceOid) } func TestReferenceIterator(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) _, err = repo.CreateReference("refs/heads/one", commitId, true, sig, "headOne") checkFatal(t, err) _, err = repo.CreateReference("refs/heads/two", commitId, true, sig, "headTwo") checkFatal(t, err) _, err = repo.CreateReference("refs/heads/three", commitId, true, sig, "headThree") checkFatal(t, err) iter, err := repo.NewReferenceIterator() checkFatal(t, err) var list []string expected := []string{ "refs/heads/master", "refs/heads/one", "refs/heads/three", "refs/heads/two", } // test some manual iteration nameIter := iter.Names() name, err := nameIter.Next() for err == nil { list = append(list, name) name, err = nameIter.Next() } if !IsErrorCode(err, ErrIterOver) { t.Fatal("Iteration not over") } sort.Strings(list) compareStringList(t, expected, list) // test the iterator for full refs, rather than just names iter, err = repo.NewReferenceIterator() checkFatal(t, err) count := 0 _, err = iter.Next() for err == nil { count++ _, err = iter.Next() } if !IsErrorCode(err, ErrIterOver) { t.Fatal("Iteration not over") } if count != 4 { t.Fatalf("Wrong number of references returned %v", count) } } 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()) commitId, _ := seedTestRepo(t, repo) ref, err := repo.CreateReference("refs/heads/foo", commitId, true, nil, "") checkFatal(t, err) ref2, err := repo.DwimReference("foo") checkFatal(t, err) if ref.Cmp(ref2) != 0 { t.Fatalf("foo didn't dwim to the right thing") } if ref.Shorthand() != "foo" { t.Fatalf("refs/heads/foo has no foo shorthand") } hasLog, err := repo.HasLog("refs/heads/foo") checkFatal(t, err) if !hasLog { t.Fatalf("branches have logs by default") } } func compareStringList(t *testing.T, expected, actual []string) { for i, v := range expected { if actual[i] != v { t.Fatalf("Bad list") } } } func checkRefType(t *testing.T, ref *Reference, kind ReferenceType) { 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) }