OSDN Git Service

admin: JM-tl-modify.pl clears status/version field if -c is specified.
[linuxjm/jm.git] / admin / upd_tl.perl
1 #!/usr/bin/perl
2 #
3 # update_list を見て translation_list を更新する。
4 #
5 # 第 1 引数に translation_list, 第 2 引数に update_list,
6 # 第 3 引数にパッケージの新しいバージョンを指定する。
7 #
8 # 出力ファイルのファイル名は "第1引数.第3引数" となる。
9 #
10 # update_list の書式は以下の通り
11 #
12 # ・フィールドの区切り文字は ":" または " "。
13 #
14 # ・第 1 フィールドは U(更新) A(追加)  L(リンク) のいずれか。
15 #   # で始まる行はコメント行とみなされる。
16 #
17 # ・第 2, 3 フィールドは basename と セクション番号。
18 #
19 # ・U, A の場合, 第 4 フィールドはオリジナルの日付。
20 #   (U の場合は省略可能。その場合は現在の日付が使われる。)
21 #
22 # ・L の場合、第 4, 5 フィールドはリンク先ページの basename と
23 #   セクション番号。
24 #
25 # update_list の例:
26 #
27 #       #updated
28 #       U strtok:3 2000/02/13
29 #       U toupper:3
30 #       #NEWLY ADD
31 #       A pivot_root:2 2000/02/03
32 #       A daemon:3 1993/06/09
33 #       L dlclose:3 dlopen:3
34 #       L dlerror:3 dlopen:3
35 #       A dlopen:3 1995/05/16
36 #       L dlsym:3 dlopen:3
37 #
38 # バグ・制限
39 #      セクションの変更したページには対応してません。
40 #      ページの削除には対応してません。
41 #
42 BEGIN{
43     $epath = `dirname $0`; chomp $epath;
44     my $lpath = "$epath/../bin";
45     unshift (@INC, $lpath);
46 }
47 use JMtl('hash2line', 'line2hash');
48
49 my (%ti, %tl, $package, $newver);
50
51 if (@ARGV < 2) { die "$0 translation_list update_list new_version\n";}
52 $newver = $ARGV[2];
53
54 #
55 # import old tranalation_list
56 #
57 open TL, $ARGV[0] || die "cannot open $ARGV[0]\n";
58 while(<TL>){
59     chomp;
60     %ti = line2hash($_);
61     my $pname = "$ti{sec}:$ti{fname}";
62     %{$tl{$pname}} = %ti;
63 }
64 close TL;
65 $package = $ti{pkg};
66
67 #
68 # parse update_list
69 #
70 open UL, $ARGV[1] || die "cannot open $ARGV[1]\n";
71 while (<UL>){
72     chomp;
73     if (/^\#/) {next};
74
75     my @ull = split(/[ :]/);
76
77     if (@ull < 3) {die "entry must contain at lease 3 fields\n"};
78     my $pname = "$ull[2]:$ull[1]";
79
80     if ($ull[0] eq "U") {
81         if (@ull > 3) { $Udate{$pname} = $ull[3] }
82         else{ $Udate{$pname} = "no-change"; }
83         next;
84     }
85
86     if ($ull[0] eq "A") {
87         if (@ull < 4){die "date entry is ommitted for A entry\n"}
88         $Adate{$pname} = $ull[3];
89         next;
90     }
91
92     if ($ull[0] eq "L") {
93         if (@ull < 5){die "lname and/or lsec entry is ommitted for L entry\n"}
94         $Lfile{$pname} = "$ull[4]:$ull[3]";
95         next;
96     }
97
98     if ($ull[0] eq "R") {
99         $Rfile{$pname} = "yes";
100         next;
101     }
102 }
103
104 #
105 # update and remove roff pages
106 #
107 foreach my $n (sort keys %tl){
108     if ($Udate{$n} ne undef){
109         # link ページが roff に変更された場合は
110         # 新規追加ページと同様に扱う。
111         if (${$tl{$n}}{kind} ne "roff") {
112             delete $tl{$n};
113             $Adate{$n} = $Udate{$n};
114             next;
115         }
116
117         ${$tl{$n}}{over} = $newver;
118
119         if (${$tl{$n}}{stat} !~ /(dft|prf)/){
120             ${$tl{$n}}{dver} = ${$tl{$n}}{rver};
121         }
122
123         if ($Udate{$n} ne "no-change"){${$tl{$n}}{odat} = $Udate{$n}};
124
125         if (${$tl{$n}}{stat} eq "up2date"){${$tl{$n}}{stat} = "upd_non";}
126         elsif (${$tl{$n}}{stat} eq "up2datR"){${$tl{$n}}{stat} = "upd_rsv";}
127         elsif (${$tl{$n}}{stat} eq "cnt_upd"){${$tl{$n}}{stat} = "cnt_old";}
128         next;
129     }   
130
131     if ($Rfile{$n} ne undef){
132         open NOL, ">> obsoleted_list.$newver";
133         ${$tl{$n}}{comment} = "dissap. at $newver";
134         my $ol = hash2line(%{$tl{$n}});
135         print NOL "$ol\n";
136         close NOL;
137         delete $tl{$n};
138         next;
139     }
140
141     if (${$tl{$n}}{rver} eq ${$tl{$n}}{over} ||
142         ${$tl{$n}}{rver} eq undef) {${$tl{$n}}{rver} = $newver;}
143
144     if (${$tl{$n}}{dver} eq ${$tl{$n}}{over} ||
145         ${$tl{$n}}{dver} eq undef) {${$tl{$n}}{dver} = $newver;}
146
147     ${$tl{$n}}{over} = $newver;
148 }
149
150 #
151 # add roffs from update_list
152 #
153 foreach my $n (keys %Adate) {
154     (my $psec, my $pname) = split(/:/, $n);
155     ${$tl{$n}}{stat} = "1st_non";
156     ${$tl{$n}}{kind} = "roff";
157     ${$tl{$n}}{pkg}  = $package;
158     ${$tl{$n}}{over} = $newver;
159     ${$tl{$n}}{odat} = $Adate{$n};
160     ${$tl{$n}}{fname} = $pname;
161     ${$tl{$n}}{sec} = $psec;
162 }
163
164 #
165 # add links from update_list
166 #
167 foreach my $n (keys %Lfile) {
168     my $lpage = $Lfile{$n};
169     (my $psec, my $pname) = split(/:/, $n);
170     (my $lsec, my $lname) = split(/:/, $lpage);
171
172     ${$tl{$n}}{kind} = "link";
173     if(${$tl{$lpage}}{odat} eq undef) {die "no link file $lname for $n\n";}
174
175     ${$tl{$n}}{pkg}  = $package;
176     ${$tl{$n}}{fname} = $pname;
177     ${$tl{$n}}{sec} = $psec;
178     ${$tl{$n}}{lname} = $lname;
179     ${$tl{$n}}{lsec} = $lsec;
180 }
181
182 #
183 # refresh links
184 #
185 foreach my $n (keys %tl){
186     if (${$tl{$n}}{kind} ne "link") {next;}
187
188     if (${$tl{$n}}{lname} eq undef){
189         open NOL, ">> obsoleted_list.$newver";
190         ${$tl{$n}}{comment} = "dissap. at $newver";
191         my $ol = hash2line(%{$tl{$n}});
192         print NOL "$ol\n";
193         close NOL;
194         delete $tl{$n};
195         next;
196     }
197
198     my $lpage = "${$tl{$n}}{lsec}:${$tl{$n}}{lname}";
199
200     if(${$tl{$lpage}}{stat} =~ /^up/){
201         ${$tl{$n}}{stat} = "up2date";
202     } else {
203         ${$tl{$n}}{stat} = "1st_non";
204     }
205     ${$tl{$n}}{odat} = ${$tl{$lpage}}{odat};
206     ${$tl{$n}}{over} = ${$tl{$lpage}}{over};
207     ${$tl{$n}}{dver} = ${$tl{$lpage}}{dver};
208     ${$tl{$n}}{rver} = ${$tl{$lpage}}{rver};
209
210 }
211
212 open NTL, "> $ARGV[0].$newver";
213 foreach $n (sort keys %tl){
214     if (${$tl{$n}}{stat} eq undef){next;}
215
216     my $ol = hash2line(%{$tl{$n}});
217     print NTL "$ol\n";
218 }
219 close NTL;
220