test-container: Always copy test-specific support files [BZ #27537]

There's a small chance that a fresh checkout will result in some of
the test-specific container files will have the same timestamp and
size, which breaks the rsync logic in test-container, resulting in
tests running with the wrong support files.

This patch changes the rsync logic to always copy the test-specific
files, which normally would always be copied anyway.  The rsync logic
for the testroot itself is unchanged.
This commit is contained in:
DJ Delorie 2021-03-11 12:50:02 -05:00
parent 92cfc9ad82
commit 20bee71348
1 changed files with 12 additions and 11 deletions

View File

@ -481,7 +481,7 @@ need_sync (char *ap, char *bp, struct stat *a, struct stat *b)
} }
static void static void
rsync_1 (path_buf * src, path_buf * dest, int and_delete) rsync_1 (path_buf * src, path_buf * dest, int and_delete, int force_copies)
{ {
DIR *dir; DIR *dir;
struct dirent *de; struct dirent *de;
@ -491,8 +491,9 @@ rsync_1 (path_buf * src, path_buf * dest, int and_delete)
r_append ("/", dest); r_append ("/", dest);
if (verbose) if (verbose)
printf ("sync %s to %s %s\n", src->buf, dest->buf, printf ("sync %s to %s%s%s\n", src->buf, dest->buf,
and_delete ? "and delete" : ""); and_delete ? " and delete" : "",
force_copies ? " (forced)" : "");
size_t staillen = src->len; size_t staillen = src->len;
@ -521,10 +522,10 @@ rsync_1 (path_buf * src, path_buf * dest, int and_delete)
missing. */ missing. */
lstat (dest->buf, &d); lstat (dest->buf, &d);
if (! need_sync (src->buf, dest->buf, &s, &d)) if (! force_copies && ! need_sync (src->buf, dest->buf, &s, &d))
{ {
if (S_ISDIR (s.st_mode)) if (S_ISDIR (s.st_mode))
rsync_1 (src, dest, and_delete); rsync_1 (src, dest, and_delete, force_copies);
continue; continue;
} }
@ -559,7 +560,7 @@ rsync_1 (path_buf * src, path_buf * dest, int and_delete)
if (verbose) if (verbose)
printf ("+D %s\n", dest->buf); printf ("+D %s\n", dest->buf);
maybe_xmkdir (dest->buf, (s.st_mode & 0777) | 0700); maybe_xmkdir (dest->buf, (s.st_mode & 0777) | 0700);
rsync_1 (src, dest, and_delete); rsync_1 (src, dest, and_delete, force_copies);
break; break;
case S_IFLNK: case S_IFLNK:
@ -639,12 +640,12 @@ rsync_1 (path_buf * src, path_buf * dest, int and_delete)
} }
static void static void
rsync (char *src, char *dest, int and_delete) rsync (char *src, char *dest, int and_delete, int force_copies)
{ {
r_setup (src, &spath); r_setup (src, &spath);
r_setup (dest, &dpath); r_setup (dest, &dpath);
rsync_1 (&spath, &dpath, and_delete); rsync_1 (&spath, &dpath, and_delete, force_copies);
} }
@ -846,11 +847,11 @@ main (int argc, char **argv)
do_ldconfig = true; do_ldconfig = true;
rsync (pristine_root_path, new_root_path, rsync (pristine_root_path, new_root_path,
file_exists (concat (command_root, "/preclean.req", NULL))); file_exists (concat (command_root, "/preclean.req", NULL)), 0);
if (stat (command_root, &st) >= 0 if (stat (command_root, &st) >= 0
&& S_ISDIR (st.st_mode)) && S_ISDIR (st.st_mode))
rsync (command_root, new_root_path, 0); rsync (command_root, new_root_path, 0, 1);
new_objdir_path = xstrdup (concat (new_root_path, new_objdir_path = xstrdup (concat (new_root_path,
support_objdir_root, NULL)); support_objdir_root, NULL));
@ -1044,7 +1045,7 @@ main (int argc, char **argv)
/* Child has exited, we can post-clean the test root. */ /* Child has exited, we can post-clean the test root. */
printf("running post-clean rsync\n"); printf("running post-clean rsync\n");
rsync (pristine_root_path, new_root_path, 1); rsync (pristine_root_path, new_root_path, 1, 0);
if (WIFEXITED (status)) if (WIFEXITED (status))
exit (WEXITSTATUS (status)); exit (WEXITSTATUS (status));