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{})
}