Skip to content

Normalize line endings in noarch packages for reproducibility#2193

Open
wolfv wants to merge 2 commits intomainfrom
claude/fix-issue-837-P8Qz0
Open

Normalize line endings in noarch packages for reproducibility#2193
wolfv wants to merge 2 commits intomainfrom
claude/fix-issue-837-P8Qz0

Conversation

@wolfv
Copy link
Member

@wolfv wolfv commented Feb 20, 2026

Summary

This PR adds line ending normalization for noarch packages to ensure reproducible builds across Windows and Unix platforms. Text files in noarch packages now have CRLF line endings converted to LF, while binary files remain unchanged.

Key Changes

  • Added copy_with_normalized_line_endings() function that:

    • Detects whether a file is text or binary using content inspection
    • Converts CRLF (\r\n) to LF (\n) for text files
    • Preserves binary files unchanged
    • Maintains file permissions on Unix systems
  • Modified write_to_dest() to use the new normalization function for Platform::NoArch packages while preserving existing behavior for platform-specific packages

  • Added comprehensive test coverage:

    • test_copy_with_normalized_line_endings_text: Verifies CRLF→LF conversion
    • test_copy_with_normalized_line_endings_binary_unchanged: Ensures binary files are not modified
    • test_copy_with_normalized_line_endings_lf_unchanged: Confirms LF-only files remain unchanged

Implementation Details

  • Uses content_inspector crate to intelligently detect text vs. binary files by inspecting the first 1024 bytes
  • Implements efficient byte-level CRLF stripping without allocating intermediate strings
  • Only applies normalization to noarch packages (both generic and Python variants) to avoid affecting platform-specific builds
  • Addresses issue Textfiles for noarch: generic or noarch: python should have the unix line ending #837 regarding reproducibility across Windows and Unix builds

https://claude.ai/code/session_01JwVrTPt44TBuDuNtAYvgW5

For `noarch: generic` and `noarch: python` packages, text files are now
copied with CRLF line endings converted to LF. This ensures that packages
built on Windows produce identical output to those built on Unix, which is
required for reproducible builds.

Fixes #837

https://claude.ai/code/session_01JwVrTPt44TBuDuNtAYvgW5
Replace the empty `if` branch (clippy::needless_if) with a negated
condition, and merge the three separate copy_with_normalized_line_endings
tests into one terse parameterised test.

https://claude.ai/code/session_01JwVrTPt44TBuDuNtAYvgW5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants