diff --git a/internal/service/hooks/pre_receive.go b/internal/service/hooks/pre_receive.go index e855d25845b0de2a7eae34fa45f024c40f54ecfb..9718e0bf75241f4801fbf7e7e8bd63d7fd6bbc66 100644 --- a/internal/service/hooks/pre_receive.go +++ b/internal/service/hooks/pre_receive.go @@ -5,6 +5,7 @@ import ( "fmt" "os/exec" "path/filepath" + "strings" "gitlab.com/gitlab-org/gitaly/internal/config" "gitlab.com/gitlab-org/gitaly/internal/gitlabshell" @@ -24,6 +25,13 @@ func hookRequestEnv(req hookRequest) ([]string, error) { fmt.Sprintf("GL_REPOSITORY=%s", req.GetRepository().GetGlRepository())), nil } +func preReceiveEnv(repo *gitalypb.Repository) []string { + return []string{ + fmt.Sprintf("GIT_OBJECT_DIRECTORY=%s", repo.GetGitObjectDirectory()), + fmt.Sprintf("GIT_ALTERNATE_OBJECT_DIRECTORIES=%s", strings.Join(repo.GitAlternateObjectDirectories, ":")), + } +} + func gitlabShellHook(hookName string) string { return filepath.Join(config.Config.Ruby.Dir, "gitlab-shell", "hooks", hookName) } @@ -43,6 +51,7 @@ func (s *server) PreReceiveHook(stream gitalypb.HookService_PreReceiveHookServer return helper.ErrInternal(err) } + hookEnv = append(hookEnv, preReceiveEnv(firstRequest.GetRepository())...) hookEnv = append(hookEnv, fmt.Sprintf("GL_PROTOCOL=%s", firstRequest.GetProtocol())) stdin := streamio.NewReader(func() ([]byte, error) { diff --git a/internal/service/hooks/pre_receive_test.go b/internal/service/hooks/pre_receive_test.go index 08af19aee6263ec430d9ce4e740b04f10c79db66..72b16365445052b927ac8a0a3c8f61df526d81e3 100644 --- a/internal/service/hooks/pre_receive_test.go +++ b/internal/service/hooks/pre_receive_test.go @@ -51,6 +51,11 @@ func TestPreReceive(t *testing.T) { testRepo, _, cleanupFn := testhelper.NewTestRepo(t) defer cleanupFn() + gitObjectDir := "/some/dir" + gitAlternateObjectDirs := []string{"a", "b", "c"} + testRepo.GitObjectDirectory = gitObjectDir + testRepo.GitAlternateObjectDirectories = gitAlternateObjectDirs + client, conn := newHooksClient(t, serverSocketPath) defer conn.Close() diff --git a/internal/service/hooks/testdata/gitlab-shell/hooks/pre-receive b/internal/service/hooks/testdata/gitlab-shell/hooks/pre-receive index fc967a761b87920014a2486edcc628fe53ecaf1d..da4aacbdfdcec800d993b1b05f04299b67a03732 100755 --- a/internal/service/hooks/testdata/gitlab-shell/hooks/pre-receive +++ b/internal/service/hooks/testdata/gitlab-shell/hooks/pre-receive @@ -3,7 +3,7 @@ # Tests inputs to pre-receive abort("FAIL") if $stdin.read.empty? -abort("FAIL") if %w[GL_ID GL_REPOSITORY GL_PROTOCOL].any? { |k| ENV[k].empty? } +abort("FAIL") if %w[GL_ID GL_REPOSITORY GL_PROTOCOL GIT_OBJECT_DIRECTORY GIT_ALTERNATE_OBJECT_DIRECTORIES].any? { |k| ENV[k].empty? } puts "OK"