diff --git a/internal/gitaly/service/diff/commit_diff_test.go b/internal/gitaly/service/diff/commit_diff_test.go index fc7cd89f7bd3b953cd545c102890cebd63fd95d6..40b21f7ea3ab2f59b0967a7c22d904d0d4a11d35 100644 --- a/internal/gitaly/service/diff/commit_diff_test.go +++ b/internal/gitaly/service/diff/commit_diff_test.go @@ -2,6 +2,7 @@ package diff import ( "errors" + "fmt" "io" "strings" "testing" @@ -1134,7 +1135,11 @@ func TestCommitDiff_nonexistentCommit(t *testing.T) { }) require.NoError(t, err) - testhelper.RequireGrpcError(t, structerr.NewFailedPrecondition("eachDiff: exit status 128"), drainCommitDiffResponse(stream)) + testhelper.RequireGrpcError(t, testhelper.WithInterceptedMetadata( + structerr.NewFailedPrecondition("eachDiff: exit status 128"), + "stderr", fmt.Sprintf("fatal: bad object %s\n", nonExistentCommitID.String()), + ), + drainCommitDiffResponse(stream)) } func getDiffsFromCommitDiffClient(t *testing.T, client gitalypb.DiffService_CommitDiffClient) []*diff.Diff { diff --git a/internal/gitaly/service/diff/utils.go b/internal/gitaly/service/diff/utils.go index 5b53cd63e6a5629e253ac5ab6c82ce7b9d7fcf1f..81558182deddfaa637152785ec9a28f2cb416b15 100644 --- a/internal/gitaly/service/diff/utils.go +++ b/internal/gitaly/service/diff/utils.go @@ -1,6 +1,7 @@ package diff import ( + "bytes" "context" "errors" @@ -36,7 +37,8 @@ func validateRequest(ctx context.Context, locator storage.Locator, in requestWit func (s *server) eachDiff(ctx context.Context, repo *localrepo.Repo, objectHash git.ObjectHash, subCmd gitcmd.Command, limits diff.Limits, callback func(*diff.Diff) error) error { diffConfig := gitcmd.ConfigPair{Key: "diff.noprefix", Value: "false"} - cmd, err := repo.Exec(ctx, subCmd, gitcmd.WithConfig(diffConfig), gitcmd.WithSetupStdout()) + var cmdStderr bytes.Buffer + cmd, err := repo.Exec(ctx, subCmd, gitcmd.WithConfig(diffConfig), gitcmd.WithSetupStdout(), gitcmd.WithStderr(&cmdStderr)) if err != nil { return structerr.NewInternal("cmd: %w", err) } @@ -54,7 +56,9 @@ func (s *server) eachDiff(ctx context.Context, repo *localrepo.Repo, objectHash } if err := cmd.Wait(); err != nil { - return structerr.NewFailedPrecondition("%w", err) + return structerr.NewFailedPrecondition("%w", err).WithMetadataItems( + structerr.MetadataItem{Key: "stderr", Value: cmdStderr.String()}, + ) } return nil