OSDN Git Service

info/GNU_which: Add some explanations.
[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 $translation_list = $ARGV[0];
53 $update_list = $ARGV[1];
54 $newver = $ARGV[2];
55
56 #
57 # import old tranalation_list
58 #
59 open TL, $translation_list || die "cannot open $translation_list\n";
60 while(<TL>){
61     chomp;
62     %ti = line2hash($_);
63     my $pname = "$ti{sec}:$ti{fname}";
64     %{$tl{$pname}} = %ti;
65 }
66 close TL;
67 $package = $ti{pkg};
68
69 #
70 # parse update_list
71 #
72 open UL, $update_list || die "cannot open $update_list\n";
73 while (<UL>){
74     chomp;
75     if (/^\#/) {next};
76
77     my @ull = split(/[ :]/);
78
79     if (@ull < 3) {die "entry must contain at lease 3 fields\n"};
80     my $pname = "$ull[2]:$ull[1]";
81
82     if ($ull[0] eq "U") {
83         if (@ull > 3) { $Udate{$pname} = $ull[3] }
84         else{ $Udate{$pname} = "no-change"; }
85         next;
86     }
87
88     if ($ull[0] eq "A") {
89         if (@ull < 4){die "date entry is ommitted for A entry\n"}
90         $Adate{$pname} = $ull[3];
91         next;
92     }
93
94     if ($ull[0] eq "L") {
95         if (@ull < 5){die "lname and/or lsec entry is ommitted for L entry\n"}
96         $Lfile{$pname} = "$ull[4]:$ull[3]";
97         next;
98     }
99
100     if ($ull[0] eq "R") {
101         $Rfile{$pname} = "yes";
102         next;
103     }
104 }
105
106 #
107 # update and remove roff pages
108 #
109 foreach my $n (sort keys %tl){
110     if ($Udate{$n} ne undef){
111         # link ページが roff に変更された場合は
112         # 新規追加ページと同様に扱う。
113         if (${$tl{$n}}{kind} ne "roff") {
114             delete $tl{$n};
115             $Adate{$n} = $Udate{$n};
116             next;
117         }
118
119         ${$tl{$n}}{over} = $newver;
120
121         if (${$tl{$n}}{stat} !~ /(dft|prf)/){
122             ${$tl{$n}}{dver} = ${$tl{$n}}{rver};
123         }
124
125         if ($Udate{$n} ne "no-change"){${$tl{$n}}{odat} = $Udate{$n}};
126
127         if (${$tl{$n}}{stat} eq "up2date"){${$tl{$n}}{stat} = "upd_non";}
128         elsif (${$tl{$n}}{stat} eq "up2datR"){${$tl{$n}}{stat} = "upd_rsv";}
129         elsif (${$tl{$n}}{stat} eq "cnt_upd"){${$tl{$n}}{stat} = "cnt_old";}
130         next;
131     }   
132
133     if ($Rfile{$n} ne undef){
134         open NOL, ">> obsoleted_list.$newver";
135         ${$tl{$n}}{comment} = "dissap. at $newver";
136         my $ol = hash2line(%{$tl{$n}});
137         print NOL "$ol\n";
138         close NOL;
139         delete $tl{$n};
140         next;
141     }
142
143     if (${$tl{$n}}{rver} eq ${$tl{$n}}{over} ||
144         ${$tl{$n}}{rver} eq undef) {${$tl{$n}}{rver} = $newver;}
145
146     if (${$tl{$n}}{dver} eq ${$tl{$n}}{over} ||
147         ${$tl{$n}}{dver} eq undef) {${$tl{$n}}{dver} = $newver;}
148
149     ${$tl{$n}}{over} = $newver;
150 }
151
152 #
153 # add roffs from update_list
154 #
155 foreach my $n (keys %Adate) {
156     (my $psec, my $pname) = split(/:/, $n);
157     ${$tl{$n}}{stat} = "1st_non";
158     ${$tl{$n}}{kind} = "roff";
159     ${$tl{$n}}{pkg}  = $package;
160     ${$tl{$n}}{over} = $newver;
161     ${$tl{$n}}{odat} = $Adate{$n};
162     ${$tl{$n}}{fname} = $pname;
163     ${$tl{$n}}{sec} = $psec;
164 }
165
166 #
167 # add links from update_list
168 #
169 foreach my $n (keys %Lfile) {
170     my $lpage = $Lfile{$n};
171     (my $psec, my $pname) = split(/:/, $n);
172     (my $lsec, my $lname) = split(/:/, $lpage);
173
174     ${$tl{$n}}{kind} = "link";
175     if(${$tl{$lpage}}{odat} eq undef) {die "no link file $lname for $n\n";}
176
177     ${$tl{$n}}{pkg}  = $package;
178     ${$tl{$n}}{fname} = $pname;
179     ${$tl{$n}}{sec} = $psec;
180     ${$tl{$n}}{lname} = $lname;
181     ${$tl{$n}}{lsec} = $lsec;
182 }
183
184 #
185 # refresh links
186 #
187 foreach my $n (keys %tl){
188     if (${$tl{$n}}{kind} ne "link") {next;}
189
190     if (${$tl{$n}}{lname} eq undef){
191         open NOL, ">> obsoleted_list.$newver";
192         ${$tl{$n}}{comment} = "dissap. at $newver";
193         my $ol = hash2line(%{$tl{$n}});
194         print NOL "$ol\n";
195         close NOL;
196         delete $tl{$n};
197         next;
198     }
199
200     my $lpage = "${$tl{$n}}{lsec}:${$tl{$n}}{lname}";
201
202     if(${$tl{$lpage}}{stat} =~ /^up/){
203         ${$tl{$n}}{stat} = "up2date";
204     } else {
205         ${$tl{$n}}{stat} = "1st_non";
206     }
207     ${$tl{$n}}{odat} = ${$tl{$lpage}}{odat};
208     ${$tl{$n}}{over} = ${$tl{$lpage}}{over};
209     ${$tl{$n}}{dver} = ${$tl{$lpage}}{dver};
210     ${$tl{$n}}{rver} = ${$tl{$lpage}}{rver};
211
212 }
213
214 open NTL, "> $translation_list.$newver";
215 foreach $n (sort keys %tl){
216     if (${$tl{$n}}{stat} eq undef){next;}
217
218     my $ol = hash2line(%{$tl{$n}});
219     print NTL "$ol\n";
220 }
221 close NTL;
222