diff options
Diffstat (limited to 'go/internal/handler/exec.go')
-rw-r--r-- | go/internal/handler/exec.go | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/go/internal/handler/exec.go b/go/internal/handler/exec.go index 1f3177d..277d08c 100644 --- a/go/internal/handler/exec.go +++ b/go/internal/handler/exec.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "os" + "strings" "gitlab.com/gitlab-org/gitaly/auth" "gitlab.com/gitlab-org/gitaly/client" @@ -11,6 +12,7 @@ import ( "gitlab.com/gitlab-org/gitlab-shell/go/internal/config" "gitlab.com/gitlab-org/labkit/tracing" "google.golang.org/grpc" + "google.golang.org/grpc/metadata" ) // GitalyHandlerFunc implementations are responsible for making @@ -29,6 +31,7 @@ type GitalyCommand struct { ServiceName string Address string Token string + Features map[string]string } // RunGitalyCommand provides a bootstrap for Gitaly commands executed @@ -48,6 +51,18 @@ func (gc *GitalyCommand) RunGitalyCommand(handler GitalyHandlerFunc) error { return err } +func withOutgoingMetadata(ctx context.Context, features map[string]string) context.Context { + md := metadata.New(nil) + for k, v := range features { + if !strings.HasPrefix(k, "gitaly-feature-") { + continue + } + md.Append(k, v) + } + + return metadata.NewOutgoingContext(ctx, md) +} + func getConn(gc *GitalyCommand) (*GitalyConn, error) { if gc.Address == "" { return nil, fmt.Errorf("no gitaly_address given") @@ -80,6 +95,7 @@ func getConn(gc *GitalyCommand) (*GitalyConn, error) { ) ctx, finished := tracing.ExtractFromEnv(context.Background()) + ctx = withOutgoingMetadata(ctx, gc.Features) conn, err := client.Dial(gc.Address, connOpts) if err != nil { |