#! /usr/bin/perl # # パッケージ原文が更新されたときに、 # translation_list を更新するために upd_tl.perl に与える # 設定ファイルを作成するスクリプト # # original/ ディレクトリ以下にファイルを揃え、 # 変更/追加/削除されたファイルを git add で stage した上で # git commit を実行する前に、original/ の一つ上のディレクトリで # git status した結果を標準入力から与えてください。 # 結果は標準出力に出力するので、適当にリダイレクトして下さい。 # # 結果にはささいな変更も含まれますので、実際にはそれらに # 手動で対応した後、結果の該当部分を手動で削除してから # upd_tl.perl を使うことになると思います。 # # BUG: # ゴミを出力することがあります。手動で削除してください。 # sub cvfn() { my($fn) = @_; if($fn =~ m@man./([-.\w]+)\.(\d)$@){ return (1, "$1:$2"); } else { return (0, "$fn"); } } sub getdate() { my($fn) = @_; my($input,$date); open F, "<$fn"; while ($input = ) { if ($input =~ /^\.TH [^ ]+ +[1-8] +\"?([0-9]+)\-([0-9]+)\-([0-9]+)\"? /) { $date = $1 . "/" . $2 . "/" . $3; } } close F; if ($date) { return $date; } else { return "0000/00/00"; } } sub read_file_head() { my ($fn) = @_; my $top; open F, "<$fn"; $top = ; close F; return $top; } sub get_prefix() { my ($valid) = @_; if (not $valid) { return '# '; } else { return ''; } } sub print_entry() { # NOTE: $mode should be either of 'A' or 'U'. my ($mode, $fn, $top) = @_; my ($valid, $cvfn) = &cvfn($fn); my $prefix = &get_prefix($valid); if($top =~ /^.so ([-\w]+)/i){ print $prefix . 'L' . ' ' . &cvfn($fn) . ' ' . &cvfn($top) . "\n"; } else { print $prefix . $mode . ' ' . &cvfn($fn) . " " . &getdate($fn) . "\n"; } } sub print_removed_entry() { my ($fn) = @_; my ($valid, $cvfn) = &cvfn($fn); my $prefix = &get_prefix($valid); print $prefix . 'R ' . $cvfn . "\n"; } $state = "start"; while(<>){ s/[\r\n]*$//; $state = "staged" if /^(# )?Changes to be committed/; if(/^#?$/){ $state = ($state eq "staged") ? "target" : "done"; } next if $state ne "target"; s/^#?[ \t]*//; my($mode, $fn) = split(/: +/); if($mode eq 'new file'){ $top = &read_file_head($fn); &print_entry('A', $fn, $top); } if($mode eq 'modified'){ $top = &read_file_head($fn); &print_entry('U', $fn, $top); } if($mode eq 'deleted'){ &print_removed_entry($fn); } if($mode eq 'renamed'){ my ($fn_old, $fn_new) = split(' -> ', $fn); $top = &read_file_head($fn_new); &print_entry('A', $fn_new, $top); &print_removed_entry($fn_old); } }