diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2020-03-19 15:27:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-19 15:27:26 +0100 |
commit | f6305131a06bd94ef39e444b60f773db75b054f6 (patch) | |
tree | 5165824443497a01df13657d0128766fd852b865 | |
parent | 1dbaf49cde7bc189fb05b875aec535b124d7dc43 (diff) | |
parent | cec6ee36305b9d64abf78bfac637eb164be1217a (diff) | |
download | go-git-f6305131a06bd94ef39e444b60f773db75b054f6.tar.gz |
Merge pull request #11 from brandonwestcott/fix/empty-packfile-server
plumbing: transport server check for nil Packfile, fixes ref deletes
-rw-r--r-- | plumbing/transport/server/receive_pack_test.go | 30 | ||||
-rw-r--r-- | plumbing/transport/server/server.go | 12 |
2 files changed, 37 insertions, 5 deletions
diff --git a/plumbing/transport/server/receive_pack_test.go b/plumbing/transport/server/receive_pack_test.go index de072f3..2c5b0ae 100644 --- a/plumbing/transport/server/receive_pack_test.go +++ b/plumbing/transport/server/receive_pack_test.go @@ -1,8 +1,13 @@ package server_test import ( + "context" + + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" "github.com/go-git/go-git/v5/plumbing/transport" + fixtures "github.com/go-git/go-git-fixtures/v4" . "gopkg.in/check.v1" ) @@ -31,3 +36,28 @@ func (s *ReceivePackSuite) TestAdvertisedReferencesNotExists(c *C) { c.Assert(err, Equals, transport.ErrRepositoryNotFound) c.Assert(r, IsNil) } + +func (s *ReceivePackSuite) TestReceivePackWithNilPackfile(c *C) { + endpoint := s.Endpoint + auth := s.EmptyAuth + + fixture := fixtures.Basic().ByTag("packfile").One() + req := packp.NewReferenceUpdateRequest() + req.Commands = []*packp.Command{ + {Name: "refs/heads/newbranch", Old: plumbing.NewHash(fixture.Head), New: plumbing.ZeroHash}, + } + // default is already nil, but be explicit since this is what the test is for + req.Packfile = nil + + comment := Commentf( + "failed with ep=%s fixture=%s", + endpoint.String(), fixture.URL, + ) + + r, err := s.Client.NewReceivePackSession(endpoint, auth) + c.Assert(err, IsNil, comment) + defer func() { c.Assert(r.Close(), IsNil, comment) }() + + report, err := r.ReceivePack(context.Background(), req) + c.Assert(report, IsNil, comment) +} diff --git a/plumbing/transport/server/server.go b/plumbing/transport/server/server.go index 71845e3..727f902 100644 --- a/plumbing/transport/server/server.go +++ b/plumbing/transport/server/server.go @@ -243,11 +243,13 @@ func (s *rpSession) ReceivePack(ctx context.Context, req *packp.ReferenceUpdateR //TODO: Implement 'atomic' update of references. - r := ioutil.NewContextReadCloser(ctx, req.Packfile) - if err := s.writePackfile(r); err != nil { - s.unpackErr = err - s.firstErr = err - return s.reportStatus(), err + if req.Packfile != nil { + r := ioutil.NewContextReadCloser(ctx, req.Packfile) + if err := s.writePackfile(r); err != nil { + s.unpackErr = err + s.firstErr = err + return s.reportStatus(), err + } } s.updateReferences(req) |