Просмотр исходного кода

dpkg-scanpackages: Factor out deb processing into a new process_deb() function

Guillem Jover лет назад: 11
Родитель
Сommit
00d4a39b2a
1 измененных файлов с 65 добавлено и 59 удалено
  1. 65 59
      scripts/dpkg-scanpackages.pl

+ 65 - 59
scripts/dpkg-scanpackages.pl

@@ -43,6 +43,7 @@ my (@samemaint, @changedmaint);
 my @spuriousover;
 my %packages;
 my %overridden;
+my %hash;
 
 my %options = (help            => sub { usage(); exit 0; },
 	       version         => \&version,
@@ -155,6 +156,65 @@ sub load_override_extra
     close($comp_file);
 }
 
+sub process_deb {
+    my ($pathprefix, $fn) = @_;
+
+    my $output;
+    my $pid = spawn(exec => [ 'dpkg-deb', '-I', $fn, 'control' ],
+                    to_pipe => \$output);
+    my $fields = Dpkg::Control->new(type => CTRL_INDEX_PKG);
+    $fields->parse($output, $fn)
+        or error(g_("couldn't parse control information from %s"), $fn);
+    wait_child($pid, nocheck => 1);
+    if ($?) {
+        warning(g_("'dpkg-deb -I %s control' exited with %d, skipping package"),
+                $fn, $?);
+        return;
+    }
+
+    defined($fields->{'Package'})
+        or error(g_('no Package field in control file of %s'), $fn);
+    my $p = $fields->{'Package'};
+
+    if (defined($packages{$p}) and not $options{multiversion}) {
+        foreach my $pkg (@{$packages{$p}}) {
+            if (version_compare_relation($fields->{'Version'}, REL_GT,
+                                         $pkg->{'Version'}))
+            {
+                warning(g_('package %s (filename %s) is repeat but newer ' .
+                           'version; used that one and ignored data from %s!'),
+                        $p, $fn, $pkg->{Filename});
+                $packages{$p} = [];
+            } else {
+                warning(g_('package %s (filename %s) is repeat; ' .
+                           'ignored that one and using data from %s!'),
+                        $p, $fn, $pkg->{Filename});
+                return;
+            }
+        }
+    }
+
+    warning(g_('package %s (filename %s) has Filename field!'), $p, $fn)
+        if defined($fields->{'Filename'});
+    $fields->{'Filename'} = "$pathprefix$fn";
+
+    my $sums = Dpkg::Checksums->new();
+    $sums->add_from_file($fn);
+    foreach my $alg (checksums_get_list()) {
+        next if %hash and not $hash{$alg};
+
+        if ($alg eq 'md5') {
+            $fields->{'MD5sum'} = $sums->get_checksum($fn, $alg);
+        } else {
+            $fields->{$alg} = $sums->get_checksum($fn, $alg);
+        }
+    }
+    $fields->{'Size'} = $sums->get_size($fn);
+    $fields->{'X-Medium'} = $options{medium} if defined $options{medium};
+
+    push @{$packages{$p}}, $fields;
+}
+
 {
     local $SIG{__WARN__} = sub { usageerr($_[0]) };
     GetOptions(\%options, @options_spec);
@@ -166,7 +226,7 @@ if (not (@ARGV >= 1 and @ARGV <= 3)) {
 
 my $type = $options{type} // 'deb';
 my $arch = $options{arch};
-my %hash = map { $_ => 1 } split /,/, $options{hash} // '';
+%hash = map { $_ => 1 } split /,/, $options{hash} // '';
 
 foreach my $alg (keys %hash) {
     if (not checksums_is_supported($alg)) {
@@ -197,64 +257,10 @@ $pathprefix //= '';
 my $find_h = IO::Handle->new();
 open($find_h, '-|', 'find', '-L', "$binarydir/", @find_args, '-print')
      or syserr(g_("couldn't open %s for reading"), $binarydir);
-FILE:
-    while (my $fn = <$find_h>) {
-	chomp $fn;
-	my $output;
-	my $pid = spawn(exec => [ 'dpkg-deb', '-I', $fn, 'control' ],
-	                to_pipe => \$output);
-	my $fields = Dpkg::Control->new(type => CTRL_INDEX_PKG);
-	$fields->parse($output, $fn)
-	    or error(g_("couldn't parse control information from %s"), $fn);
-	wait_child($pid, nocheck => 1);
-	if ($?) {
-	    warning(g_("'dpkg-deb -I %s control' exited with %d, skipping package"),
-	            $fn, $?);
-	    next;
-	}
-
-	defined($fields->{'Package'})
-	    or error(g_('no Package field in control file of %s'), $fn);
-	my $p = $fields->{'Package'};
-
-	if (defined($packages{$p}) and not $options{multiversion}) {
-	    foreach my $pkg (@{$packages{$p}}) {
-		if (version_compare_relation($fields->{'Version'}, REL_GT,
-		                             $pkg->{'Version'}))
-                {
-                    warning(g_('package %s (filename %s) is repeat but newer ' .
-                               'version; used that one and ignored data from %s!'),
-                            $p, $fn, $pkg->{Filename});
-		    $packages{$p} = [];
-		} else {
-                    warning(g_('package %s (filename %s) is repeat; ' .
-                               'ignored that one and using data from %s!'),
-                            $p, $fn, $pkg->{Filename});
-		    next FILE;
-		}
-	    }
-	}
-	warning(g_('package %s (filename %s) has Filename field!'), $p, $fn)
-	    if defined($fields->{'Filename'});
-
-	$fields->{'Filename'} = "$pathprefix$fn";
-
-        my $sums = Dpkg::Checksums->new();
-	$sums->add_from_file($fn);
-        foreach my $alg (checksums_get_list()) {
-            next if %hash and not $hash{$alg};
-
-            if ($alg eq 'md5') {
-	        $fields->{'MD5sum'} = $sums->get_checksum($fn, $alg);
-            } else {
-                $fields->{$alg} = $sums->get_checksum($fn, $alg);
-            }
-        }
-	$fields->{'Size'} = $sums->get_size($fn);
-        $fields->{'X-Medium'} = $options{medium} if defined $options{medium};
-
-	push @{$packages{$p}}, $fields;
-    }
+while (my $fn = <$find_h>) {
+    chomp $fn;
+    process_deb($pathprefix, $fn);
+}
 close($find_h);
 
 load_override($override) if defined $override;