Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

transport/server: add asClient parameter #476

Merged
merged 1 commit into from
Jul 11, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 25 additions & 6 deletions plumbing/transport/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,19 @@ type server struct {
// NewServer returns a transport.Transport implementing a git server,
// independent of transport. Each transport must wrap this.
func NewServer(loader Loader) transport.Transport {
return &server{loader, &handler{}}
return &server{
loader,
&handler{asClient: false},
}
}

// NewClient returns a transport.Transport implementing a client with an
// embedded server.
func NewClient(loader Loader) transport.Transport {
return &server{
loader,
&handler{asClient: true},
}
}

func (s *server) NewUploadPackSession(ep transport.Endpoint, auth transport.AuthMethod) (transport.UploadPackSession, error) {
Expand All @@ -47,24 +59,27 @@ func (s *server) NewReceivePackSession(ep transport.Endpoint, auth transport.Aut
return s.handler.NewReceivePackSession(sto)
}

type handler struct{}
type handler struct {
asClient bool
}

func (h *handler) NewUploadPackSession(s storer.Storer) (transport.UploadPackSession, error) {
return &upSession{
session: session{storer: s},
session: session{storer: s, asClient: h.asClient},
}, nil
}

func (h *handler) NewReceivePackSession(s storer.Storer) (transport.ReceivePackSession, error) {
return &rpSession{
session: session{storer: s},
session: session{storer: s, asClient: h.asClient},
cmdStatus: map[plumbing.ReferenceName]error{},
}, nil
}

type session struct {
storer storer.Storer
caps *capability.List
storer storer.Storer
caps *capability.List
asClient bool
}

func (s *session) Close() error {
Expand Down Expand Up @@ -107,6 +122,10 @@ func (s *upSession) AdvertisedReferences() (*packp.AdvRefs, error) {
return nil, err
}

if s.asClient && len(ar.References) == 0 {
return nil, transport.ErrEmptyRemoteRepository
}

return ar, nil
}

Expand Down
8 changes: 7 additions & 1 deletion plumbing/transport/server/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,18 @@ type BaseSuite struct {
loader server.MapLoader
client transport.Transport
clientBackup transport.Transport
asClient bool
}

func (s *BaseSuite) SetUpSuite(c *C) {
s.Suite.SetUpSuite(c)
s.loader = server.MapLoader{}
s.client = server.NewServer(s.loader)
if s.asClient {
s.client = server.NewClient(s.loader)
} else {
s.client = server.NewServer(s.loader)
}

s.clientBackup = client.Protocols["file"]
client.Protocols["file"] = s.client
}
Expand Down
17 changes: 17 additions & 0 deletions plumbing/transport/server/upload_pack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,20 @@ func (s *UploadPackSuite) TestAdvertisedReferencesNotExists(c *C) {
c.Assert(err, Equals, transport.ErrRepositoryNotFound)
c.Assert(r, IsNil)
}

// Tests server with `asClient = true`. This is recommended when using a server
// registered directly with `client.InstallProtocol`.
type ClientLikeUploadPackSuite struct {
UploadPackSuite
}

var _ = Suite(&ClientLikeUploadPackSuite{})

func (s *ClientLikeUploadPackSuite) SetUpSuite(c *C) {
s.asClient = true
s.UploadPackSuite.SetUpSuite(c)
}

func (s *ClientLikeUploadPackSuite) TestAdvertisedReferencesEmpty(c *C) {
s.UploadPackSuite.UploadPackSuite.TestAdvertisedReferencesEmpty(c)
}