aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSantiago M. Mola <santi@mola.io>2017-07-11 14:51:12 +0200
committerSantiago M. Mola <santi@mola.io>2017-07-11 15:07:09 +0200
commit8009cde25dda59ff13a97fabac9abb0b6ef57ef9 (patch)
treebb55566bb72e9c871ac92d1697005badadd5e5d6
parent09cd5ccfd384be79e8c49d0d0bccd22589098809 (diff)
downloadgo-git-8009cde25dda59ff13a97fabac9abb0b6ef57ef9.tar.gz
transport/server: add NewClient
server.NewClient returns a server that acts as a client. This makes it working seamlessly when registering a server directly with `client.InstallProtocol`.
-rw-r--r--plumbing/transport/server/server.go31
-rw-r--r--plumbing/transport/server/server_test.go8
-rw-r--r--plumbing/transport/server/upload_pack_test.go17
3 files changed, 49 insertions, 7 deletions
diff --git a/plumbing/transport/server/server.go b/plumbing/transport/server/server.go
index 89fce5f..7b0e7a8 100644
--- a/plumbing/transport/server/server.go
+++ b/plumbing/transport/server/server.go
@@ -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) {
@@ -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 {
@@ -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
}
diff --git a/plumbing/transport/server/server_test.go b/plumbing/transport/server/server_test.go
index 0f7201c..7912768 100644
--- a/plumbing/transport/server/server_test.go
+++ b/plumbing/transport/server/server_test.go
@@ -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
}
diff --git a/plumbing/transport/server/upload_pack_test.go b/plumbing/transport/server/upload_pack_test.go
index 137f887..bd2b791 100644
--- a/plumbing/transport/server/upload_pack_test.go
+++ b/plumbing/transport/server/upload_pack_test.go
@@ -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)
+}