This is an automated email from the git hooks/post-receive script.

mattia pushed a commit to branch master
in repository devscripts.

commit 67a69bd611538c56177234a3a64d832eeb7c3fe8
Author: Mattia Rizzolo <mat...@debian.org>
Date:   Fri Feb 9 16:34:26 2018 +0100

    mk-origtargz: Split list of files to delete if the list gets too long to 
fit ARG_MAX.
    
    Closes: #855464
    Thanks to Ximin Luo <infinity0> for the initial patch.
    Signed-off-by: Mattia Rizzolo <mat...@debian.org>
---
 debian/changelog        |  3 +++
 scripts/mk-origtargz.pl | 23 ++++++++++++++++++-----
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 159c61b..1b217cd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -17,6 +17,9 @@ devscripts (2.18.1) UNRELEASED; urgency=medium
       with an older pod as well.
   * reproducible-check:
     + Instruct to install python3-xdg if missing.  Closes: #888307
+  * mk-origtargz:
+    + Split list of files to delete if the list gets too long to fit ARG_MAX.
+      Thanks to Ximin Luo <infinity0> for the initial patch.  Closes: #855464
 
   [ Osamu Aoki ]
   * uupdate:
diff --git a/scripts/mk-origtargz.pl b/scripts/mk-origtargz.pl
index 9d43020..5b91ab2 100644
--- a/scripts/mk-origtargz.pl
+++ b/scripts/mk-origtargz.pl
@@ -572,11 +572,24 @@ if ($do_repack || $deletecount) {
     # We have to use piping because --delete is broken otherwise, as documented
     # at https://www.gnu.org/software/tar/manual/html_node/delete.html
     if (@to_delete) {
-       spawn(exec => ['tar', '--delete', @to_delete ],
-             from_file => $destfiletar,
-             to_file => $destfiletar . ".tmp",
-             wait_child => 1) if scalar(@to_delete) > 0;
-       move ($destfiletar . ".tmp", $destfiletar);
+       # ARG_MAX: max number of bytes exec() can handle
+       my $arg_max;
+       spawn(
+           exec => ['getconf', 'ARG_MAX'],
+           to_string => \$arg_max,
+           wait_child => 1
+       );
+       # usually NAME_MAX=255, but here we use 128 to be on the safe side.
+       $arg_max = int($arg_max / 128);
+       # We use this lame splice on a totally arbitrary $arg_max because
+       # counting how many bytes there are in @to_delete is too inefficient.
+       while (my @next_n = splice @to_delete, 0, $arg_max) {
+           spawn(exec => ['tar', '--delete', @next_n ],
+                 from_file => $destfiletar,
+                 to_file => $destfiletar . ".tmp",
+                 wait_child => 1) if scalar(@next_n) > 0;
+           move ($destfiletar . ".tmp", $destfiletar);
+       }
     }
     compress_archive($destfiletar, $destfile, $compression);
 

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/collab-maint/devscripts.git

_______________________________________________
devscripts-devel mailing list
devscripts-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/devscripts-devel

Reply via email to