chiark / gitweb /
Support Hunter
[ypp-sc-tools.db-live.git] / yarrg / update-master-info
index 3aa9ac2d802fd8508d0e8f5ab43f0730d383d855..3f570a68f26b3a75e297d107a3e7e1de4953550d 100755 (executable)
 #!/usr/bin/perl -w
 
 use strict (qw(vars));
-
 use DBI;
-
 use Commods;
 
-@ARGV==1 or die;
-my ($rsyncdir) = @ARGV;
 
-parse_info_serverside();
+sub full ($) {
+    my ($ocean) = @_;
+    quick($ocean);
+    print "## updating topology of $ocean\n";
+    system('./yppedia-chart-parser',$ocean); die "$ocean $?" if $?;
+}
 
-foreach my $oceanname (sort keys %oceans) {
-    print STDERR "updating ocean $oceanname...\n";
-    system('./db-idempotent-populate',$oceanname); die $? if $?;
+sub quick ($) {
+    my ($ocean) = @_;
+    print STDERR "## updating schema and commodities for $ocean\n";
+    system('./db-idempotent-populate',$ocean); die $? if $?;
 }
 
-print STDERR "installing new master-info...\n";
+my $rsyncdir;
 
-my $sfn= 'source-info.txt';
-my $dfn= "$rsyncdir/master-info.txt";
+sub process_some_info ($$$) {
+    my ($v,$df,$sfn) = @_;
+    my $sf= new IO::File $sfn or die "$sfn $!";
 
-my $sf= new IO::File $sfn or die "$sfn $!";
-my $df= new IO::File "$dfn.tmp", 'w' or die "$dfn.tmp $!";
+    my $h;
+    while (<$sf>) {
+       chomp; s/\s+$//;
+       next if m/^\s*\#/ || !m/\S/;
+       if (m/^\S.*/) {
+           $h= $&;
+       }
+       die "$_ ?" unless defined $h;
+       if ($h =~ m/^commods|^\%[a-z]\b/) {
+           s/\t.*//;
+       }
+       if ($v<2) {
+           next if $h =~ m/^nocommods/;
+       }
+       next if $sfn =~ m/source-info/ && $h =~ m/^ocean/;
 
-my $h;
-while (<$sf>) {
-    chomp; s/\s+$//;
-    next if m/^\s*\#/ || !m/\S/;
-    if (m/^\S.*/) {
-       $h= $&;
+       print $df $_, "\n" or die $!;
     }
-    die "$_ ?" unless defined $h;
-    if ($h =~ m/^commods|^\%[a-z]\b/) {
-       s/\t.*//;
+
+    $sf->error and die $!;
+}
+
+sub update_master_info () {
+    foreach my $v (1..$masterinfoversion) {
+       my $dfnl= sprintf "master-info%s.txt", ($v>1 ? "-v$v" : '');
+       print STDERR "installing new $dfnl...\n";
+    
+       my $dfn= "$rsyncdir/$dfnl";
+       my $df= new IO::File "$dfn.tmp", 'w' or die "$dfn.tmp $!";
+
+       process_some_info($v,$df, 'source-info.txt');
+       foreach my $ocean (sort keys %oceans) {
+           process_some_info($v,$df, '_ocean-'.(lc $ocean).'.txt');
+       }
+
+       close $df or die $!;
+       rename "$dfn.tmp", "$dfn" or die $!;
     }
-    print $df $_, "\n" or die $!;
 }
 
-$sf->error and die $!;
-close $df or die $!;
-rename "$dfn.tmp", "$dfn" or die $!;
+
+my @specoceans;
+my $alloceans;
+
+sub optarg () {
+    return $_ if length;
+    die unless @ARGV;
+    return scalar shift @ARGV;
+}
+
+while (@ARGV && $ARGV[0] =~ m/^-/) {
+    $_= shift @ARGV;
+    last if m/^--?$/;
+    while (m/^-./) {
+       if (s/^-d//) { $rsyncdir= optarg(); }
+       elsif (s/^-O//) { push @specoceans, optarg(); }
+       elsif (s/^-a//) { $alloceans=1; }
+       else { die "$_ ?"; }
+    }
+}
+die if @ARGV;
+
+die if @specoceans && $alloceans;
+
+parse_info_serverside();
+
+if (@specoceans) {
+    print "### full update of specified oceans ...\n";
+    foreach my $ocean (@specoceans) {
+       die "$ocean ?" unless defined $oceans{$ocean};
+       full($ocean);
+    }
+} elsif ($alloceans) {
+    print "### full (inc.topology) update of all oceans ...\n";
+    foreach my $ocean (sort keys %oceans) {
+       full($ocean);
+    }
+} else {
+    print "### quick (no topology) update only (of all oceans) ...\n";
+    foreach my $ocean (sort keys %oceans) {
+       quick($ocean);
+    }
+}
+
+if (defined $rsyncdir) {
+    print "### master-info update ...\n";
+    update_master_info();
+}