2010-03-04
■Subversionで外部定義(svn:externals)を利用したブランチをタグリリースする。
タグを作成するときに、外部定義(svn:externals)を含んでいると、参照先が更新されたときに外部定義部分だけ最新版になっちゃったりする。
外部定義にリビジョンを明示してあげればいいんだけど、外部定義のあるところをいちいち手動で書き換えるのはめんどくさい。
サーバ側のフックスクリプト(pre-commit, post-commit等)でなんとかできないか調べてみたけど難しそうだったので、クライアント側でタグをcommitする際にsvn:externalsに参照するリビジョンを埋め込むスクリプトを組んでみた。
<使用方法>
<スクリプトの内容>
- タグの元になるフォルダをsvn copyする
- コピーしたフォルダのリポジトリURLの中のbranchesをtagsに置換して、svn switchする(このときにリポジトリのHEADのリビジョン番号を取得)
- コピーしたフォルダに含まれるsvn:externalsを検索し、2で取得したリビジョン番号を埋め込む
- コピーしたフォルダをcommitする
#!/usr/local/bin/perl use strict; use warnings; use Encode; my $os = 'linux'; # windowsで利用する場合はコメントアウトしてください。 #my $os = 'windows'; # linuxで利用する場合はコメントアウトしてください。 # 出力文字コードの選択 my $output_code; if ($os eq 'windows'){ $output_code = 'cp932'; } else { $output_code = 'utf8'; } # ブランチをコピーする opendir my $current_dir, './'; print encode($output_code, decode('utf8', "フォルダ一覧:\n")); while (my $file = readdir($current_dir)){ next if ($file =~ /^\./); if (-d $file){ print "$file\n"; } } closedir($current_dir); # コピー元フォルダの入力 my $src; while (1){ print encode($output_code, decode('utf8', "タグリリースする元フォルダ名を入力してください:")); $src = <STDIN>; chomp($src); if (-d $src){ last; } else { print encode($output_code, decode('utf8', "指定のフォルダが存在しません。\n")); } } # タグ名の入力 my $dst; print encode($output_code, decode('utf8', "タグ名を入力してください :")); $dst = <STDIN>; chomp($dst); # copyの前のupdate確認(とりあえずしてない) # svn copyの実施 print encode($output_code, decode('utf8', "svn copyを行います。\n")); system("svn copy $src ./$dst"); # 切り替え先URLの作成 chdir($dst); open my $svninfo, '-|', 'svn info' or die $!; my $changed_url; while(my $line = <$svninfo>){ chomp $line; if($line =~ /^URL:\s(.*)/){ $changed_url = $1; $changed_url =~ s/branches/tags/; print encode($output_code, decode('utf8', '次のURLにタグを作成します: ' . $changed_url . "\n")); } } close($svninfo); # svn switchの実施 chdir("../"); open my $svnswitch, '-|', "svn switch $changed_url $dst" or die $!; my $rev; while(my $line = <$svnswitch>){ chomp $line; Encode::from_to($line, $output_code, 'utf8'); if($line =~ /^リビジョン\s([\d]*)\sです。/){ $rev = $1; } } print encode($output_code, decode('utf8', 'svn:externalsを次のrevに固定します: ' . $rev . "\n")); close($svnswitch); # externalsを書き換える # svn:externalsの取得 chdir($dst); open my $svnpropget, '-|', 'svn propget svn:externals -R' or die $!; while(my $line = <$svnpropget>){ chomp $line; if($line =~ /(.*)\s-\s(.*)\s(.*)/){ my $target = $1; my $param = "$3 -r$rev $2"; # 何故か、リビジョン指定なしとリビジョン指定ありで、SRC/DSTの記述順が逆 # リビジョン指定なし: SRC DST # リビジョン指定あり: DST -r rev SRC # print '$target: ' . $target . "\n"; # print '$param : ' . $param . "\n"; system("svn propset svn:externals \"$param\" $target"); } } close($svnpropget); # リポジトリにコミットする chdir("../"); print encode($output_code, decode('utf8', "コミットログを入力してください: ")); my $commit_log = <STDIN>; chomp($commit_log); system("svn commit $dst -m $commit_log"); __END__
以下、いろいろ参考にさせてもらったところ。(結果的に関係なかったものも含む)
<commitする前にクライアント側でsvn:externalsを書き換える作戦>
- (っ´∀`)っ ゃー » Blog Archive » 【perl】 STDINを使って、画面からの入力内容を表示する
- CreoSprout ソフトウェア研究部 TortoiseSVNのsvn:externalsの使い方がわかった
- cl.pocari.org - Subversion で作業コピーの URL を変更する方法
- Perlリファレンス - open:ITpro - netstatコマンドを実行して、結果を取得する
- 楽天が運営するポータルサイト : 【インフォシーク】Infoseek
- Subversionと格闘。 - DROP.FACTORY -- Blog
<commitされた時にサーバ側でsvn:externalsを書き換える作戦>
この数の多さが、検討中の迷走ぶりを表している……。
- svn - How can I access the commited file from a Subversion pre-commit hook in Perl? - Stack Overflow
- Subversion 初期設定(2) - miauの避難所
- svn:pre-commit [reverseFold.com Wiki]
- 404 Not Found
- 試験管のなかのコード :: Subversion と Trac の連携にチャレンジ (2)
- Subversionのコミットhookでsvn:mime-type属性を付与する « 来栖川電算
- subversion: Issue 2238 - svn propset/propdel does not support URL argument
- Subversion の属性
- SVNコマンドメモ(Hishidama’s Subversion command Memo)
- permissions - How to forbid subversion commits to svn:external to revisions? - Stack Overflow
- svn propset
- 特定のディレクトリのみチケット必須にする - 大食雑記
- Akt One.: SVN で空ログを禁止する hook script (bat版)
- Commit Hooks on WIndows | Subversionary
- Windows上のSubversionでpre-commitを使う: とりあえず言わせて!-本質の追究-
- 2005-01-25 - masakas日記[Subversion]pre-commitフックを作ってみる。
- 日曜研究室 » post-commitでsvn updateされない!?
- Subversionのコミットログを修正 - てんぷらメモ
- Subversion のフック・スクリプト (コミット関連) - snbhsmt_log
- no title
- Memo/Subversion - DEX Lab
- no title
- Odyssey » Subversion Hooks
- no title - A pre-commit hook to detect case-insensitive filename clashes.
- 外部定義
- no title
- svn:externals - 刺身☆ブーメランのはてなダイアリー
- :: Subversion svn:externalsにハマる | vectorさんのブログ ::
- svn propset について調べてみた(svn:external, svn:ignore, svn:executable) | Supernova
- Old Nabble - Subversion Users - svn:externals example
- Tags in Subversion
- svn:externals で相対パスのサポート (relative svn:externals)
トラックバック - http://d.hatena.ne.jp/inumasa75/20100304/1267705322
リンク元
- 28 http://discypus.jp/wiki/?ソフト/Bug Tracking/trac/2010
- 20 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4SUNA_jaJP297JP297&q=SVN++ドメイン管理
- 10 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=accessから+mysql+Connection ODBC接続&btnG=検索&lr=lang_ja&aq=f&oq=
- 6 http://www.google.co.jp/search?rlz=1C1GPEA_enJP317JP317&sourceid=chrome&ie=UTF-8&q=accessでmysql+フォームのインポート
- 5 http://pipes.yahoo.com/pipes/pipe.info?_id=02db597254ec68550537866a2fca2ce6
- 5 http://search.yahoo.co.jp/search?p=MySQL+Accessファイルに接続&ei=UTF-8&meta=vc=&pstart=1&fr=top_ga1_sa&b=11
- 5 http://www.google.co.jp/search?hl=ja&source=hp&q=access+mysql+接続&btnG=Google+検索&lr=&aq=0&oq=access+mysql
- 4 http://74.125.153.132/search?q=cache:fSGjf243oMsJ:d.hatena.ne.jp/inumasa75/20090117/1232164768+"odbcデータソースアドミニストレータ"+mdb+windows+se
- 4 http://www.google.co.jp/search?hl=ja&rls=com.microsoft:ja:IE-ContextMenu&rlz=1I7GZHZ_ja&q=windowsXP+subversion+HTTP+500&btnG=検索&lr=lang_ja&aq=f&oq=
- 4 http://www.google.co.jp/search?hl=ja&source=hp&q=Access+MySQLインポート&lr=&aq=f&aqi=&aql=&oq=&gs_rfai=

