]> err.no Git - dpkg/commitdiff
dpkg-source: more cleanup
authorRaphael Hertzog <hertzog@debian.org>
Thu, 21 Feb 2008 00:52:49 +0000 (01:52 +0100)
committerRaphael Hertzog <hertzog@debian.org>
Thu, 21 Feb 2008 00:52:49 +0000 (01:52 +0100)
* scripts/dpkg-source.pl: Replace several implicit fork made with
open() by fork_and_exec().
* scripts/dpkg-source.pl: Remove another chunk of unused code.

scripts/dpkg-source.pl

index 0759c9e9d29f4f2d9e7b640531765913bba16b3f..4a5e3a4a5b63f39196742e19fb0d576386b2ca6e 100755 (executable)
@@ -1,4 +1,5 @@
 #! /usr/bin/perl
+# vim: set et sw=4 ts=8
 
 use strict;
 use warnings;
@@ -287,8 +288,6 @@ while (@ARGV && $ARGV[0] =~ m/^-/) {
 
 defined($opmode) || &usageerr(_g("need -x or -b"));
 
-$SIG{'PIPE'} = 'DEFAULT';
-
 if ($opmode eq 'build') {
 
     @ARGV || &usageerr(_g("-b needs a directory"));
@@ -655,15 +654,16 @@ if ($opmode eq 'build') {
        my $diff_handle;
        $compressor->compress(from_pipe => \$diff_handle, to_file => $newdiffgz);
 
-       defined(my $c2 = open(FIND, "-|")) || syserr(_g("fork for find"));
-        if (!$c2) {
-            chdir($dir) || syserr(_g("chdir to %s for find"), $dir);
-            exec('find','.','-print0') or &syserr(_g("exec find"));
-        }
-        $/= "\0";
+        my $find_handle;
+        my $pid = fork_and_exec(
+            'exec' => [ 'find', '.', '-print0' ],
+            'chdir' => $dir,
+            'to_pipe' => \$find_handle,
+        );
+        $/ = "\0";
 
       file:
-        while (defined($fn= <FIND>)) {
+        while (defined($fn= <$find_handle>)) {
             $fn =~ s/\0$//;
             next file if $fn =~ m/$diff_ignore_regexp/o;
             $fn =~ s,^\./,,;
@@ -708,37 +708,40 @@ if ($opmode eq 'build') {
                                 _g("plain file"));
                     next;
                 }
-               defined(my $c3 = open(DIFFGEN, "-|")) || syserr(_g("fork for diff"));
-                if (!$c3) {
-                   $ENV{'LC_ALL'}= 'C';
-                   $ENV{'LANG'}= 'C';
-                   $ENV{'TZ'}= 'UTC0';
-                   my $tab = ("$basedirname/$fn" =~ / /) ? "\t" : '';
-                   exec('diff','-u',
-                        '-L',"$basedirname.orig/$fn$tab",
-                        '-L',"$basedirname/$fn$tab",
-                        '--',"$ofnread","$dir/$fn") or &syserr(_g("exec diff"));
-                }
-               my $difflinefound = 0;
-                $/= "\n";
-                while (<DIFFGEN>) {
+
+                my $tab = ("$basedirname/$fn" =~ / /) ? "\t" : '';
+                my $diffgen;
+                my $diff_pid = fork_and_exec(
+                    'exec' => [ 'diff', '-u', '-p',
+                                '-L', "$basedirname.orig/$fn$tab",
+                                '-L', "$basedirname/$fn$tab",
+                                '--', "$ofnread", "$dir/$fn" ],
+                    'env' => { LC_ALL => 'C', LANG => 'C', TZ => 'UTC0' },
+                    'to_pipe' => \$diffgen
+                );
+                my $difflinefound = 0;
+                $/ = "\n";
+                while (<$diffgen>) {
                     if (m/^binary/i) {
-                        close(DIFFGEN); $/= "\0";
+                        close($diffgen);
+                        $/ = "\0";
                         &unrepdiff(_g("binary file contents changed"));
                         next file;
                     } elsif (m/^[-+\@ ]/) {
                         $difflinefound=1;
                     } elsif (m/^\\ No newline at end of file$/) {
-                       warning(_g("file %s has no final newline (either " .
-                                  "original or modified version)"), $fn);
+                        warning(_g("file %s has no final newline (either " .
+                                   "original or modified version)"), $fn);
                     } else {
                         s/\n$//;
-                       internerr(_g("unknown line from diff -u on %s: `%s'"),
-                                 $fn, $_);
+                        internerr(_g("unknown line from diff -u on %s: `%s'"),
+                                  $fn, $_);
                     }
-                   print($diff_handle $_) || syserr(_g("failed to write to compression pipe"));
+                    print($diff_handle $_) || syserr(_g("failed to write to compression pipe"));
                 }
-                close(DIFFGEN); $/= "\0";
+                close($diffgen);
+                wait_child($diff_pid, nocheck => 1, cmdline => 'diff');
+                $/ = "\0";
                my $es;
                 if (WIFEXITED($?) && (($es=WEXITSTATUS($?))==0 || $es==1)) {
                     if ($es==1 && !$difflinefound) {
@@ -765,8 +768,9 @@ if ($opmode eq 'build') {
                 &unrepdiff(sprintf(_g("unknown file type (%s)"), $!));
             }
         }
-        close(FIND); $? && subprocerr("find on $dir");
-       close($diff_handle) || syserr(_g("finish write to compression pipe"));
+        close($find_handle);
+        wait_child($pid);
+        close($diff_handle) || syserr(_g("finish write to compression pipe"));
         $compressor->wait_end_process();
        rename($newdiffgz, $diffname) ||
            syserr(_g("unable to rename `%s' (newly created) to `%s'"),
@@ -774,13 +778,14 @@ if ($opmode eq 'build') {
        chmod(0666 &~ umask(), $diffname) ||
            syserr(_g("unable to change permission of `%s'"), $diffname);
 
-        defined($c2= open(FIND,"-|")) || &syserr(_g("fork for 2nd find"));
-        if (!$c2) {
-            chdir($origdir) || syserr(_g("chdir to %s for 2nd find"), $origdir);
-            exec('find','.','-print0') or &syserr(_g("exec 2nd find"));
-        }
-        $/= "\0";
-        while (defined($fn= <FIND>)) {
+        $find_handle = undef;
+        $pid = fork_and_exec(
+            'exec' => [ 'find', '.', '-print0' ],
+            'chdir' => $origdir,
+            'to_pipe' => \$find_handle,
+        );
+        $/ = "\0";
+        while (defined($fn= <$find_handle>)) {
             $fn =~ s/\0$//;
             next if $fn =~ m/$diff_ignore_regexp/o;
             $fn =~ s,^\./,,;
@@ -798,7 +803,8 @@ if ($opmode eq 'build') {
                             _g('nonexistent'));
             }
         }
-        close(FIND); $? && subprocerr("find on $dirname");
+        close($find_handle);
+        wait_child($pid);
 
        addfile($fields, $diffname);
 
@@ -1161,34 +1167,6 @@ if ($opmode eq 'build') {
        warning(_g("%s is not a plain file"), "$newdirectory/debian/rules");
     }
 
-    my $execmode = 0777 & ~umask;
-    (my @s = stat('.')) || syserr(_g("cannot stat `.'"));
-    my $dirmode = $execmode | ($s[2] & 02000);
-    my $plainmode = $execmode & ~0111;
-    my $fifomode = ($plainmode & 0222) | (($plainmode & 0222) << 1);
-
-    for $fn (@filesinarchive) {
-       $fn=~ s,^$expectprefix,$newdirectory,;
-       (my @s = lstat($fn)) ||
-           syserr(_g("cannot stat extracted object `%s'"), $fn);
-       my $mode = $s[2];
-       my $newmode;
-
-        if (-d _) {
-            $newmode= $dirmode;
-        } elsif (-f _) {
-            $newmode= ($mode & 0111) ? $execmode : $plainmode;
-        } elsif (-p _) {
-            $newmode= $fifomode;
-        } elsif (!-l _) {
-            internerr(_g("unknown object `%s' after extract (mode 0%o)"),
-                      $fn, $mode);
-        } else { next; }
-        next if ($mode & 07777) == $newmode;
-        chmod($newmode,$fn) ||
-            syserr(_g("cannot change mode of `%s' to 0%o from 0%o"),
-                   $fn, $newmode, $mode);
-    }
     exit(0);
 }