package file import ( "os" "os/exec" . "gopkg.in/check.v1" "gopkg.in/src-d/go-git-fixtures.v3" ) type ServerSuite struct { CommonSuite RemoteName string SrcPath string DstPath string } var _ = Suite(&ServerSuite{}) func (s *ServerSuite) SetUpSuite(c *C) { s.CommonSuite.SetUpSuite(c) s.RemoteName = "test" fixture := fixtures.Basic().One() s.SrcPath = fixture.DotGit().Root() fixture = fixtures.ByTag("empty").One() s.DstPath = fixture.DotGit().Root() cmd := exec.Command("git", "remote", "add", s.RemoteName, s.DstPath) cmd.Dir = s.SrcPath c.Assert(cmd.Run(), IsNil) } func (s *ServerSuite) TestPush(c *C) { if !s.checkExecPerm(c) { c.Skip("go-git binary has not execution permissions") } // git <2.0 cannot push to an empty repository without a refspec. cmd := exec.Command("git", "push", "--receive-pack", s.ReceivePackBin, s.RemoteName, "refs/heads/*:refs/heads/*", ) cmd.Dir = s.SrcPath cmd.Env = os.Environ() cmd.Env = append(cmd.Env, "GIT_TRACE=true", "GIT_TRACE_PACKET=true") out, err := cmd.CombinedOutput() c.Assert(err, IsNil, Commentf("combined stdout and stderr:\n%s\n", out)) } func (s *ServerSuite) TestClone(c *C) { if !s.checkExecPerm(c) { c.Skip("go-git binary has not execution permissions") } pathToClone := c.MkDir() cmd := exec.Command("git", "clone", "--upload-pack", s.UploadPackBin, s.SrcPath, pathToClone, ) cmd.Env = os.Environ() cmd.Env = append(cmd.Env, "GIT_TRACE=true", "GIT_TRACE_PACKET=true") out, err := cmd.CombinedOutput() c.Assert(err, IsNil, Commentf("combined stdout and stderr:\n%s\n", out)) } func (s *ServerSuite) checkExecPerm(c *C) bool { const userExecPermMask = 0100 info, err := os.Stat(s.ReceivePackBin) c.Assert(err, IsNil) return (info.Mode().Perm() & userExecPermMask) == userExecPermMask }