3 # JMpost (admin/tools/Jmpost) を用いてポストされた
4 # メールから Git への登録 (translation_list 変更他)
7 # メールは UTF-8 変換後に標準入力から流してください。
9 # cat <mail> | nkf -Lu -w | ml2cvs
17 $epath = `dirname $0`; chomp $epath;
18 my $lpath = "$epath/../bin";
19 unshift (@INC, $lpath);
22 use JMtl ('line2hash', 'hash2line');
24 my $ROFFROOT = "$epath/../manual";
25 my $WWW_ROOT = "$epath/../www";
26 my $DISTROOT = "$epath/../dist";
29 my $release_body = "";
34 my $context = "header";
39 if ($DEBUG eq "on") {print "$context : $_ \n";}
41 if ($context eq "header"){
43 if($_ =~ /\(non-menber post\)/){
44 print STDERR "non-member post. ignore.\n";
48 (my $trash, $mlnumber) = split;
50 if ($mlnumber !~ /\[JM:[0-9]{5,5}\]/){
51 $mlnumber = '[LOCAL]';
54 if (/^<STATUS>/) { $context = "status"; next;}
57 if ($context eq "status"){
58 my $val = $_; $val =~ s/^[a-z]{4}: +//; $val =~ s/ +$//;
59 if (/^stat:/){$status{'stat'} = $val; next;}
60 if (/^ppkg:/){$status{'ppkg'} = $val; next;}
61 if (/^page:/){$status{'page'} = $val; next;}
62 if (/^date:/){$status{'date'} = $val; next;}
63 if (/^mail:/){$status{'mail'} = $val; next;}
64 if (/^name:/){$status{'name'} = $val; next;}
65 if (/^<\/STATUS>/) { $context = "intermission"; next;}
68 if ($context eq "intermission"){
69 unless (/^$/){ $context = "body";}
73 if ($context eq "body"){
74 if (/^_{40,}$/) { $context = "end"; next; }
75 $draft_body .= "$_\n";
76 unless ($_ =~ /\.\\\"O/){
77 $release_body .= "$_\n";
81 if ($context eq "end") { next; }
85 for my $key (keys %status){
86 print "$key: $status{$key}\n";
90 # Delete bogus blank lines at the bottom
91 $draft_body =~ s/\n+\n$/\n/;
92 $release_body =~ s/\n+\n$/\n/;
97 my $ppkg = $status{'ppkg'};
98 my $dir = $ppkg; $dir =~ s/ /_/eg;
99 my $name = $status{'page'};
100 ($name =~ /.*\.([1-9])$/) || die "Filename match failed\n";
103 my $bdir = "$ROFFROOT/$dir";
105 my $ddir = "$bdir/draft/man$sec";
106 my $rdir = "$bdir/release/man$sec";
108 my $draft = "$ddir/$name";
109 my $release = "$rdir/$name";
111 my ($df_stat, $rf_stat);
112 if (-f $draft) {$df_stat = "upd";} else {$df_stat = "new";}
113 if (-f $release) {$rf_stat = "upd";} else {$rf_stat = "new";}
115 my $tlist = "$bdir/translation_list";
116 my $clog = "$bdir/ChangeLog";
118 my $clog_ins = `date`; chomp $clog_ins;
119 $clog_ins .= " JM ML to Git Gateway\n\n";
127 open TLO, $tlist or die "cannot open $tlist\n";
130 my %ti = line2hash($_);
132 if ($ti{'kind'} eq 'link' &&
133 "$ti{'lname'}.$ti{'lsec'}" eq $status{'page'} &&
134 $status{'stat'} =~ /^R/)
136 $ti{'stat'} = 'up2date';
137 my $tll = hash2line(%ti);
138 if ($DEBUG eq "yes") {print "$ismatch MATCH: $tll\n"};
139 $tlist_body .= "$tll\n";
143 unless ("$ti{'fname'}.$ti{'sec'}" eq $status{'page'}) {
144 $tlist_body .= "$_\n";
145 if ($DEBUG eq "yes") {print "$ismatch : $_\n"};
151 if ($ti{'stat'} =~ /^1st/){
152 $ti{'stat'} = "1st_";
154 $ti{'stat'} = "upd_";
157 if ($status{'stat'} =~ /^TR/){$ti{'stat'} .= 'rsv'; last SW1;}
158 if ($status{'stat'} =~ /^DO/){$ti{'stat'} .= 'dft'; last SW1;}
159 if ($status{'stat'} =~ /^DP/){$ti{'stat'} .= 'prf'; last SW1;}
160 if ($status{'stat'} =~ /^PR/){$ti{'stat'} .= 'prf'; last SW1;}
161 if ($status{'stat'} =~ /^RO/){$ti{'stat'} = 'up2date'; last SW1;}
162 if ($status{'stat'} =~ /^RR/){$ti{'stat'} = 'up2datR'; last SW1;}
163 die "error in STAT description\n";
166 if ($status{'stat'} =~ /^R/){
167 $ti{'rver'} = $ti{'over'};
168 $ti{'dver'} = $ti{'over'};
169 # $ti{'newsec'} = $ti{'sec'};
172 $ti{'tdat'} = $status{'date'};
173 $ti{'tmail'} = $status{'mail'};
174 $ti{'tname'} = $status{'name'};
176 my $tll = hash2line(%ti);
178 if ($DEBUG eq "yes") {print "$ismatch MATCH: $tll\n"};
179 $tlist_body .= "$tll\n";
182 if ($ismatch eq "no") {die "No match in $tlist\n"};
184 system "mv -f $tlist $tlist.orig";
185 open TLN, "| nkf -w > $tlist" or die "cannot open $tlist.new\n";
186 print TLN $tlist_body;
188 print "UPDATE: $tlist\n";
190 $clog_ins .= "\t* translation_list: $mlnumber\n";
195 if ($status{'stat'} =~ /^D/ || $status{'stat'} =~ /^R/){
196 system "mkdir -p $ddir";
197 open DF, "| nkf -w > $draft" || die "cannot open $draft";
198 print DF $draft_body;
201 $clog_ins .= "\t* draft/man$sec/$name: $mlnumber\n";
203 if ($df_stat eq "upd") {print "UPDATE: $draft\n" }
204 else {print "CREATE: $draft\n";}
210 if ($status{'stat'} =~ /^R/){
211 system "mkdir -p $rdir";
212 open RF, "| nkf -w > $release" || die "cannot open $release";
213 print RF $release_body;
216 $clog_ins .= "\t* release/man$sec/$name: $mlnumber\n";
218 if ($rf_stat eq "upd") {print "UPDATE: $release\n" }
219 else {print "CREATE: $release\n";}
225 my $clog_body = `cat $clog`;
226 $clog_body =~ s/^/$clog_ins\n/;
228 system "mv -f $clog $clog.orig";
229 open CL, "| nkf -w > $clog" || die "cannot oepn $clog for writing\n";
233 print "UPDATE: $clog\n";
236 unless ($status{'stat'} =~ /^R/) {exit 0;}
239 # $dir: $ppkg のスペースを _ に置換した文字列
246 if ($rf_stat eq "new") {
247 $pagelink = " _NEW_PAGE($ppkg, $name)\n";
249 $pagelink = " _UPD_PAGE($ppkg, $name)\n";
252 my $newsfile = "$WWW_ROOT/news.m4";
253 system "mv -f $newsfile $newsfile.orig";
254 open NMO, "nkf -w $newsfile.orig |" || die "cannot open $newsfile.orig for reading\n";
255 open NMN, "| nkf -w > $newsfile" || die "cannot open $newsfile for writing\n";
257 my $date = `date "+%Y/%m/%d"`; chomp $date;
259 unless (m/ML2CVS ADD HERE/) {print NMN; next;}
264 unless ($tmp =~ $date) { # 日付がマッチしなかった
265 print NMN " <H2>$date</H2>\n";
267 print NMN " 以下のファイルを追加・更新しました。\n";
270 print NMN " <DT>$ppkg</DT>\n <DD>\n";
272 print NMN " </DD>\n </DL>\n\n";
280 print NMN $tmp; # 日付行を出力
282 while (($tmp = <NMO>) !~ /<\/DL>/) {
283 unless ($tmp =~ /<DT>$ppkg/){
293 } until ($tmp =~ /<\/DD>/);
295 print NMN $tmp; #</DD> 行
299 # 日付はマッチしたが、マッチするパッケージがなかった
300 print NMN " <DT>$ppkg</DT>\n <DD>\n";
302 print NMN " </DD>\n";
306 close NMO; # news.m4.orig
309 print "UPDATE: $newsfile\n";
312 unless ($rf_stat eq "new") { exit 0;}
314 # dist/script/pkgs.list
316 my $pkgsfile = "$DISTROOT/script/pkgs.list";
317 if (`grep $dir $pkgsfile` == 0) {exit 0;}
319 system "cp -f $pkgsfile $pkgsfile.orig";
320 open PL, "nkf -w >> $pkgsfile" || die "cannot open $pkgsfile for addition\n";
321 print PL "$dir\tY\n";
323 print "UPDATE: $pkgsfile\n";