summaryrefslogtreecommitdiff
path: root/go/internal/handler/exec.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/internal/handler/exec.go')
-rw-r--r--go/internal/handler/exec.go16
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 {