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