Skip to content

Make touch logic in file_metadata.sh more portable #1648

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 29, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions gix-index/tests/fixtures/file_metadata.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
#!/usr/bin/env bash
set -eu -o pipefail

# Attempt to create files with the latest and earliest possible dates for ext4. Nanoseconds are
# special there, but not usually on other filesystems. In some touch implementations, the format
# may be rejected. So if a command fails, we try again with a more extreme date that is out of
# range, because some implementations will clip it to the edge of the range (but they may fail).
touch -d '2446-05-10 22:38:55.111111111' future || touch -d '2446-05-11 22:38:56' future
touch -d '1901-12-13 20:45:52.222222222' past || touch -d '1901-12-13 20:45:52' past
# Attempt to create files with the latest and earliest possible 64-bit dates/times for ext4.
# Although nanoseconds are stored in ext4, specifying fractions of a second does not seem to make
# this work better, and omitting them allows the commands that attempt to set these dates to
# succeed on more systems. While we use a portable format, if the system rejects a future date as
# out of range with an error (and touch does not automatically retry with an allowed date) then it
# can fail. In this case, we try again with a much more moderate date: the greatest value that can
# in practice always parse to fit within a 32-bit signed time_t. This is subject to change to
# support changed or new tests. It will also become less useful in the near future (after 2038).
TZ=UTC touch -d '2446-05-10 22:38:55' future || TZ=UTC touch -d '2038-01-19 03:14:07' future
TZ=UTC touch -d '1901-12-13 20:45:52' past
Loading