Regression in GitLab with latest Git master
When updating the gitlab repository with the latest gitaly verison, we see specs breaking
$ cat GITALY_SERVER_VERSION
26746f728c826dbb57dac65f8240e56ca00655f9
Debug logs from a breaking spec
$ bundle exec rspec spec/features/merge_request/user_views_diffs_commit_spec.rb
Run options: include {:focus=>true}
All examples were filtered out; ignoring {:focus=>true}
Test environment set up in 0.5666689489989949 seconds
Starting the Capybara driver server...
Capybara starting Puma...
* Version 6.6.1, codename: Return to Forever
* Min threads: 0, max threads: 4
* Listening on unix:///tmp/20251029-65441-uyudk8
================================================================================
GITALY REQUEST DETAILS
Request: {:repository=>{:storage_name=>"default", :relative_path=>"@hashed/81/b8/81b8a03f97e8787c53fe1a86bda042b6f0de9b0ec9c09357e107c99ba4d6948a.git", :git_object_directory=>"", :git_alternate_object_directories=>[], :gl_repository=>"project-62", :gl_project_path=>"namespace1/project-1"}, :left_commit_id=>"ae73cb07c9eeaf35924a10f713b364d32b2dd34f", :right_commit_id=>"5937ac0a7beb003549fc5fd26fc247adbce4a52e", :paths=>[], :collapse_diffs=>false, :enforce_limits=>true, :max_files=>1000, :max_lines=>50000, :max_bytes=>5120000, :safe_max_files=>100, :safe_max_lines=>5000, :safe_max_bytes=>512000, :max_patch_bytes=>204800, :diff_mode=>:DEFAULT, :max_patch_bytes_for_file_extension=>{}, :whitespace_changes=>:WHITESPACE_CHANGES_UNSPECIFIED, :collect_all_paths=>false}
================================================================================
================================================================================
GITALY REQUEST DETAILS
Request: {:repository=>{:storage_name=>"default", :relative_path=>"@hashed/81/b8/81b8a03f97e8787c53fe1a86bda042b6f0de9b0ec9c09357e107c99ba4d6948a.git", :git_object_directory=>"", :git_alternate_object_directories=>[], :gl_repository=>"project-62", :gl_project_path=>"namespace1/project-1"}, :left_commit_id=>"570e7b2abdd848b95f2f578043fc23bd6f6fd24d", :right_commit_id=>"5937ac0a7beb003549fc5fd26fc247adbce4a52e", :paths=>[], :collapse_diffs=>false, :enforce_limits=>true, :max_files=>100, :max_lines=>5000, :max_bytes=>512000, :safe_max_files=>100, :safe_max_lines=>5000, :safe_max_bytes=>512000, :max_patch_bytes=>204800, :diff_mode=>:DEFAULT, :max_patch_bytes_for_file_extension=>{}, :whitespace_changes=>:WHITESPACE_CHANGES_UNSPECIFIED, :collect_all_paths=>false}
================================================================================
================================================================================
GITALY REQUEST DETAILS
Request: {:repository=>{:storage_name=>"default", :relative_path=>"@hashed/81/b8/81b8a03f97e8787c53fe1a86bda042b6f0de9b0ec9c09357e107c99ba4d6948a.git", :git_object_directory=>"", :git_alternate_object_directories=>[], :gl_repository=>"project-62", :gl_project_path=>"namespace1/project-1"}, :left_commit_id=>"570e7b2abdd848b95f2f578043fc23bd6f6fd24d", :right_commit_id=>"5937ac0a7beb003549fc5fd26fc247adbce4a52e", :paths=>[], :collapse_diffs=>true, :enforce_limits=>true, :max_files=>1000, :max_lines=>50000, :max_bytes=>5120000, :safe_max_files=>100, :safe_max_lines=>5000, :safe_max_bytes=>512000, :max_patch_bytes=>204800, :diff_mode=>:DEFAULT, :max_patch_bytes_for_file_extension=>{}, :whitespace_changes=>:WHITESPACE_CHANGES_IGNORE_ALL, :collect_all_paths=>false}
================================================================================
2025-10-29 10:54:39 +0000 Rack app ("GET /namespace1/project-1/-/merge_requests/1/diffs_metadata.jsoncommit_id=5937ac0a7beb003549fc5fd26fc247adbce4a52e&diff_head=true&view=inline&w=1" - (127.0.0.1)): #<GRPC::Internal: 13:eachDiff: parse failure: diff header regexp mismatch. debug_error_string:{UNKNOWN:Error received from peer unix:tmp/tests/gitaly/praefect.socket {grpc_status:13, grpc_message:"eachDiff: parse failure: diff header regexp mismatch"}}>
================================================================================
GITALY REQUEST DETAILS
Request: {:repository=>{:storage_name=>"default", :relative_path=>"@hashed/81/b8/81b8a03f97e8787c53fe1a86bda042b6f0de9b0ec9c09357e107c99ba4d6948a.git", :git_object_directory=>"", :git_alternate_object_directories=>[], :gl_repository=>"project-62", :gl_project_path=>"namespace1/project-1"}, :left_commit_id=>"570e7b2abdd848b95f2f578043fc23bd6f6fd24d", :right_commit_id=>"5937ac0a7beb003549fc5fd26fc247adbce4a52e", :paths=>[], :collapse_diffs=>true, :enforce_limits=>true, :max_files=>1000, :max_lines=>50000, :max_bytes=>5120000, :safe_max_files=>100, :safe_max_lines=>5000, :safe_max_bytes=>512000, :max_patch_bytes=>204800, :diff_mode=>:DEFAULT, :max_patch_bytes_for_file_extension=>{}, :whitespace_changes=>:WHITESPACE_CHANGES_UNSPECIFIED, :collect_all_paths=>false}
================================================================================
================================================================================
GITALY REQUEST DETAILS
Request: {:repository=>{:storage_name=>"default", :relative_path=>"@hashed/81/b8/81b8a03f97e8787c53fe1a86bda042b6f0de9b0ec9c09357e107c99ba4d6948a.git", :git_object_directory=>"", :git_alternate_object_directories=>[], :gl_repository=>"project-62", :gl_project_path=>"namespace1/project-1"}, :left_commit_id=>"570e7b2abdd848b95f2f578043fc23bd6f6fd24d", :right_commit_id=>"5937ac0a7beb003549fc5fd26fc247adbce4a52e", :paths=>[], :collapse_diffs=>true, :enforce_limits=>true, :max_files=>1000, :max_lines=>50000, :max_bytes=>5120000, :safe_max_files=>100, :safe_max_lines=>5000, :safe_max_bytes=>512000, :max_patch_bytes=>204800, :diff_mode=>:DEFAULT, :max_patch_bytes_for_file_extension=>{}, :whitespace_changes=>:WHITESPACE_CHANGES_UNSPECIFIED, :collect_all_paths=>false}
================================================================================
================================================================================
GITALY REQUEST DETAILS
Request: {:repository=>{:storage_name=>"default", :relative_path=>"@hashed/81/b8/81b8a03f97e8787c53fe1a86bda042b6f0de9b0ec9c09357e107c99ba4d6948a.git", :git_object_directory=>"", :git_alternate_object_directories=>[], :gl_repository=>"project-62", :gl_project_path=>"namespace1/project-1"}, :left_commit_id=>"570e7b2abdd848b95f2f578043fc23bd6f6fd24d", :right_commit_id=>"5937ac0a7beb003549fc5fd26fc247adbce4a52e", :paths=>[], :collapse_diffs=>false, :enforce_limits=>true, :max_files=>100, :max_lines=>5000, :max_bytes=>512000, :safe_max_files=>100, :safe_max_lines=>5000, :safe_max_bytes=>512000, :max_patch_bytes=>204800, :diff_mode=>:DEFAULT, :max_patch_bytes_for_file_extension=>{}, :whitespace_changes=>:WHITESPACE_CHANGES_UNSPECIFIED, :collect_all_paths=>false}
================================================================================
================================================================================
GITALY REQUEST DETAILS
Request: {:repository=>{:storage_name=>"default", :relative_path=>"@hashed/81/b8/81b8a03f97e8787c53fe1a86bda042b6f0de9b0ec9c09357e107c99ba4d6948a.git", :git_object_directory=>"", :git_alternate_object_directories=>[], :gl_repository=>"project-62", :gl_project_path=>"namespace1/project-1"}, :left_commit_id=>"570e7b2abdd848b95f2f578043fc23bd6f6fd24d", :right_commit_id=>"5937ac0a7beb003549fc5fd26fc247adbce4a52e", :paths=>[], :collapse_diffs=>true, :enforce_limits=>true, :max_files=>1000, :max_lines=>50000, :max_bytes=>5120000, :safe_max_files=>100, :safe_max_lines=>5000, :safe_max_bytes=>512000, :max_patch_bytes=>204800, :diff_mode=>:DEFAULT, :max_patch_bytes_for_file_extension=>{}, :whitespace_changes=>:WHITESPACE_CHANGES_IGNORE_ALL, :collect_all_paths=>false}
================================================================================
2025-10-29 10:54:46 +0000 Rack app ("GET /namespace1/project-1/-/merge_requests/1/diffs_batch.jsoncommit_id=5937ac0a7beb003549fc5fd26fc247adbce4a52e&diff_head=true&page=0&per_page=5&view=inline&w=1" - (127.0.0.1)): #<GRPC::Internal: 13:eachDiff: parse failure: diff header regexp mismatch. debug_error_string:{UNKNOWN:Error received from peer unix:tmp/tests/gitaly/praefect.socket {grpc_status:13, grpc_message:"eachDiff: parse failure: diff header regexp mismatch"}}>
WARN: Screenshot could not be saved. `page.current_path` is empty.
F
Failures:
1) User views diff by commit shows full commit description by default
Failure/Error: value = recording_request { response.next }
GRPC::Internal:
13:eachDiff: parse failure: diff header regexp mismatch. debug_error_string:{UNKNOWN:Error received from peer unix:tmp/tests/gitaly/praefect.socket {grpc_status:13, grpc_message:"eachDiff: parse failure: diff header regexp mismatch"}}
# ./config/initializers/enumerator_next_patch.rb:11:in `block (2 levels) in <module:EnumeratorNextPatch>'
# ./lib/gitlab/gitaly_client/call.rb:46:in `block (3 levels) in instrument_stream'
# ./lib/gitlab/gitaly_client/call.rb:61:in `recording_request'
# ./lib/gitlab/gitaly_client/call.rb:46:in `block (2 levels) in instrument_stream'
# ./lib/gitlab/gitaly_client/call.rb:45:in `block in instrument_stream'
# ./lib/gitlab/gitaly_client/diff_stitcher.rb:20:in `each'
# ./lib/gitlab/gitaly_client/diff_stitcher.rb:20:in `each'
# ./lib/gitlab/gitaly_client/diff_stitcher.rb:20:in `each'
# ./lib/gitlab/git/diff_collection.rb:175:in `each_with_index'
# ./lib/gitlab/git/diff_collection.rb:175:in `each_gitaly_patch'
# ./lib/gitlab/git/diff_collection.rb:59:in `each'
# ./lib/gitlab/git/diff_collection.rb:135:in `each_with_index'
# ./lib/gitlab/git/diff_collection.rb:135:in `decorate!'
# ./lib/gitlab/diff/file_collection/base.rb:41:in `block in raw_diff_files'
# ./gems/gitlab-utils/lib/gitlab/utils/strong_memoize.rb:34:in `strong_memoize'
# ./lib/gitlab/diff/file_collection/base.rb:40:in `raw_diff_files'
# ./lib/gitlab/diff/file_collection/base.rb:11:in `real_size'
# ./app/serializers/base_serializer.rb:16:in `represent'
# ./app/controllers/projects/merge_requests/diffs_controller.rb:98:in `diffs_metadata'
# ./app/controllers/application_controller.rb:537:in `block in allow_gitaly_ref_name_caching'
# ./lib/gitlab/gitaly_client.rb:486:in `allow_ref_name_caching'
# ./app/controllers/application_controller.rb:536:in `allow_gitaly_ref_name_caching'
# ./app/controllers/application_controller.rb:489:in `set_current_admin'
# ./lib/gitlab/session.rb:11:in `with_session'
# ./app/controllers/application_controller.rb:479:in `set_session_storage'
# ./lib/gitlab/i18n.rb:116:in `with_locale'
# ./app/controllers/application_controller.rb:472:in `set_locale'
# ./app/controllers/application_controller.rb:459:in `set_current_context'
# ./lib/gitlab/ip_address_state.rb:11:in `with'
# ./app/controllers/application_controller.rb:465:in `set_current_ip_address'
# ./lib/gitlab/middleware/action_controller_static_context.rb:23:in `call'
# ./config/initializers/action_dispatch_journey_router.rb:52:in `block in find_routes'
# ./config/initializers/action_dispatch_journey_router.rb:25:in `map!'
# ./config/initializers/action_dispatch_journey_router.rb:25:in `find_routes'
# ./lib/gitlab/middleware/sidekiq_shard_awareness_validation.rb:20:in `block in call'
# ./lib/gitlab/sidekiq_sharding/validator.rb:42:in `enabled'
# ./lib/gitlab/middleware/sidekiq_shard_awareness_validation.rb:20:in `call'
# ./lib/gitlab/middleware/memory_report.rb:13:in `call'
# ./lib/gitlab/middleware/speedscope.rb:13:in `call'
# ./lib/gitlab/query_limiting/middleware.rb:16:in `call'
# ./lib/gitlab/middleware/go.rb:21:in `call'
# ./lib/gitlab/etag_caching/middleware.rb:21:in `call'
# ./lib/gitlab/middleware/query_analyzer.rb:11:in `block in call'
# ./lib/gitlab/middleware/query_analyzer.rb:11:in `call'
# ./lib/ci/job_token/middleware.rb:11:in `call'
# ./lib/gitlab/middleware/multipart.rb:176:in `call'
# ./lib/gitlab/middleware/rack_attack_headers.rb:43:in `call'
# ./lib/gitlab/middleware/read_only/controller.rb:40:in `call'
# ./lib/gitlab/middleware/read_only.rb:18:in `call'
# ./lib/gitlab/middleware/unauthenticated_session_expiry.rb:18:in `call'
# ./lib/gitlab/middleware/secure_headers.rb:11:in `call'
# ./lib/gitlab/middleware/strip_cookies.rb:29:in `call'
# ./lib/gitlab/middleware/same_site_cookies.rb:27:in `call'
# ./lib/gitlab/middleware/path_traversal_check.rb:40:in `call'
# ./lib/gitlab/middleware/handle_malformed_strings.rb:19:in `call'
# ./lib/gitlab/middleware/json_validation.rb:165:in `call'
# ./lib/gitlab/middleware/basic_health_check.rb:25:in `call'
# ./lib/gitlab/middleware/handle_ip_spoof_attack_error.rb:25:in `call'
# ./lib/gitlab/middleware/request_context.rb:15:in `call'
# ./lib/gitlab/middleware/webhook_recursion_detection.rb:15:in `call'
# ./config/initializers/fix_local_cache_middleware.rb:11:in `call'
# ./lib/gitlab/middleware/compressed_json.rb:44:in `call'
# ./lib/gitlab/middleware/static.rb:11:in `call'
# ./lib/gitlab/webpack/dev_server_middleware.rb:34:in `perform_request'
# ./lib/gitlab/testing/clear_process_memory_cache_middleware.rb:13:in `call'
# ./lib/gitlab/testing/request_inspector_middleware.rb:35:in `call'
# ./lib/gitlab/testing/robots_blocker_middleware.rb:30:in `call'
# ./lib/gitlab/testing/request_blocker_middleware.rb:47:in `call'
# ./lib/gitlab/middleware/rack_multipart_tempfile_factory.rb:19:in `call'
# ./lib/gitlab/metrics/requests_rack_middleware.rb:83:in `call'
# ./lib/gitlab/middleware/sidekiq_web_static.rb:20:in `call'
# ------------------
# --- Caused by: ---
# Capybara::CapybaraError:
# Your application server raised an error - It has been raised in your test code because Capybara.raise_server_errors == true
# ./spec/support/capybara.rb:239:in `block (2 levels) in <main>'
Finished in 23.92 seconds (files took 15.22 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/features/merge_request/user_views_diffs_commit_spec.rb:21 # User views diff by commit shows full commit description by default
While the regression is due to a fix in Git, it might be that the fix lies in Gitaly.