On Thursday 17 December 2009, Loïc Minier wrote:
>  I just tried mirroring the dists at
>  http://build.chromium.org/buildbot/packages/dists/chromeos/ (I think
>  these are created with reprepro), but failed due to missing Release.gpg
>  files.

Thanks a lot for identifying the issues, but I've decided on a different 
patch that also restructures and cleans up the code a bit.
The end result should be the same and the error reporting cleaner.

Could you give it a try on that repository?

TIA,
FJP

diff --git a/debmirror b/debmirror
index 7f24cf8..1f0c585 100755
--- a/debmirror
+++ b/debmirror
@@ -269,7 +269,8 @@ Don't fail if the F<Release> file is missing.
 
 =item --ignore-release-gpg
 
-Don't fail if the F<Release.gpg> file is missing.
+Don't fail if the F<Release.gpg> file is missing. If the file does exist, it
+will be mirrored but the signature will not be verified.
 
 =item --ignore=regex
 
@@ -840,12 +841,14 @@ foreach my $dist (@dists) {
     make_dir ("$tempdir/dists/$codename$dist_sdir");
     rename("$tdir/Release", "$tempdir/dists/$codename$dist_sdir/Release")
       or die "Error while moving $tdir/Release: $!\n";
-    rename("$tdir/Release.gpg", "$tempdir/dists/$codename$dist_sdir/Release.gpg")
-      or die "Error while moving $tdir/Release.gpg: $!\n";
     $files{"dists/$codename$dist_sdir/Release"}=1;
     $files{$tempdir."/"."dists/$codename$dist_sdir/Release"}=1;
-    $files{"dists/$codename$dist_sdir/Release.gpg"}=1;
-    $files{$tempdir."/"."dists/$codename$dist_sdir/Release.gpg"}=1;
+    if (-f "$tdir/Release.gpg") {
+      rename("$tdir/Release.gpg", "$tempdir/dists/$codename$dist_sdir/Release.gpg")
+	or die "Error while moving $tdir/Release.gpg: $!\n";
+      $files{"dists/$codename$dist_sdir/Release.gpg"}=1;
+      $files{$tempdir."/"."dists/$codename$dist_sdir/Release.gpg"}=1;
+    }
   }
 }
 
@@ -1778,41 +1781,39 @@ sub get_release {
 
   make_dir ("$tdir");
   return 0 unless remote_get("dists/$dist/Release", "$tempdir/.tmp");
-  my $t = $num_errors;
-  return 0 unless remote_get("dists/$dist/Release.gpg", "$tempdir/.tmp");
-  # Check for gpg
-  if (!$ignore_release_gpg) {
+  remote_get("dists/$dist/Release.gpg", "$tempdir/.tmp");
+
+  if (-f "$tdir/Release" && -f "$tdir/Release.gpg") {
+    # Check for gpg
     if (system("gpgv --version >/dev/null 2>/dev/null")) {
       say("gpgv failed: --ignore-release-gpg or gpgv binary missing?");
-      push (@errlog,"gpgv failed: --ignore-release-gpg or gpgv binary missing?\n");
-      $num_errors++;
-    }
-    # Verify Release signature
-    if (-f "$tdir/Release.gpg" || -f "$tdir/Release") {
-      my $gpgv_res="failed";
+      push (@errlog,"gpgv failed: gpgv binary missing?\n") unless $ignore_release_gpg;
+      $num_errors++ unless $ignore_release_gpg;
+    } else {
+      # Verify Release signature
+      my $gpgv_res = 0;
       open GPGV, "gpgv 2>/dev/null --status-fd 1 $tdir/Release.gpg $tdir/Release|";
       while (<GPGV>) {
-	$gpgv_res="valid" if /^\[GNUPG:\] VALIDSIG/;
+	$gpgv_res = 1 if /^\[GNUPG:\] VALIDSIG/;
       }
       close GPGV;
-      if ($gpgv_res eq "failed" || $debug) {
+      if (! $gpgv_res || $debug) {
 	system("gpgv --status-fd 1 $tdir/Release.gpg $tdir/Release");
       }
-      if ($verbose && !$debug) {
+      if ($verbose && ! $debug) {
 	system("gpgv --status-fd 1 $tdir/Release.gpg $tdir/Release >/dev/null");
       }
-      if ($gpgv_res eq "failed") {
+      if (! $gpgv_res) {
 	say("Release signature does not verify.");
-	push (@errlog,"Release signature does not verify\n");
-	$num_errors++;
+	push (@errlog,"Release signature does not verify\n") unless $ignore_release_gpg;
+	$num_errors++ unless $ignore_release_gpg;
       }
-    } else {
-      say("Release signature does not verify, file missing.");
-      push (@errlog,"Release signature does not verify\n");
-      $num_errors++;
     }
+  } else {
+    say("Release signature does not verify, file missing.");
+    push (@errlog,"Release signature does not verify\n") unless $ignore_release_gpg;
+    $num_errors++ unless $ignore_release_gpg;
   }
-  $num_errors=$t if ($ignore_release_gpg);
   return 1
 }
 

Reply via email to