diff options
-rw-r--r-- | internal/git/receivepack.go | 8 | ||||
-rw-r--r-- | internal/service/smarthttp/inforefs.go | 18 | ||||
-rw-r--r-- | internal/service/smarthttp/receive_pack.go | 12 | ||||
-rw-r--r-- | internal/service/ssh/receive_pack.go | 11 |
4 files changed, 30 insertions, 19 deletions
diff --git a/internal/git/receivepack.go b/internal/git/receivepack.go index f4dbdba8c..65d764573 100644 --- a/internal/git/receivepack.go +++ b/internal/git/receivepack.go @@ -29,15 +29,15 @@ func HookEnv(req ReceivePackRequest) []string { // ReceivePackConfig contains config options we want to enforce when // receiving a push with git-receive-pack. -func ReceivePackConfig() []string { - return []string{ - fmt.Sprintf("core.hooksPath=%s", hooks.Path()), +func ReceivePackConfig() []Option { + return []Option{ + ValueFlag{"-c", fmt.Sprintf("core.hooksPath=%s", hooks.Path())}, // In case the repository belongs to an object pool, we want to prevent // Git from including the pool's refs in the ref advertisement. We do // this by rigging core.alternateRefsCommand to produce no output. // Because Git itself will append the pool repository directory, the // command ends with a "#". The end result is that Git runs `/bin/sh -c 'exit 0 # /path/to/pool.git`. - "core.alternateRefsCommand=exit 0 #", + ValueFlag{"-c", "core.alternateRefsCommand=exit 0 #"}, } } diff --git a/internal/service/smarthttp/inforefs.go b/internal/service/smarthttp/inforefs.go index bff368250..e56745824 100644 --- a/internal/service/smarthttp/inforefs.go +++ b/internal/service/smarthttp/inforefs.go @@ -50,19 +50,19 @@ func handleInfoRefs(ctx context.Context, service string, req *gitalypb.InfoRefsR return err } - opts := req.GitConfigOptions + var globalOpts []git.Option if service == "receive-pack" { - opts = append(git.ReceivePackConfig(), opts...) + globalOpts = append(globalOpts, git.ReceivePackConfig()...) } - - var args []string - for _, params := range opts { - args = append(args, "-c", params) + for _, o := range req.GitConfigOptions { + globalOpts = append(globalOpts, git.ValueFlag{"-c", o}) } - args = append(args, service, "--stateless-rpc", "--advertise-refs", repoPath) - - cmd, err := git.BareCommand(ctx, nil, nil, nil, env, args...) + cmd, err := git.SafeBareCmd(ctx, nil, nil, nil, env, globalOpts, git.SubCmd{ + Name: service, + Flags: []git.Option{git.Flag{"--stateless-rpc"}, git.Flag{"--advertise-refs"}}, + Args: []string{repoPath}, + }) if err != nil { if _, ok := status.FromError(err); ok { diff --git a/internal/service/smarthttp/receive_pack.go b/internal/service/smarthttp/receive_pack.go index 4014d4ad8..e4b4e0bd8 100644 --- a/internal/service/smarthttp/receive_pack.go +++ b/internal/service/smarthttp/receive_pack.go @@ -48,10 +48,16 @@ func (s *server) PostReceivePack(stream gitalypb.SmartHTTPService_PostReceivePac env = git.AddGitProtocolEnv(ctx, req, env) env = append(env, command.GitEnv...) - opts := append(git.ReceivePackConfig(), req.GitConfigOptions...) + globalOpts := git.ReceivePackConfig() + for _, o := range req.GitConfigOptions { + globalOpts = append(globalOpts, git.ValueFlag{"-c", o}) + } - gitOptions := git.BuildGitOptions(opts, "receive-pack", "--stateless-rpc", repoPath) - cmd, err := git.BareCommand(ctx, stdin, stdout, nil, env, gitOptions...) + cmd, err := git.SafeBareCmd(ctx, stdin, stdout, nil, env, globalOpts, git.SubCmd{ + Name: "receive-pack", + Flags: []git.Option{git.Flag{"--stateless-rpc"}}, + Args: []string{repoPath}, + }) if err != nil { return status.Errorf(codes.Unavailable, "PostReceivePack: %v", err) diff --git a/internal/service/ssh/receive_pack.go b/internal/service/ssh/receive_pack.go index 170a28b5c..89d743d3e 100644 --- a/internal/service/ssh/receive_pack.go +++ b/internal/service/ssh/receive_pack.go @@ -60,10 +60,15 @@ func sshReceivePack(stream gitalypb.SSHService_SSHReceivePackServer, req *gitaly env = git.AddGitProtocolEnv(ctx, req, env) env = append(env, command.GitEnv...) - opts := append(git.ReceivePackConfig(), req.GitConfigOptions...) + globalOpts := git.ReceivePackConfig() + for _, o := range req.GitConfigOptions { + globalOpts = append(globalOpts, git.ValueFlag{"-c", o}) + } - gitOptions := git.BuildGitOptions(opts, "receive-pack", repoPath) - cmd, err := git.BareCommand(ctx, stdin, stdout, stderr, env, gitOptions...) + cmd, err := git.SafeBareCmd(ctx, stdin, stdout, stderr, env, globalOpts, git.SubCmd{ + Name: "receive-pack", + Args: []string{repoPath}, + }) if err != nil { return fmt.Errorf("start cmd: %v", err) |