hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

ラベル Subversion の投稿を表示しています。 すべての投稿を表示
ラベル Subversion の投稿を表示しています。 すべての投稿を表示

2012-01-22

Subversionでファイル名に濁点などを含む場合にコミット不許可にするフックスクリプト

Subversionでファイル名に濁点などを含む場合にコミット不許可にするフックスクリプトを作りました。
参考

このスクリプトはSubversion で ASCII 以外のファイル名を追加させない方法 - 酒日記 はてな支店を参考にさせて頂きました。ありがとうございます。

検証環境は、Scientific Linux 6.1, Subversion 1.7.2 (ソースからビルド)です。

以下のファイルをレポジトリのhooksディレクトリにpre-commitというファイル名で配置して実行パーミションをつけます。
#!/usr/bin/env perl
use strict;
use utf8;
use open ":utf8";
use Encode;
use Unicode::Normalize;

$ENV{LANG} = 'ja_JP.utf8';
my $SVNLOOK='/usr/bin/svnlook';

sub main {
  my ($repos, $txn) = @_;
  my @cmd = ($SVNLOOK, 'changed', "-t$txn", $repos);
  open my $pipe, '-|', @cmd or die $!;
  my $error = 0;
  while (my $line = <$pipe>) {
    chomp $line;
    if ($line =~ /^A\s+(.*)$/) {
      my $path = $1;
      if (contains_composition_characters($path)) {
        warn "Cannot use filename containing composition characters (ex. dakuten): $path\n";
        $error = 1;
      }
    }
  }
  close $pipe;
  exit $error;
}

sub contains_composition_characters {
  my $path = shift;
  return NFC($path) ne $path || NFD($path) ne $path;
}

if (@ARGV != 2) {
  die "Usage: $0 REPOS TXN\n";
}

main(@ARGV);

上記のスクリプト利用時にはApache実行時のLANGをja_JP.utf8にする必要があります。Scientific Linux 6.1の場合は、/etc/sysconfig/httpdにて以下のように設定します。
HTTPD_LANG=ja_JP.utf8

LANGがデフォルトのCだとコミット時にエラーメッセージが表示できず、以下のようになってしまいます。
$ svn ci -m ''
Adding         d4です.txt
Transmitting file data .svn: Commit failed (details follow):
svn: Commit blocked by pre-commit hook (exit code 1) with output:
[Error output could not be translated from the native locale to UTF-8.]

2010-10-14

WindowsマシンにsvnsyncでSubversionレポジトリをミラーリングする手順

Windows用のsvnsyncを用意

Windows用SubversionはCollabNet Subversionダウンロードからダウンロードできます。svnsyncはCollabNet Subversion Command-Line Clientには含まれないので、CollabNet Subversion Edge(サーバー)をダウンロード、インストールする必要があります。

ミラー先レポジトリの作成とセットアップ

C:\svn_repo>svnadmin create PROJ
C:\svn_repo>echo exit 0 > PROJ\hooks\pre-revprop-change.bat
C:\svn_repo>svnsync init file:///svn_repo/PROJ https://remote-subversion-server.example.com/svn/PROJ

なお、file:///にfile://C:/のようにドライブを含めるとエラーになりました。試した感じではfile:///でカレントドライブのディレクトリを見ているようです。

ミラーリング実行

C:\svn_repo>svnsync sync file:///svn_repo/PROJ

ロックが残ってしまった場合の削除方法

ミラーリング実行中にCtrl+Cで止めた場合は、ロックが残ってしまい再度ミラーリングしようとすると以下のようなエラーが出ます。

C:\svn_repo>svnsync sync file:///svn_repo/PROJ
Failed to get lock on destination repos, currently held by ...

以下のコマンドでロックを開放します。

svn pdel --revprop -r 0 svn:sync-lock file:///lac_svn_repo/TECS


参考:Malachi's Server: Failed to get lock on destination repos, currently held by....

ブログ アーカイブ