From 90d67bb648ae32d5b1a0f7b1af011da6dfb24315 Mon Sep 17 00:00:00 2001 From: "Santiago M. Mola" Date: Mon, 19 Dec 2016 23:36:44 +0100 Subject: remote: add Push (#178) * remote: add Push. * add Push method to Remote. * add method Push to Repository. * examples: add push example. * requested changes * add tests, fixes --- remote_test.go | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) (limited to 'remote_test.go') 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.*") +} -- cgit