package git import ( "fmt" "testing" "time" ) func TestRefspecs(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) remote, err := repo.CreateAnonymousRemote("git://foo/bar", "refs/heads/*:refs/heads/*") checkFatal(t, err) expected := []string{ "refs/heads/*:refs/remotes/origin/*", "refs/pull/*/head:refs/remotes/origin/*", } err = remote.SetFetchRefspecs(expected) checkFatal(t, err) actual, err := remote.FetchRefspecs() checkFatal(t, err) compareStringList(t, expected, actual) } func TestListRemotes(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) _, err := repo.CreateRemote("test", "git://foo/bar") checkFatal(t, err) expected := []string{ "test", } actual, err := repo.ListRemotes() checkFatal(t, err) compareStringList(t, expected, actual) } func assertHostname(cert *Certificate, valid bool, hostname string, t *testing.T) ErrorCode { if hostname != "github.com" { t.Fatal("Hostname does not match") return ErrUser } return 0 } func TestCertificateCheck(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) remote, err := repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) callbacks := RemoteCallbacks{ CertificateCheckCallback: func(cert *Certificate, valid bool, hostname string) ErrorCode { return assertHostname(cert, valid, hostname, t) }, } err = remote.SetCallbacks(&callbacks) checkFatal(t, err) err = remote.Fetch([]string{}, nil, "") checkFatal(t, err) } func TestRemoteConnect(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) remote, err := repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) err = remote.ConnectFetch() checkFatal(t, err) } func TestRemoteLs(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) remote, err := repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) err = remote.ConnectFetch() checkFatal(t, err) heads, err := remote.Ls() checkFatal(t, err) if len(heads) == 0 { t.Error("Expected remote heads") } } func TestRemoteLsFiltering(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) remote, err := repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) err = remote.ConnectFetch() checkFatal(t, err) heads, err := remote.Ls("master") checkFatal(t, err) if len(heads) != 1 { t.Fatalf("Expected one head for master but I got %d", len(heads)) } if heads[0].Id == nil { t.Fatalf("Expected head to have an Id, but it's nil") } if heads[0].Name == "" { t.Fatalf("Expected head to have a name, but it's empty") } } func TestRemotePruneRefs(t *testing.T) { repo := createTestRepo(t) defer cleanupTestRepo(t, repo) config, err := repo.Config() checkFatal(t, err) defer config.Free() err = config.SetBool("remote.origin.prune", true) checkFatal(t, err) _, err = repo.CreateRemote("origin", "https://github.com/libgit2/TestGitRepository") checkFatal(t, err) remote, err := repo.LookupRemote("origin") checkFatal(t, err) if !remote.PruneRefs() { t.Fatal("Expected remote to be configured to prune references") } } func TestRemotePrune(t *testing.T) { remoteRepo := createTestRepo(t) defer cleanupTestRepo(t, remoteRepo) head, _ := seedTestRepo(t, remoteRepo) commit, err := remoteRepo.LookupCommit(head) checkFatal(t, err) defer commit.Free() sig := &Signature{ Name: "Rand Om Hacker", Email: "random@hacker.com", When: time.Now(), } remoteRef, err := remoteRepo.CreateBranch("test-prune", commit, true, sig, "branch test-prune") checkFatal(t, err) repo := createTestRepo(t) defer cleanupTestRepo(t, repo) config, err := repo.Config() checkFatal(t, err) defer config.Free() remoteUrl := fmt.Sprintf("file://%s", remoteRepo.Workdir()) remote, err := repo.CreateRemote("origin", remoteUrl) checkFatal(t, err) err = remote.Fetch([]string{"test-prune"}, sig, "") checkFatal(t, err) _, err = repo.CreateReference("refs/remotes/origin/test-prune", head, true, sig, "remote reference") checkFatal(t, err) err = remoteRef.Delete() checkFatal(t, err) err = config.SetBool("remote.origin.prune", true) checkFatal(t, err) rr, err := repo.LookupRemote("origin") checkFatal(t, err) err = rr.ConnectFetch() checkFatal(t, err) err = rr.Prune() checkFatal(t, err) _, err = repo.LookupReference("refs/remotes/origin/test-prune") if err == nil { t.Fatal("Expected error getting a pruned reference") } }