diff options
-rw-r--r-- | cmd/gitaly-git2go/commit/commit.go | 10 | ||||
-rw-r--r-- | internal/git2go/commit.go | 6 | ||||
-rw-r--r-- | internal/gitaly/service/operations/commit_files.go | 2 | ||||
-rw-r--r-- | internal/gitaly/service/operations/commit_files_test.go | 12 |
4 files changed, 30 insertions, 0 deletions
diff --git a/cmd/gitaly-git2go/commit/commit.go b/cmd/gitaly-git2go/commit/commit.go index c8051c7a2..8522e7f7c 100644 --- a/cmd/gitaly-git2go/commit/commit.go +++ b/cmd/gitaly-git2go/commit/commit.go @@ -88,6 +88,16 @@ func commit(ctx context.Context, params git2go.CommitParams) (string, error) { } func apply(action git2go.Action, repo *git.Repository, index *git.Index) error { + err := applyHelper(action, repo, index) + + if git.IsErrorClass(err, git.ErrClassIndex) { + return git2go.IndexError(err.Error()) + } + + return err +} + +func applyHelper(action git2go.Action, repo *git.Repository, index *git.Index) error { switch action := action.(type) { case git2go.ChangeFileMode: return applyChangeFileMode(action, index) diff --git a/internal/git2go/commit.go b/internal/git2go/commit.go index 2a9478609..f512643ce 100644 --- a/internal/git2go/commit.go +++ b/internal/git2go/commit.go @@ -33,6 +33,12 @@ func (err DirectoryExistsError) Error() string { return fmt.Sprintf("directory exists: %q", string(err)) } +type IndexError string + +func (err IndexError) Error() string { + return fmt.Sprintf("index error: %q", string(err)) +} + // CommitParams contains the information and the steps to build a commit. type CommitParams struct { // Repository is the path of the repository to operate on. diff --git a/internal/gitaly/service/operations/commit_files.go b/internal/gitaly/service/operations/commit_files.go index 2e8d70f29..d72f8e796 100644 --- a/internal/gitaly/service/operations/commit_files.go +++ b/internal/gitaly/service/operations/commit_files.go @@ -81,6 +81,8 @@ func (s *Server) UserCommitFiles(stream gitalypb.OperationService_UserCommitFile switch { case errors.As(err, &indexError): response = gitalypb.UserCommitFilesResponse{IndexError: indexError.Error()} + case errors.As(err, new(git2go.IndexError)): + response = gitalypb.UserCommitFilesResponse{IndexError: err.Error()} case errors.As(err, new(git2go.DirectoryExistsError)): response = gitalypb.UserCommitFilesResponse{IndexError: "A directory with this name already exists"} case errors.As(err, new(git2go.FileExistsError)): diff --git a/internal/gitaly/service/operations/commit_files_test.go b/internal/gitaly/service/operations/commit_files_test.go index e72151e9f..d2f7415ec 100644 --- a/internal/gitaly/service/operations/commit_files_test.go +++ b/internal/gitaly/service/operations/commit_files_test.go @@ -233,6 +233,18 @@ func testUserCommitFiles(t *testing.T, ctx context.Context) { }, }, { + desc: "create file with .git/hooks/pre-commit", + steps: []step{ + { + actions: []*gitalypb.UserCommitFilesRequest{ + createFileHeaderRequest(".git/hooks/pre-commit"), + actionContentRequest("content-1"), + }, + indexError: "invalid path: '.git/hooks/pre-commit'", + }, + }, + }, + { desc: "create file without content", steps: []step{ { |