Skip to content

Support process substitution for --filelist= - #4349

Merged
Cyan4973 merged 9 commits into
facebook:devfrom
Cyan4973:devfd
Mar 28, 2025
Merged

Support process substitution for --filelist=#4349
Cyan4973 merged 9 commits into
facebook:devfrom
Cyan4973:devfd

Conversation

@Cyan4973

@Cyan4973Cyan4973 commented Mar 25, 2025

Copy link
Copy Markdown
Contributor

--filelist capability was designed with the assumption that the source is a file, so it would be possible to know its size in advance, for allocation.

Rewrote the capability, so that it can stream data, and discover source size at the end.

solves #4340

The new capability has been tested locally, on a posix laptop.

An issue is on the testing side: process substitution is not supported by sh, and all our shell test scripts are using sh so far, for broader compatibility with diverse clients.
Adding a bash script is not in itself a problem, but then it can not be blindly started on any platform, since some do not support bash. Hence the corresponding CI test must be explicitly triggered.

@Cyan4973Cyan4973 self-assigned this Mar 25, 2025
@Cyan4973
Cyan4973 marked this pull request as draft March 25, 2025 22:13
@Cyan4973
Cyan4973 marked this pull request as ready for review March 25, 2025 23:40
@Cyan4973
Cyan4973 merged commit c5926fb into facebook:devMar 28, 2025
jaypatrickhoward added a commit to jaypatrickhoward/zstd that referenced this pull request Sep 7, 2026
`--filelist` stopped accepting Windows CRLF line endings in 165e52c
("first implementation supporting Process Substitution", facebook#4349). That
rewrite reads the list into a buffer opened in binary mode and splits it
on '\n' alone. Previously the list was opened in text mode, where the
Windows CRT translated CRLF to LF before the parser saw it, so stripping
'\n' was sufficient. In binary mode the CR survives into every path:
zstd: can't stat a.txt : No such file or directory -- ignored
The '\r' is invisible in that message, which makes it awkward to
diagnose.
Strip a trailing '\r' when the line pointers are built, but only on
Windows, where CRLF is the native line separator and a '\r' cannot be
used in a filename. Elsewhere '\r' is a legal filename byte and is left
alone, so behaviour on those platforms is unchanged. This restores the
pre-regression behaviour exactly, on every platform, without adding a
new one.
Adds a playTests case, guarded to Windows, that fails without the fix.
jaypatrickhoward added a commit to jaypatrickhoward/zstd that referenced this pull request Sep 7, 2026
`--filelist` stopped accepting Windows CRLF line endings in 165e52c
("first implementation supporting Process Substitution", facebook#4349). That
rewrite reads the list into a buffer opened in binary mode and splits it
on '\n' alone. Previously the list was opened in text mode, where the
Windows CRT translated CRLF to LF before the parser saw it, so stripping
'\n' was sufficient. In binary mode the CR survives into every path:
zstd: can't stat a.txt : No such file or directory -- ignored
The '\r' is invisible in that message, which makes it awkward to
diagnose.
Strip a trailing '\r' when the line pointers are built, but only on
Windows, where CRLF is the native line separator and a '\r' cannot be
used in a filename. Elsewhere '\r' is a legal filename byte and is left
alone, so behaviour on those platforms is unchanged. This restores the
pre-regression behaviour exactly, on every platform, without adding a
new one.
Adds a playTests case, guarded to Windows, that fails without the fix.
jaypatrickhoward added a commit to jaypatrickhoward/zstd that referenced this pull request Sep 7, 2026
`--filelist` stopped accepting Windows CRLF line endings in 165e52c
("first implementation supporting Process Substitution", facebook#4349). That
rewrite reads the list into a buffer opened in binary mode and splits it
on '\n' alone. Previously the list was opened in text mode, where the
Windows CRT translated CRLF to LF before the parser saw it, so stripping
'\n' was sufficient. In binary mode the CR survives into every path:
zstd: can't stat a.txt : No such file or directory -- ignored
The '\r' is invisible in that message, which makes it awkward to
diagnose.
Strip a trailing '\r' when the line pointers are built, but only on
Windows, where CRLF is the native line separator and a '\r' cannot be
used in a filename. Elsewhere '\r' is a legal filename byte and is left
alone, so behaviour on those platforms is unchanged. This restores the
pre-regression behaviour exactly, on every platform, without adding a
new one.
Adds a playTests case, guarded to Windows, that fails without the fix.
jaypatrickhoward added a commit to jaypatrickhoward/zstd that referenced this pull request Sep 7, 2026
`--filelist` stopped accepting Windows CRLF line endings in 165e52c
("first implementation supporting Process Substitution", facebook#4349). That
rewrite reads the list into a buffer opened in binary mode and splits it
on '\n' alone. Previously the list was opened in text mode, where the
Windows CRT translated CRLF to LF before the parser saw it, so stripping
'\n' was sufficient. In binary mode the CR survives into every path:
zstd: can't stat a.txt : No such file or directory -- ignored
The '\r' is invisible in that message, which makes it awkward to
diagnose.
Strip a trailing '\r' when the line pointers are built, but only on
Windows, where CRLF is the native line separator and a '\r' cannot be
used in a filename. Elsewhere '\r' is a legal filename byte and is left
alone, so behaviour on those platforms is unchanged. This restores the
pre-regression behaviour exactly, on every platform, without adding a
new one.
Adds a playTests case, guarded to Windows, that fails without the fix.
jaypatrickhoward added a commit to jaypatrickhoward/zstd that referenced this pull request Sep 7, 2026
`--filelist` stopped accepting Windows CRLF line endings in 165e52c
("first implementation supporting Process Substitution", facebook#4349). That
rewrite reads the list into a buffer opened in binary mode and splits it
on '\n' alone. Previously the list was opened in text mode, where the
Windows CRT translated CRLF to LF before the parser saw it, so stripping
'\n' was sufficient. In binary mode the CR survives into every path:
zstd: can't stat a.txt : No such file or directory -- ignored
The '\r' is invisible in that message, which makes it awkward to
diagnose.
Strip a trailing '\r' when the line pointers are built, but only on
Windows, where CRLF is the native line separator and a '\r' cannot be
used in a filename. Elsewhere '\r' is a legal filename byte and is left
alone, so behaviour on those platforms is unchanged. This restores the
pre-regression behaviour exactly, on every platform, without adding a
new one.
Adds a playTests case, guarded to Windows, that fails without the fix.
jaypatrickhoward added a commit to jaypatrickhoward/zstd that referenced this pull request Sep 7, 2026
`--filelist` stopped accepting Windows CRLF line endings in 165e52c
("first implementation supporting Process Substitution", facebook#4349). That
rewrite reads the list into a buffer opened in binary mode and splits it
on '\n' alone. Previously the list was opened in text mode, where the
Windows CRT translated CRLF to LF before the parser saw it, so stripping
'\n' was sufficient. In binary mode the CR survives into every path:
zstd: can't stat a.txt : No such file or directory -- ignored
The '\r' is invisible in that message, which makes it awkward to
diagnose.
Strip a trailing '\r' when the line pointers are built, but only on
Windows, where CRLF is the native line separator and a '\r' cannot be
used in a filename. Elsewhere '\r' is a legal filename byte and is left
alone, so behaviour on those platforms is unchanged. This restores the
pre-regression behaviour exactly, on every platform, without adding a
new one.
Adds a playTests case, guarded to Windows, that fails without the fix.
jaypatrickhoward added a commit to jaypatrickhoward/zstd that referenced this pull request Sep 7, 2026
`--filelist` stopped accepting Windows CRLF line endings in 165e52c
("first implementation supporting Process Substitution", facebook#4349). That
rewrite reads the list into a buffer opened in binary mode and splits it
on '\n' alone. Previously the list was opened in text mode, where the
Windows CRT translated CRLF to LF before the parser saw it, so stripping
'\n' was sufficient. In binary mode the CR survives into every path:
zstd: can't stat a.txt : No such file or directory -- ignored
The '\r' is invisible in that message, which makes it awkward to
diagnose.
Strip a trailing '\r' when the line pointers are built, but only on
Windows, where CRLF is the native line separator and a '\r' cannot be
used in a filename. Elsewhere '\r' is a legal filename byte and is left
alone, so behaviour on those platforms is unchanged. This restores the
pre-regression behaviour exactly, on every platform, without adding a
new one.
Adds a playTests case, guarded to Windows, that fails without the fix.
jaypatrickhoward added a commit to jaypatrickhoward/zstd that referenced this pull request Sep 7, 2026
`--filelist` stopped accepting Windows CRLF line endings in 165e52c
("first implementation supporting Process Substitution", facebook#4349). That
rewrite reads the list into a buffer opened in binary mode and splits it
on '\n' alone. Previously the list was opened in text mode, where the
Windows CRT translated CRLF to LF before the parser saw it, so stripping
'\n' was sufficient. In binary mode the CR survives into every path:
zstd: can't stat a.txt : No such file or directory -- ignored
The '\r' is invisible in that message, which makes it awkward to
diagnose.
Strip a trailing '\r' when the line pointers are built, but only on
Windows, where CRLF is the native line separator and a '\r' cannot be
used in a filename. Elsewhere '\r' is a legal filename byte and is left
alone, so behaviour on those platforms is unchanged. This restores the
pre-regression behaviour exactly, on every platform, without adding a
new one.
Adds a playTests case, guarded to Windows, that fails without the fix.
jaypatrickhoward added a commit to jaypatrickhoward/zstd that referenced this pull request Sep 7, 2026
`--filelist` stopped accepting Windows CRLF line endings in 165e52c
("first implementation supporting Process Substitution", facebook#4349). That
rewrite reads the list into a buffer opened in binary mode and splits it
on '\n' alone. Previously the list was opened in text mode, where the
Windows CRT translated CRLF to LF before the parser saw it, so stripping
'\n' was sufficient. In binary mode the CR survives into every path:
zstd: can't stat a.txt : No such file or directory -- ignored
The '\r' is invisible in that message, which makes it awkward to
diagnose.
Strip a trailing '\r' when the line pointers are built, but only on
Windows, where CRLF is the native line separator and a '\r' cannot be
used in a filename. Elsewhere '\r' is a legal filename byte and is left
alone, so behaviour on those platforms is unchanged. This restores the
pre-regression behaviour exactly, on every platform, without adding a
new one.
Adds a playTests case, guarded to Windows, that fails without the fix.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Cyan4973@facebook-github-bot