chiark / gitweb /
Show which ocean failed if yppedia-chart-parser fails
[ypp-sc-tools.db-live.git] / yarrg / update-master-info
1 #!/usr/bin/perl -w
2
3 use strict (qw(vars));
4 use DBI;
5 use Commods;
6
7
8 sub full ($) {
9     my ($ocean) = @_;
10     quick($ocean);
11     print "## updating topology of $ocean\n";
12     system('./yppedia-chart-parser',$ocean); die "$ocean $?" if $?;
13 }
14
15 sub quick ($) {
16     my ($ocean) = @_;
17     print STDERR "## updating schema and commodities for $ocean\n";
18     system('./db-idempotent-populate',$ocean); die $? if $?;
19 }
20
21 my $rsyncdir;
22
23 sub process_some_info ($$$) {
24     my ($v,$df,$sfn) = @_;
25     my $sf= new IO::File $sfn or die "$sfn $!";
26
27     my $h;
28     while (<$sf>) {
29         chomp; s/\s+$//;
30         next if m/^\s*\#/ || !m/\S/;
31         if (m/^\S.*/) {
32             $h= $&;
33         }
34         die "$_ ?" unless defined $h;
35         if ($h =~ m/^commods|^\%[a-z]\b/) {
36             s/\t.*//;
37         }
38         if ($v<2) {
39             next if $h =~ m/^nocommods/;
40         }
41         next if $sfn =~ m/source-info/ && $h =~ m/^ocean/;
42
43         print $df $_, "\n" or die $!;
44     }
45
46     $sf->error and die $!;
47 }
48
49 sub update_master_info () {
50     foreach my $v (1..$masterinfoversion) {
51         my $dfnl= sprintf "master-info%s.txt", ($v>1 ? "-v$v" : '');
52         print STDERR "installing new $dfnl...\n";
53     
54         my $dfn= "$rsyncdir/$dfnl";
55         my $df= new IO::File "$dfn.tmp", 'w' or die "$dfn.tmp $!";
56
57         process_some_info($v,$df, 'source-info.txt');
58         foreach my $ocean (sort keys %oceans) {
59             process_some_info($v,$df, '_ocean-'.(lc $ocean).'.txt');
60         }
61
62         close $df or die $!;
63         rename "$dfn.tmp", "$dfn" or die $!;
64     }
65 }
66
67
68 my @specoceans;
69 my $alloceans;
70
71 sub optarg () {
72     return $_ if length;
73     die unless @ARGV;
74     return scalar shift @ARGV;
75 }
76
77 while (@ARGV && $ARGV[0] =~ m/^-/) {
78     $_= shift @ARGV;
79     last if m/^--?$/;
80     while (m/^-./) {
81         if (s/^-d//) { $rsyncdir= optarg(); }
82         elsif (s/^-O//) { push @specoceans, optarg(); }
83         elsif (s/^-a//) { $alloceans=1; }
84         else { die "$_ ?"; }
85     }
86 }
87 die if @ARGV;
88
89 die if @specoceans && $alloceans;
90
91 parse_info_serverside();
92
93 if (@specoceans) {
94     print "### full update of specified oceans ...\n";
95     foreach my $ocean (@specoceans) {
96         die "$ocean ?" unless defined $oceans{$ocean};
97         full($ocean);
98     }
99 } elsif ($alloceans) {
100     print "### full (inc.topology) update of all oceans ...\n";
101     foreach my $ocean (sort keys %oceans) {
102         full($ocean);
103     }
104 } else {
105     print "### quick (no topology) update only (of all oceans) ...\n";
106     foreach my $ocean (sort keys %oceans) {
107         quick($ocean);
108     }
109 }
110
111 if (defined $rsyncdir) {
112     print "### master-info update ...\n";
113     update_master_info();
114 }