« 08.26 一夜明けたら忙しい2 | ココ | 08.29 SATAケーブルがなかった »
2010年8月27日
効率的にコピーしようぜ
昨日追われるように作って、社長に送った文章を今日改めて落ち着いて読んでみると、なかなかおかしな文章書いてることに気が付いて自分でも面白かった。ところどころ繋がってなさそうなところあったり。時間ないし、間違ったことは書いてないのでもう知らんけど。
というわけで、今日は昨日しようと思って全然できなかった今月末に仕上げる案件に思いっきり時間を割いたった。
以前からずっと、開発用のサーバーからテスト用のサーバーにファイルを移すのに、一つ一つファイルをコピーするなんていう(しかもcpコマンドで)とんでもないローテクなことをやってたんやけど、さすがにもっとうまいことやる方法に変えたいと思うようになり。スクリプト作ってしまった。
開発用のサーバーではSubversionの作業ディレクトリでプログラムを作ってて、テスト用(そして本番用)のサーバーではSubversionでの運用はやっていない。そして、テスト・本番環境では開発環境には存在しないデータファイルがたくさんあるとか、設定ファイルで同じ名前のファイルがあるとかで、それらを間違って上書きすると大変なことになってしまう。というわけで気楽にえいや! とよく知られたコマンド一発というわけにはいかない。
つまりは、うまいこと前回テスト・本番環境に入れた後にSubversionに入れた最新のファイルだけを対象にコピーしないといけない。そんでもってSubversionにコミットする前にテスト環境に入れたいときにはローカルの作業ディレクトリで変更があったファイルをコピーしないといけない。
そういう状況で使えるようにスクリプトを作った。コマンドラインの引数の1つめにHEADと比較するリビジョン番号(前回テスト・本番環境に入れた時のリビジョン番号)か'BASE'(ローカルの作業ディレクトリでの変更ファイルを対象にするとき)を指定し、2つめにコピー先のディレクトリを指定する。コピー先のディレクトリがなければコピーはしない。コマンドを実行するときのカレントディレクトリでsvnコマンドを実行してファイル名を拾ってくるので、コピー先のディレクトリ名の指定は階層に気を付けないといけない。そしてカレントディレクトリはSubversionの作業ディレクトリである必要がある。
#!/usr/bin/perl
use strict;
use File::Copy;
use File::Path;my $rev_from = shift @ARGV; # 比較するリビジョン、もしくは'BASE'(ローカルの変更ファイル)
my $copy_to = shift @ARGV; # コピー先のディレクトリ(なければコピーしない)
$copy_to =~ s/\/$// if $copy_to;print STDERR "Not copy mode.\n" unless $copy_to;
my @files = $rev_from eq 'BASE' ?
`svn st` :
`svn di -r ${rev_from}:HEAD | grep '+++'`;foreach my $file_line (@files) {
# コピー対象のファイル名を抜き出す
my ($file_to_copy) = ( $file_line =~ m/^\+\+\+ ([^\(]+)|^(?:M|A).{6}(.+)$/ )[-1];
$file_to_copy =~ s/^\s+|\s+$//g;
next unless -f $file_to_copy;
if ($copy_to) {
# コピー先のファイル名を決定する
my $file_dest = "$copy_to/$file_to_copy";
(my $dir_dest = $file_dest) =~ s/\/[^\/]*$//;
# コピー先のディレクトリがなければ作成する
mkpath $dir_dest unless -d $dir_dest;
print "$file_to_copy => $file_dest\n";
copy $file_to_copy, $file_dest or print STDERR "$!\n";
} else {
print "$file_to_copy\n";
}
}exit 0;
By ただ at 22:11 カテゴリー ; Perl , プログラミングとか
« 08.26 一夜明けたら忙しい2 |
08月の記事
| 08.29 SATAケーブルがなかった »
トラックバック
このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/1642