diff options
Diffstat (limited to 'plumbing/transport/file')
-rw-r--r-- | plumbing/transport/file/common.go | 4 | ||||
-rw-r--r-- | plumbing/transport/file/common_test.go | 31 | ||||
-rw-r--r-- | plumbing/transport/file/fetch_pack_test.go | 8 | ||||
-rw-r--r-- | plumbing/transport/file/send_pack_test.go | 81 |
4 files changed, 124 insertions, 0 deletions
diff --git a/plumbing/transport/file/common.go b/plumbing/transport/file/common.go index 8697121..e7d18b2 100644 --- a/plumbing/transport/file/common.go +++ b/plumbing/transport/file/common.go @@ -69,6 +69,10 @@ func (c *command) StdoutPipe() (io.Reader, error) { // Close waits for the command to exit. func (c *command) Close() error { + if c.closed { + return nil + } + return c.cmd.Process.Kill() } diff --git a/plumbing/transport/file/common_test.go b/plumbing/transport/file/common_test.go index 94ca4c9..220df3d 100644 --- a/plumbing/transport/file/common_test.go +++ b/plumbing/transport/file/common_test.go @@ -1,9 +1,40 @@ package file import ( + "fmt" + "io" + "os" + "strings" "testing" + "gopkg.in/src-d/go-git.v4/plumbing/transport" + . "gopkg.in/check.v1" ) func Test(t *testing.T) { TestingT(t) } + +const bareConfig = `[core] +repositoryformatversion = 0 +filemode = true +bare = true` + +func prepareRepo(c *C, path string) transport.Endpoint { + url := fmt.Sprintf("file://%s", path) + ep, err := transport.NewEndpoint(url) + c.Assert(err, IsNil) + + // git-receive-pack refuses to update refs/heads/master on non-bare repo + // so we ensure bare repo config. + config := fmt.Sprintf("%s/config", path) + if _, err := os.Stat(config); err == nil { + f, err := os.OpenFile(config, os.O_TRUNC|os.O_WRONLY, 0) + c.Assert(err, IsNil) + content := strings.NewReader(bareConfig) + _, err = io.Copy(f, content) + c.Assert(err, IsNil) + c.Assert(f.Close(), IsNil) + } + + return ep +} diff --git a/plumbing/transport/file/fetch_pack_test.go b/plumbing/transport/file/fetch_pack_test.go index 7a23285..25e3fef 100644 --- a/plumbing/transport/file/fetch_pack_test.go +++ b/plumbing/transport/file/fetch_pack_test.go @@ -76,3 +76,11 @@ func (s *FetchPackSuite) TestMalformedInputNoErrors(c *C) { c.Assert(err, NotNil) c.Assert(ar, IsNil) } + +func (s *FetchPackSuite) TestNonExistentCommand(c *C) { + cmd := "/non-existent-git" + client := NewClient(cmd, cmd) + session, err := client.NewFetchPackSession(s.Endpoint) + c.Assert(err, ErrorMatches, ".*no such file or directory.*") + c.Assert(session, IsNil) +} diff --git a/plumbing/transport/file/send_pack_test.go b/plumbing/transport/file/send_pack_test.go new file mode 100644 index 0000000..fc7ea35 --- /dev/null +++ b/plumbing/transport/file/send_pack_test.go @@ -0,0 +1,81 @@ +package file + +import ( + "os" + "os/exec" + + "gopkg.in/src-d/go-git.v4/fixtures" + "gopkg.in/src-d/go-git.v4/plumbing/transport/test" + + . "gopkg.in/check.v1" +) + +type SendPackSuite struct { + fixtures.Suite + test.SendPackSuite +} + +var _ = Suite(&SendPackSuite{}) + +func (s *SendPackSuite) SetUpSuite(c *C) { + s.Suite.SetUpSuite(c) + + if err := exec.Command("git", "--version").Run(); err != nil { + c.Skip("git command not found") + } + + s.SendPackSuite.Client = DefaultClient +} + +func (s *SendPackSuite) SetUpTest(c *C) { + fixture := fixtures.Basic().One() + path := fixture.DotGit().Base() + s.Endpoint = prepareRepo(c, path) + + fixture = fixtures.ByTag("empty").One() + path = fixture.DotGit().Base() + s.EmptyEndpoint = prepareRepo(c, path) + + s.NonExistentEndpoint = prepareRepo(c, "/non-existent") +} + +func (s *SendPackSuite) TearDownTest(c *C) { + s.Suite.TearDownSuite(c) +} + +// TODO: fix test +func (s *SendPackSuite) TestCommandNoOutput(c *C) { + c.Skip("failing test") + + if _, err := os.Stat("/bin/true"); os.IsNotExist(err) { + c.Skip("/bin/true not found") + } + + client := NewClient("true", "true") + session, err := client.NewSendPackSession(s.Endpoint) + c.Assert(err, IsNil) + ar, err := session.AdvertisedReferences() + c.Assert(err, IsNil) + c.Assert(ar, IsNil) +} + +func (s *SendPackSuite) TestMalformedInputNoErrors(c *C) { + if _, err := os.Stat("/usr/bin/yes"); os.IsNotExist(err) { + c.Skip("/usr/bin/yes not found") + } + + client := NewClient("yes", "yes") + session, err := client.NewSendPackSession(s.Endpoint) + c.Assert(err, IsNil) + ar, err := session.AdvertisedReferences() + c.Assert(err, NotNil) + c.Assert(ar, IsNil) +} + +func (s *SendPackSuite) TestNonExistentCommand(c *C) { + cmd := "/non-existent-git" + client := NewClient(cmd, cmd) + session, err := client.NewSendPackSession(s.Endpoint) + c.Assert(err, ErrorMatches, ".*no such file or directory.*") + c.Assert(session, IsNil) +} |