From 9b45225b0212cdb9976a056c23c87f6dba00e627 Mon Sep 17 00:00:00 2001 From: "go-git-renovate[bot]" <245267575+go-git-renovate[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 07:04:05 +0000 Subject: [PATCH 1/4] build: Update module github.com/go-git/go-git/v6 to v6.0.0-alpha.2 --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 9526a6b..f294e65 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.25.4 require ( github.com/go-git/go-billy/v6 v6.0.0-20260410103409-85b6241850b5 github.com/go-git/go-git-fixtures/v6 v6.0.0-20260410103352-fe4fd2baf1dc - github.com/go-git/go-git/v6 v6.0.0-alpha.1 + github.com/go-git/go-git/v6 v6.0.0-alpha.2 github.com/spf13/cobra v1.10.2 golang.org/x/crypto v0.50.0 golang.org/x/term v0.42.0 From 34ad6c175566dc14bf7abd03517f480d64661673 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 08:40:56 +0000 Subject: [PATCH 2/4] fix: update code to match go-git/v6 v6.0.0-alpha.2 API changes Agent-Logs-Url: https://github.com/go-git/cli/sessions/59e4b568-dc12-43b2-88e0-3025f7b6fa16 Co-authored-by: pjbgf <5452977+pjbgf@users.noreply.github.com> --- cmd/gogit-http-server/main.go | 4 ++-- cmd/gogit/clone.go | 12 ++++++------ cmd/gogit/daemon.go | 10 +++++----- cmd/gogit/fetch.go | 8 ++++---- cmd/gogit/main.go | 18 ++++++++++++------ cmd/gogit/pull.go | 6 +++--- cmd/gogit/push.go | 18 +++++++++--------- cmd/gogit/receive-pack.go | 2 +- cmd/gogit/upload-pack.go | 2 +- go.mod | 5 ++--- go.sum | 16 ++++++---------- server/git/server.go | 24 ++++++++++++++++++++++-- 12 files changed, 73 insertions(+), 52 deletions(-) diff --git a/cmd/gogit-http-server/main.go b/cmd/gogit-http-server/main.go index 5c880f9..504eb9e 100644 --- a/cmd/gogit-http-server/main.go +++ b/cmd/gogit-http-server/main.go @@ -8,7 +8,7 @@ import ( "path/filepath" "github.com/go-git/go-billy/v6/osfs" - githttp "github.com/go-git/go-git/v6/backend/http" + "github.com/go-git/go-git/v6/backend" "github.com/go-git/go-git/v6/plumbing/transport" "github.com/spf13/cobra" ) @@ -40,7 +40,7 @@ var rootCmd = &cobra.Command{ logger := log.Default() loader := transport.NewFilesystemLoader(osfs.New(abs, osfs.WithBoundOS()), false) - gitmw := githttp.NewBackend(loader) + gitmw := backend.New(loader) handler := LoggingMiddleware(logger, gitmw) diff --git a/cmd/gogit/clone.go b/cmd/gogit/clone.go index 4895530..86beec5 100644 --- a/cmd/gogit/clone.go +++ b/cmd/gogit/clone.go @@ -2,11 +2,11 @@ package main import ( "fmt" + "net/url" "path" "strings" "github.com/go-git/go-git/v6" - "github.com/go-git/go-git/v6/plumbing/transport" "github.com/spf13/cobra" ) @@ -41,16 +41,16 @@ var cloneCmd = &cobra.Command{ } } - ep, err := transport.NewEndpoint(args[0]) + ep, err := url.Parse(args[0]) if err != nil { return err } opts := git.CloneOptions{ - URL: args[0], - Depth: cloneDepth, - Auth: defaultAuth(ep), - Bare: cloneBare, + URL: args[0], + Depth: cloneDepth, + ClientOptions: defaultClientOptions(ep), + Bare: cloneBare, } if cloneTags { diff --git a/cmd/gogit/daemon.go b/cmd/gogit/daemon.go index e7c8e0e..9b14c9e 100644 --- a/cmd/gogit/daemon.go +++ b/cmd/gogit/daemon.go @@ -3,13 +3,13 @@ package main import ( "log" "net" + "net/url" "path/filepath" "strconv" gitserver "github.com/go-git/cli/server/git" "github.com/go-git/go-billy/v6" "github.com/go-git/go-billy/v6/osfs" - gitbackend "github.com/go-git/go-git/v6/backend/git" "github.com/go-git/go-git/v6/plumbing/transport" "github.com/go-git/go-git/v6/storage" "github.com/spf13/cobra" @@ -40,7 +40,7 @@ var daemonCmd = &cobra.Command{ loader := NewDirsLoader(dirs, false, daemonExportAll) addr := net.JoinHostPort(daemonListen, strconv.Itoa(daemonPort)) - be := gitbackend.NewBackend(loader) + be := gitserver.NewBackend(loader) srv := &gitserver.Server{ Addr: addr, Handler: gitserver.LoggingMiddleware(log.Default(), be), @@ -81,16 +81,16 @@ func NewDirsLoader(dirs []string, strict, exportAll bool) *dirsLoader { } // Load implements transport.Loader. -func (d *dirsLoader) Load(ep *transport.Endpoint) (storage.Storer, error) { +func (d *dirsLoader) Load(u *url.URL) (storage.Storer, error) { for i, loader := range d.loaders { - storer, err := loader.Load(ep) + storer, err := loader.Load(u) if err == nil { if !d.exportAll { // We need to check if git-daemon-export-ok // file exists and if it does not, we skip this // repository. dfs := d.fss[i] - okFile := filepath.Join(ep.Path, "git-daemon-export-ok") + okFile := filepath.Join(u.Path, "git-daemon-export-ok") stat, err := dfs.Lstat(okFile) if err != nil || (stat != nil && !stat.Mode().IsRegular()) { diff --git a/cmd/gogit/fetch.go b/cmd/gogit/fetch.go index af84475..07e6a81 100644 --- a/cmd/gogit/fetch.go +++ b/cmd/gogit/fetch.go @@ -3,9 +3,9 @@ package main import ( "errors" "math" + "net/url" "github.com/go-git/go-git/v6" - "github.com/go-git/go-git/v6/plumbing/transport" "github.com/spf13/cobra" ) @@ -38,7 +38,7 @@ var fetchCmd = &cobra.Command{ return err } - ep, err := transport.NewEndpoint(remote.Config().URLs[0]) + ep, err := url.Parse(remote.Config().URLs[0]) if err != nil { return err } @@ -48,8 +48,8 @@ var fetchCmd = &cobra.Command{ } opts := git.FetchOptions{ - Depth: fetchDepth, - Auth: defaultAuth(ep), + Depth: fetchDepth, + ClientOptions: defaultClientOptions(ep), } if fetchProgress { diff --git a/cmd/gogit/main.go b/cmd/gogit/main.go index b7b3175..b861f0b 100644 --- a/cmd/gogit/main.go +++ b/cmd/gogit/main.go @@ -3,9 +3,11 @@ package main import ( "errors" "fmt" + "net/url" "os" "strconv" + "github.com/go-git/go-git/v6/plumbing/client" "github.com/go-git/go-git/v6/plumbing/transport" "github.com/go-git/go-git/v6/plumbing/transport/ssh" "github.com/go-git/go-git/v6/utils/trace" @@ -58,27 +60,31 @@ func main() { } } -func defaultAuth(ep *transport.Endpoint) transport.AuthMethod { - switch ep.Scheme { +func defaultClientOptions(u *url.URL) []client.Option { + if u == nil { + return nil + } + + switch u.Scheme { case "file", "git": // Do nothing. case "ssh": - if ep.User == nil { + if u.User == nil { return nil } - a, err := ssh.NewSSHAgentAuth(ep.User.Username()) + a, err := ssh.NewSSHAgentAuth(u.User.Username()) if err != nil { return nil } - switch ep.Host { + switch u.Host { case "localhost", "127.0.0.1": // Ignore host key verification for localhost. a.HostKeyCallback = gossh.InsecureIgnoreHostKey() } - return a + return []client.Option{client.WithSSHAuth(a)} case "http", "https": } diff --git a/cmd/gogit/pull.go b/cmd/gogit/pull.go index 4734c2e..edf5a3b 100644 --- a/cmd/gogit/pull.go +++ b/cmd/gogit/pull.go @@ -2,9 +2,9 @@ package main import ( "errors" + "net/url" "github.com/go-git/go-git/v6" - "github.com/go-git/go-git/v6/plumbing/transport" "github.com/spf13/cobra" ) @@ -34,13 +34,13 @@ var pullCmd = &cobra.Command{ return err } - ep, err := transport.NewEndpoint(cfg.Remotes["origin"].URLs[0]) + ep, err := url.Parse(cfg.Remotes["origin"].URLs[0]) if err != nil { return err } opts := git.PullOptions{ - Auth: defaultAuth(ep), + ClientOptions: defaultClientOptions(ep), } if pullProgress { opts.Progress = cmd.OutOrStdout() diff --git a/cmd/gogit/push.go b/cmd/gogit/push.go index 30009e0..e703d59 100644 --- a/cmd/gogit/push.go +++ b/cmd/gogit/push.go @@ -3,11 +3,11 @@ package main import ( "errors" "fmt" + "net/url" "github.com/go-git/go-git/v6" "github.com/go-git/go-git/v6/config" "github.com/go-git/go-git/v6/plumbing" - "github.com/go-git/go-git/v6/plumbing/transport" "github.com/spf13/cobra" "golang.org/x/term" ) @@ -43,7 +43,7 @@ var pushCmd = &cobra.Command{ return fmt.Errorf("failed to get repository config: %w", err) } - var ep *transport.Endpoint + var ep *url.URL remoteName := git.DefaultRemoteName @@ -61,7 +61,7 @@ var pushCmd = &cobra.Command{ if !isRemote { // Is this a repository URL? - ep, err = transport.NewEndpoint(args[0]) + ep, err = url.Parse(args[0]) if err != nil { // We have a remote name remoteName = args[0] @@ -91,18 +91,18 @@ var pushCmd = &cobra.Command{ return errors.New("no remote URLs") } - ep, err = transport.NewEndpoint(remote.Config().URLs[urln]) + ep, err = url.Parse(remote.Config().URLs[urln]) if err != nil { return err } } opts := git.PushOptions{ - Auth: defaultAuth(ep), - RemoteName: remoteName, - RefSpecs: refspecs, - Prune: pushPrune, - Force: pushForce, + ClientOptions: defaultClientOptions(ep), + RemoteName: remoteName, + RefSpecs: refspecs, + Prune: pushPrune, + Force: pushForce, } var isatty bool diff --git a/cmd/gogit/receive-pack.go b/cmd/gogit/receive-pack.go index 4b8b785..05c123b 100644 --- a/cmd/gogit/receive-pack.go +++ b/cmd/gogit/receive-pack.go @@ -35,7 +35,7 @@ var receivePackCmd = &cobra.Command{ r.Storer, os.Stdin, os.Stdout, - &transport.ReceivePackOptions{ + &transport.ReceivePackRequest{ GitProtocol: os.Getenv("GIT_PROTOCOL"), StatelessRPC: receivePackStatelessRPC, AdvertiseRefs: receivePackAdvertiseRefs, diff --git a/cmd/gogit/upload-pack.go b/cmd/gogit/upload-pack.go index e06fb62..f284651 100644 --- a/cmd/gogit/upload-pack.go +++ b/cmd/gogit/upload-pack.go @@ -48,7 +48,7 @@ var uploadPackCmd = &cobra.Command{ r.Storer, os.Stdin, os.Stdout, - &transport.UploadPackOptions{ + &transport.UploadPackRequest{ GitProtocol: os.Getenv("GIT_PROTOCOL"), StatelessRPC: uploadPackStatelessRPC, AdvertiseRefs: uploadPackAdvertiseRefs, diff --git a/go.mod b/go.mod index f294e65..d6e4218 100644 --- a/go.mod +++ b/go.mod @@ -20,14 +20,13 @@ require ( github.com/cyphar/filepath-securejoin v0.6.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/go-git/gcfg/v2 v2.0.2 // indirect - github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/kevinburke/ssh_config v1.6.0 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/pjbgf/sha1cd v0.5.0 // indirect github.com/sergi/go-diff v1.4.0 // indirect github.com/spf13/pflag v1.0.9 // indirect - golang.org/x/net v0.52.0 // indirect - golang.org/x/sync v0.19.0 // indirect + golang.org/x/net v0.53.0 // indirect + golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.43.0 // indirect ) diff --git a/go.sum b/go.sum index 55faebd..ed38add 100644 --- a/go.sum +++ b/go.sum @@ -22,14 +22,10 @@ github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo= github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs= github.com/go-git/go-billy/v6 v6.0.0-20260410103409-85b6241850b5 h1:r5Y4Hn9QwQj+u6vN0Ib1MipHkanYaG8Zj0kxsnv8Bu4= github.com/go-git/go-billy/v6 v6.0.0-20260410103409-85b6241850b5/go.mod h1:CdBVp7CXl9l3sOyNEog46cP1Pvx/hjCe9AD0mtaIUYU= -github.com/go-git/go-git-fixtures/v5 v5.1.2-0.20260122163445-0622d7459a67 h1:3hutPZF+/FBjR/9MdsLJ7e1mlt9pwHgwxMW7CrbmWII= -github.com/go-git/go-git-fixtures/v5 v5.1.2-0.20260122163445-0622d7459a67/go.mod h1:xKt0pNHST9tYHvbiLxSY27CQWFwgIxBJuDrOE0JvbZw= github.com/go-git/go-git-fixtures/v6 v6.0.0-20260410103352-fe4fd2baf1dc h1:iNssylWjlbkLomzPcgPmvjFbwNd8p9+M6UGcm2ra0zA= github.com/go-git/go-git-fixtures/v6 v6.0.0-20260410103352-fe4fd2baf1dc/go.mod h1:1Lr7/vYEYyl6Ir9Ku0tKrCIRreM5zovv0Jdx2MPSM4s= -github.com/go-git/go-git/v6 v6.0.0-alpha.1 h1:tGohX5luKeO50DZD0/Zqd5dYjJzKtub91S4I+1qFVIs= -github.com/go-git/go-git/v6 v6.0.0-alpha.1/go.mod h1:qtzfNHlFsnq6vCw54aT4KvFWPK5bsOpTVtFC2sysdB8= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/go-git/go-git/v6 v6.0.0-alpha.2 h1:T3loNtDuAixNzXtlQxZhnYiYpaQ3CA4vn9RssAniEeI= +github.com/go-git/go-git/v6 v6.0.0-alpha.2/go.mod h1:oCD3i19CTz7gBpeb11ZZqL91WzqbMq9avn5KpUYy/Ak= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/kevinburke/ssh_config v1.6.0 h1:J1FBfmuVosPHf5GRdltRLhPJtJpTlMdKTBjRgTaQBFY= @@ -57,10 +53,10 @@ github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= diff --git a/server/git/server.go b/server/git/server.go index b540124..cd59bec 100644 --- a/server/git/server.go +++ b/server/git/server.go @@ -12,7 +12,7 @@ import ( "sync/atomic" "time" - gitbackend "github.com/go-git/go-git/v6/backend/git" + "github.com/go-git/go-git/v6/backend" "github.com/go-git/go-git/v6/plumbing/format/pktline" "github.com/go-git/go-git/v6/plumbing/protocol/packp" "github.com/go-git/go-git/v6/plumbing/transport" @@ -26,7 +26,27 @@ const DefaultAddr = ":9418" var ErrServerClosed = errors.New("server closed") // DefaultBackend is the default global Git transport server handler. -var DefaultBackend = gitbackend.NewBackend(nil) +var DefaultBackend Handler = NewBackend(nil) + +// NewBackend creates a [Handler] backed by the given [transport.Loader]. +// If loader is nil, [transport.DefaultLoader] is used. +func NewBackend(loader transport.Loader) Handler { + return &backendHandler{b: backend.New(loader)} +} + +// backendHandler wraps a [backend.Backend] to implement the [Handler] interface. +type backendHandler struct { + b *backend.Backend +} + +func (bh *backendHandler) ServeTCP(ctx context.Context, c io.ReadWriteCloser, req *packp.GitProtoRequest) { + backendReq := backend.RequestFromProto(req) + if err := bh.b.Serve(ctx, c, c, backendReq); err != nil { + if rErr := renderError(c, fmt.Errorf("error serving request: %w", err)); rErr != nil { + _ = rErr + } + } +} // ServerContextKey is the context key used to store the server in the context. var ServerContextKey = &contextKey{"git-server"} From dc008766883d0dd75b9c25db7e36fae2f6a0453a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 08:42:23 +0000 Subject: [PATCH 3/4] fix: address code review - simplify ignored error in backendHandler.ServeTCP Agent-Logs-Url: https://github.com/go-git/cli/sessions/59e4b568-dc12-43b2-88e0-3025f7b6fa16 Co-authored-by: pjbgf <5452977+pjbgf@users.noreply.github.com> --- server/git/server.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/git/server.go b/server/git/server.go index cd59bec..12ffeb6 100644 --- a/server/git/server.go +++ b/server/git/server.go @@ -42,9 +42,8 @@ type backendHandler struct { func (bh *backendHandler) ServeTCP(ctx context.Context, c io.ReadWriteCloser, req *packp.GitProtoRequest) { backendReq := backend.RequestFromProto(req) if err := bh.b.Serve(ctx, c, c, backendReq); err != nil { - if rErr := renderError(c, fmt.Errorf("error serving request: %w", err)); rErr != nil { - _ = rErr - } + // Best-effort error notification; ignore if the write itself fails. + _ = renderError(c, fmt.Errorf("error serving request: %w", err)) } } From 4a5ff3f2728bdcfce7fa8cbb086cc743b7d79863 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 08:49:21 +0000 Subject: [PATCH 4/4] fix: move NewBackend after Handler declaration to satisfy funcorder lint rule Agent-Logs-Url: https://github.com/go-git/cli/sessions/04418706-009d-4bb7-be81-ad46f84db2ae Co-authored-by: pjbgf <5452977+pjbgf@users.noreply.github.com> --- server/git/server.go | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/server/git/server.go b/server/git/server.go index 12ffeb6..0a9eb5b 100644 --- a/server/git/server.go +++ b/server/git/server.go @@ -28,12 +28,29 @@ var ErrServerClosed = errors.New("server closed") // DefaultBackend is the default global Git transport server handler. var DefaultBackend Handler = NewBackend(nil) +// ServerContextKey is the context key used to store the server in the context. +var ServerContextKey = &contextKey{"git-server"} + +// Handler is the interface that handles TCP requests for the Git protocol. +type Handler interface { + // ServeTCP handles a TCP connection for the Git protocol. + ServeTCP(ctx context.Context, c io.ReadWriteCloser, req *packp.GitProtoRequest) +} + // NewBackend creates a [Handler] backed by the given [transport.Loader]. // If loader is nil, [transport.DefaultLoader] is used. func NewBackend(loader transport.Loader) Handler { return &backendHandler{b: backend.New(loader)} } +// HandlerFunc is a function that implements the Handler interface. +type HandlerFunc func(ctx context.Context, c io.ReadWriteCloser, req *packp.GitProtoRequest) + +// ServeTCP implements the Handler interface. +func (f HandlerFunc) ServeTCP(ctx context.Context, c io.ReadWriteCloser, req *packp.GitProtoRequest) { + f(ctx, c, req) +} + // backendHandler wraps a [backend.Backend] to implement the [Handler] interface. type backendHandler struct { b *backend.Backend @@ -47,23 +64,6 @@ func (bh *backendHandler) ServeTCP(ctx context.Context, c io.ReadWriteCloser, re } } -// ServerContextKey is the context key used to store the server in the context. -var ServerContextKey = &contextKey{"git-server"} - -// Handler is the interface that handles TCP requests for the Git protocol. -type Handler interface { - // ServeTCP handles a TCP connection for the Git protocol. - ServeTCP(ctx context.Context, c io.ReadWriteCloser, req *packp.GitProtoRequest) -} - -// HandlerFunc is a function that implements the Handler interface. -type HandlerFunc func(ctx context.Context, c io.ReadWriteCloser, req *packp.GitProtoRequest) - -// ServeTCP implements the Handler interface. -func (f HandlerFunc) ServeTCP(ctx context.Context, c io.ReadWriteCloser, req *packp.GitProtoRequest) { - f(ctx, c, req) -} - // Server is a TCP server that handles Git protocol requests. type Server struct { // Addr is the address to listen on. If empty, it defaults to ":9418".