Add support for tracking jigdo back-references
authorSteve McIntyre <steve@einval.com>
Thu, 14 Aug 2014 22:44:40 +0000 (23:44 +0100)
committerSteve McIntyre <steve@einval.com>
Thu, 14 Aug 2014 22:44:40 +0000 (23:44 +0100)
If using a fail_log, also keep track of which jigdo files correspond
to each missing file, and output the details in the backref_file.

mkjigsnap
mkjigsnap.8

index 873a800..39d4473 100755 (executable)
--- a/mkjigsnap
+++ b/mkjigsnap
@@ -2,7 +2,7 @@
 #
 # mkjigsnap
 #
-# (c) 2004-2012 Steve McIntyre <steve@einval.com>
+# (c) 2004-2014 Steve McIntyre <steve@einval.com>
 #
 # Server-side wrapper; run this on a machine with a mirror to set up
 # the snapshots for jigit / jigdo downloading
@@ -81,7 +81,7 @@ my $single_jigdo;
 my @keywords;
 my @mirrors;
 my ($dirname, $failedfile, $ignorefile, $jigdolist, $mirror, $cdname,
-    $outdir, $tempdir, $template, $check_checksums, $checksum_out);
+    $outdir, $tempdir, $template, $check_checksums, $checksum_out, $backref_file);
 my $result;
 my $num_jigdos = 0;
 my $num_unsorted = 0;
@@ -92,8 +92,10 @@ my $old_deleted = 0;
 my %ignored_fails;
 my %file_list;
 my %ref;
+my %jigdo_backref;
 
-$result = GetOptions("c"   => \$check_checksums,
+$result = GetOptions("b=s" => \$backref_file,
+                     "c"   => \$check_checksums,
                      "C=s" => \$checksum_out,
                      "d=s" => \$dirname,
                      "f=s" => \$failedfile,
@@ -333,10 +335,20 @@ sub generate_snapshot_tree () {
     if (defined($failedfile) && ($failed > 0)) {
         print "Writing list of failed files to $failedfile\n";
         open(FAIL_LOG, "> $failedfile") or die "Failed to open $failedfile: $!\n";
+       if ($backref_file) {
+           open (BACKREF, "> $backref_file") or die "Failed to open $backref_file: $!\n";
+       }
         foreach my $missing (@failed_files) {
             print FAIL_LOG "$missing\n";
-        }
+           if ($backref_file) {
+               print BACKREF "$missing:\n";
+               print BACKREF $jigdo_backref{$missing};
+           }
+        }      
         close FAIL_LOG;
+       if ($backref_file) {
+           close BACKREF;
+       }
     }
 
     # Now walk the tree and delete files that we no longer need
@@ -366,34 +378,41 @@ print "Working on $num_jigdos jigdo file(s)\n";
 my $num_parsed = 0;
 print "Reading / parsing jigdo file(s)\n";
 
-while (@jigdos) {
-    my (@tmpjigdos) = splice (@jigdos, 0, 200);
-    open (INJIG, "zcat -f @tmpjigdos |");
+foreach my $injig (sort @jigdos) {
+    open (INJIG, "zcat -f $injig |");
+    $num_parsed++;
     while (<INJIG>) {
-        my ($file, $jigsum);
-        chomp;
-        foreach my $keyword (@keywords) {
-            if (m/^(......................)=$keyword:(.*)$/) {
-                $jigsum = $1;
-                $file = $2;
-                $file =~ s?^/??;
-            }
-        }
-        if (defined($file)) {
-            $num_unsorted++;
-            if (!exists $ref{$file}) {
-                $num_unique++;
-                $ref{$file} = $jigsum;
-            } else {
-                if (!($ref{$file} =~ /\Q$jigsum\E/ )) {
-                    print "  ERROR: $file referenced again with different checksum!\n";
-                    print "    (old " . $ref{$file} . " new $jigsum\n";
-                }
-            }
-            if ( !($num_unsorted % 100000) ) {
-                print "  found $num_unsorted total, $num_unique unique files\n";
-            }
-        }
+       my ($file, $jigsum);
+       chomp;
+       foreach my $keyword (@keywords) {
+           if (m/^(......................)=$keyword:(.*)$/) {
+               $jigsum = $1;
+               $file = $2;
+               $file =~ s?^/??;
+           }
+       }
+       if (defined($file)) {
+           $num_unsorted++;
+           if (!exists $ref{$file}) {
+               $num_unique++;
+               $ref{$file} = $jigsum;
+           } else {
+               if (!($ref{$file} =~ /\Q$jigsum\E/ )) {
+                   print "  ERROR: $file referenced again with different checksum!\n";
+                   print "    (old " . $ref{$file} . " new $jigsum\n";
+               }
+           }
+           if ($backref_file) {
+               if (!defined $jigdo_backref{$file}) {
+                   $jigdo_backref{$file} = " $injig\n";
+               } else {
+                   $jigdo_backref{$file} .= " $injig\n";
+               }
+           }
+           if ( !($num_unsorted % 100000) ) {
+               print "  found $num_unsorted total, $num_unique unique files, $num_parsed / $num_jigdos jigdo files ($injig)\n";
+           }
+       }
     }
     close(INJIG);
 }
index b4d916d..ae2a7a7 100644 (file)
@@ -16,6 +16,7 @@ mkjigsnap \- Create a snapshot tree on a jigdo server
 .br
 .B mkjigsnap
 [OPTIONS]
+<\-b \f backref_file\fR>
 <\-d \f snapshot_dir\fR>
 <\-m \f mirror\fR>
 <\-J \f jigdo_list\fR>
@@ -101,6 +102,10 @@ will be used to create the snapshot efficiently.
 
 Optional arguments for both modes:
 .TP
+\fB\-b backref_file\fR
+If using a fail_log, also keep track of which jigdo files correspond
+to each missing file, and output the details in the backref_file.
+.TP
 \fB\-f fail_log\fR
 If any files are required by the specific jigdo files but are not
 available in the mirror, list them in the output file fail_log for
@@ -143,7 +148,7 @@ listed in the "ignore" file ~/mkjigsnap-ignore.list.
 .SH "SEE ALSO"
 \fBjigdo-file\fP(1), \fBjigit\fP(1), \fBjigdump\fP(1) and \fBmkimage\fP(1).
 .SH "COPYRIGHT"
-Copyright 2004 - 2012 Steve McIntyre (steve@einval.com)
+Copyright 2004 - 2014 Steve McIntyre (steve@einval.com)
 .PP
 mkjigsnap may be copied under the terms and conditions of version 2 of
 the GNU General Public License, as published by the Free Software