aboutsummaryrefslogtreecommitdiffstats
path: root/remote_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'remote_test.go')
-rw-r--r--remote_test.go109
1 files changed, 109 insertions, 0 deletions
diff --git a/remote_test.go b/remote_test.go
index 47c8180..02ff690 100644
--- a/remote_test.go
+++ b/remote_test.go
@@ -2,11 +2,13 @@ package git
import (
"bytes"
+ "fmt"
"io"
"io/ioutil"
"os"
"gopkg.in/src-d/go-git.v4/config"
+ "gopkg.in/src-d/go-git.v4/fixtures"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/storer"
"gopkg.in/src-d/go-git.v4/storage/filesystem"
@@ -194,3 +196,110 @@ func (s *RemoteSuite) TestString(c *C) {
"foo\thttps://github.com/git-fixtures/basic.git (push)",
)
}
+
+func (s *RemoteSuite) TestPushToEmptyRepository(c *C) {
+ srcFs := fixtures.Basic().One().DotGit()
+ sto, err := filesystem.NewStorage(srcFs)
+ c.Assert(err, IsNil)
+
+ dstFs := fixtures.ByTag("empty").One().DotGit()
+ url := fmt.Sprintf("file://%s", dstFs.Base())
+
+ r := newRemote(sto, nil, &config.RemoteConfig{
+ Name: DefaultRemoteName,
+ URL: url,
+ })
+
+ rs := config.RefSpec("refs/heads/*:refs/heads/*")
+ err = r.Push(&PushOptions{
+ RefSpecs: []config.RefSpec{rs},
+ })
+ c.Assert(err, IsNil)
+
+ dstSto, err := filesystem.NewStorage(dstFs)
+ c.Assert(err, IsNil)
+ dstRepo, err := NewRepository(dstSto)
+ c.Assert(err, IsNil)
+
+ iter, err := sto.IterReferences()
+ c.Assert(err, IsNil)
+ err = iter.ForEach(func(ref *plumbing.Reference) error {
+ if !ref.IsBranch() {
+ return nil
+ }
+
+ dstRef, err := dstRepo.Reference(ref.Name(), true)
+ c.Assert(err, IsNil, Commentf("ref: %s", ref.String()))
+ c.Assert(dstRef, DeepEquals, ref)
+
+ return nil
+ })
+ c.Assert(err, IsNil)
+}
+
+func (s *RemoteSuite) TestPushNoErrAlreadyUpToDate(c *C) {
+ f := fixtures.Basic().One()
+ sto, err := filesystem.NewStorage(f.DotGit())
+ c.Assert(err, IsNil)
+ url := fmt.Sprintf("file://%s", f.DotGit().Base())
+ r := newRemote(sto, nil, &config.RemoteConfig{
+ Name: DefaultRemoteName,
+ URL: url,
+ })
+
+ rs := config.RefSpec("refs/heads/*:refs/heads/*")
+ err = r.Push(&PushOptions{
+ RefSpecs: []config.RefSpec{rs},
+ })
+ c.Assert(err, Equals, NoErrAlreadyUpToDate)
+}
+
+func (s *RemoteSuite) TestPushInvalidEndpoint(c *C) {
+ r := newRemote(nil, nil, &config.RemoteConfig{Name: "foo", URL: "qux"})
+ err := r.Push(&PushOptions{})
+ c.Assert(err, ErrorMatches, ".*invalid endpoint.*")
+}
+
+func (s *RemoteSuite) TestPushNonExistentEndpoint(c *C) {
+ r := newRemote(nil, nil, &config.RemoteConfig{Name: "foo", URL: "ssh://non-existent/foo.git"})
+ err := r.Push(&PushOptions{})
+ c.Assert(err, NotNil)
+}
+
+func (s *RemoteSuite) TestPushInvalidSchemaEndpoint(c *C) {
+ r := newRemote(nil, nil, &config.RemoteConfig{Name: "foo", URL: "qux://foo"})
+ err := r.Push(&PushOptions{})
+ c.Assert(err, ErrorMatches, ".*unsupported scheme.*")
+}
+
+func (s *RemoteSuite) TestPushInvalidFetchOptions(c *C) {
+ r := newRemote(nil, nil, &config.RemoteConfig{Name: "foo", URL: "qux://foo"})
+ invalid := config.RefSpec("^*$ñ")
+ err := r.Push(&PushOptions{RefSpecs: []config.RefSpec{invalid}})
+ c.Assert(err, Equals, ErrInvalidRefSpec)
+}
+
+func (s *RemoteSuite) TestPushInvalidRefSpec(c *C) {
+ r := newRemote(nil, nil, &config.RemoteConfig{
+ Name: DefaultRemoteName,
+ URL: "file:///some-url",
+ })
+
+ rs := config.RefSpec("^*$**")
+ err := r.Push(&PushOptions{
+ RefSpecs: []config.RefSpec{rs},
+ })
+ c.Assert(err, ErrorMatches, ".*invalid.*")
+}
+
+func (s *RemoteSuite) TestPushWrongRemoteName(c *C) {
+ r := newRemote(nil, nil, &config.RemoteConfig{
+ Name: DefaultRemoteName,
+ URL: "file:///some-url",
+ })
+
+ err := r.Push(&PushOptions{
+ RemoteName: "other-remote",
+ })
+ c.Assert(err, ErrorMatches, ".*remote names don't match.*")
+}