internal/gitaly/service/repository/set_custom_hooks.go (55 lines of code) (raw):

package repository import ( "gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/repoutil" "gitlab.com/gitlab-org/gitaly/v16/internal/structerr" "gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb" "gitlab.com/gitlab-org/gitaly/v16/streamio" ) // SetCustomHooks sets the git hooks for a repository. The hooks are sent in a // tar archive containing a `custom_hooks` directory. This directory is // ultimately extracted to the repository. func (s *server) SetCustomHooks(stream gitalypb.RepositoryService_SetCustomHooksServer) error { ctx := stream.Context() firstRequest, err := stream.Recv() if err != nil { return structerr.NewInternal("getting first request: %w", err) } repo := firstRequest.GetRepository() if err := s.locator.ValidateRepository(ctx, repo); err != nil { return structerr.NewInvalidArgument("%w", err) } reader := streamio.NewReader(func() ([]byte, error) { if firstRequest != nil { data := firstRequest.GetData() firstRequest = nil return data, nil } request, err := stream.Recv() return request.GetData(), err }) if err := repoutil.SetCustomHooks(ctx, s.logger, s.locator, s.txManager, reader, repo); err != nil { return structerr.NewInternal("setting custom hooks: %w", err) } return stream.SendAndClose(&gitalypb.SetCustomHooksResponse{}) } // RestoreCustomHooks sets the git hooks for a repository. The hooks are sent in // a tar archive containing a `custom_hooks` directory. This directory is // ultimately extracted to the repository. func (s *server) RestoreCustomHooks(stream gitalypb.RepositoryService_RestoreCustomHooksServer) error { ctx := stream.Context() firstRequest, err := stream.Recv() if err != nil { return structerr.NewInternal("getting first request: %w", err) } repo := firstRequest.GetRepository() if err := s.locator.ValidateRepository(ctx, repo); err != nil { return structerr.NewInvalidArgument("%w", err) } reader := streamio.NewReader(func() ([]byte, error) { if firstRequest != nil { data := firstRequest.GetData() firstRequest = nil return data, nil } request, err := stream.Recv() return request.GetData(), err }) if err := repoutil.SetCustomHooks(ctx, s.logger, s.locator, s.txManager, reader, repo); err != nil { return structerr.NewInternal("setting custom hooks: %w", err) } return stream.SendAndClose(&gitalypb.RestoreCustomHooksResponse{}) }