]> git.ipfire.org Git - thirdparty/tar.git/commitdiff
tar: incremental 'X' follows --one-top-level master
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 8 Apr 2026 16:03:14 +0000 (09:03 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 8 Apr 2026 16:07:12 +0000 (09:07 -0700)
* src/incremen.c (purge_directory):
Also respect --one-top-level when handling 'X'.

src/incremen.c

index 713dcd51e63416a6f85c91ffefa748e5a109f935..923c632385cc87e95f1abb33eb853d9cdf370451 100644 (file)
@@ -1649,10 +1649,19 @@ purge_directory (char const *directory_name)
       if (*arc == 'X')
        {
          static char const TEMP_DIR_TEMPLATE[] = "tar.XXXXXX";
+         idx_t topsize
+           = one_top_level_dir ? strlen (one_top_level_dir) + 1 : 0;
          char *d = safer_name_suffix (arc + 1, false, absolute_names_option);
          idx_t len = strlen (d);
-         temp_stub = xrealloc (temp_stub, len + 1 + sizeof TEMP_DIR_TEMPLATE);
-         char *copy_end = mempcpy (temp_stub, d, len);
+         temp_stub = xrealloc (temp_stub,
+                               topsize + len + 1 + sizeof TEMP_DIR_TEMPLATE);
+         char *copy_end = temp_stub;
+         if (topsize)
+           {
+             copy_end = mempcpy (copy_end, one_top_level_dir, topsize - 1);
+             *copy_end++ = '/';
+           }
+         copy_end = mempcpy (copy_end, d, len);
          *copy_end = '/';
          memcpy (copy_end + !ISSLASH (copy_end[-1]), TEMP_DIR_TEMPLATE,
                  sizeof TEMP_DIR_TEMPLATE);