ensure that all mtime of modified files are equal when pushing

Bug-Debian: https://bugs.debian.org/466360
Upstream-status: to be submitted 

This is intended to avoid time skew in build systems in some cases.

See the discussion
https://lists.debian.org/debian-policy/2008/02/msg00030.html for more
context information.

Gbp-Pq: Name push_timeskew
This commit is contained in:
Openkylin Developers 2022-12-06 14:41:58 +08:00 committed by luoyaoming
parent e38ea0c369
commit dc5d54008e
3 changed files with 105 additions and 6 deletions

View File

@ -30,7 +30,8 @@ in the series file is applied. When a number is specified, apply the
specified number of patches. When a patch name is specified, apply
all patches up to and including the specified patch. Patch names may
include the patches/ prefix, which means that filename completion can
be used.
be used. The mtime of all touched files will be exactly the same to
prevent time skews.
-a Apply all patches in the series file.
@ -215,18 +216,29 @@ add_patch()
touch "$QUILT_PC/$patch~refresh"
fi
if [ -e "$QUILT_PC/$patch" ]
if ! [ -e "$QUILT_PC/$patch" ]
then
touch "$QUILT_PC/$patch/.timestamp"
else
mkdir "$QUILT_PC/$patch"
fi
touch "$QUILT_PC/$patch/.timestamp"
# Store the list of files to process
NONEMPTY_FILES=$(gen_tempfile)
trap "rm -f \"$NONEMPTY_FILES\"" EXIT
find "$QUILT_PC/$patch" -type f \
-a ! -path "$QUILT_PC/$patch/.timestamp" -size +0 -print0 > "$NONEMPTY_FILES"
if [ -s "$NONEMPTY_FILES" ]; then
xargs -0 touch -c -r "$QUILT_PC/$patch/.timestamp" < "$NONEMPTY_FILES"
fi
rm -f $NONEMPTY_FILES
if ! [ -e "$patch_file" ]
then
printf $"Patch %s does not exist; applied empty patch\n" \
"$(print_patch "$patch")"
elif [ -z "$(shopt -s nullglob ; echo "$QUILT_PC/$patch/"*)" ]
elif [ "$(shopt -s nullglob ; echo "$QUILT_PC/$patch/"*)" = "$QUILT_PC/$patch/.timestamp" ]
then
printf $"Patch %s appears to be empty; applied\n" \
"$(print_patch "$patch")"

View File

@ -184,8 +184,9 @@ restore_all()
done < "$NONEMPTY_FILES"
fi
modif_time=`date +%m%d%H%M.%S`
if [ -n "$OPT_TOUCH" ]; then
xargs -0 touch -c < "$NONEMPTY_FILES"
xargs -0 touch -t $modif_time -c < "$NONEMPTY_FILES"
fi
fi

86
test/push_timeskew.test Normal file
View File

@ -0,0 +1,86 @@
This test enforces that files touched by a patch have the exact same
mtime when pushing and poping the patch.
(To run, type `./run push_timeskew.test' in this directory.)
$ mkdir patches d
$ quilt new patch1
> Patch %{P}patch1 is now on top
$ cd d
$ mkdir dir
$ echo "This is file one." > dir/file1
$ quilt add dir/file1
> File d/dir/file1 added to patch %{_P}patch1
$ echo "This is file two." > dir/file2
$ quilt add dir/file2
> File d/dir/file2 added to patch %{_P}patch1
$ echo "More content to file one." >> dir/file1
$ echo "More content to file two." >> dir/file2
$ quilt refresh
> Refreshed patch %{_P}patch1
$ quilt pop -q
> Removing patch %{_P}patch1
> No patches applied
$ test dir/file1 -nt dir/file2 && echo "timeskew!"
$ test dir/file2 -nt dir/file1 && echo "timeskew!"
$ quilt push -q
> Applying patch %{_P}patch1
> Now at patch %{_P}patch1
$ test dir/file1 -nt dir/file2 && echo "timeskew!"
$ test dir/file2 -nt dir/file1 && echo "timeskew!"
# And now, enforces that this timestamp fixup don't create unwanted files
$ quilt new patch2.diff
> Patch %{_P}patch2.diff is now on top
$ echo "some content" > dir/file_removed
$ quilt add dir/file_removed
> File d/dir/file_removed added to patch %{_P}patch2.diff
$ quilt add dir/file_created
> File d/dir/file_created added to patch %{_P}patch2.diff
$ rm dir/file_removed
$ echo "some content" > dir/file_created
$ quilt refresh
> Refreshed patch %{_P}patch2.diff
$ quilt diff --no-timestamps --no-index -p ab
> --- /dev/null
> +++ b/d/dir/file_created
> @@ -0,0 +1 @@
> +some content
> --- a/d/dir/file_removed
> +++ /dev/null
> @@ -1 +0,0 @@
> -some content
$ quilt pop
> Removing patch %{_P}patch2.diff
> Removing d/dir/file_created
> Restoring d/dir/file_removed
>
> Now at patch %{_P}patch1
$ test -e dir/file_created && echo "Created file should not exist when patch is poped!"
$ test ! -e dir/file_removed && echo "Deleted file should exist when patch is poped!"
$ quilt push
> Applying patch %{_P}patch2.diff
> patching file d/dir/file_created
> patching file d/dir/file_removed
>
> Now at patch %{_P}patch2.diff
$ test ! -e dir/file_created && echo "Created file should exist when patch is pushed!"
$ test -e dir/file_removed && echo "Deleted file should not exist when patch is pushed!"