パスワードを忘れた? アカウント作成
470078 journal

Ab.の日記: Subversion の pre-commit で頑張る(一度作ったタグの更新禁止、短すぎるコミットログ禁止)

日記 by Ab.
一度作った tag で更新の commit が行われるのを禁止したかったのでちょっとスクリプト作成。
ぐぐると http://tortoisesvn.tigris.org/servlets/ReadMsg?listName=dev&msgNo=21153 にそういう感じのがあるんですが、見た感じ、tags/ の下には add か delete しか絶対に許さないよ!っていうだけに見えるので、作った tag の下にファイルの追加だけして commit は通ってしまうんじゃないかと思って自作。
やっつけなので結構きたないですが、実際に判別する perl script。
tags/なんとか/ が add されたトランザクションの時に限り、 tags/なんとか/ 以下の操作を許可するが、それ以外の tags/かんとか 以下に対する操作があったら怒ります。
適当に kick-tag-update.pl とか名付けました。

#!/usr/bin/env perl
use strict;

my $svnlook = "/usr/local/bin/svnlook";
die unless @ARGV == 2;
my $txn = shift;
my $repos = shift;
my (@addedtag, @usedtag);

open(LOG, ">/tmp/loglog.log") or die;
open(HD, "$svnlook changed -t $txn $repos|") or die;
while ($_ = <HD>) {
  chomp;
#  print LOG "$_\n";
  if (m/^([ADU ])[U ][ \t]+tags\/(.*)$/) {
    my ($op, $path) = ($1, $2);
    print LOG "$op / $path\n";
    if ($op eq 'A' && $path =~ m|^([^/]+)/$|) {
      my $tag = $1;
      print LOG "new tag $tag\n";
      push(@addedtag, $path);
    }elsif ($path =~ m|^([^/]+)/|) {
      my $utag = $1;
      print LOG "$utag tagged file $path\n";
      push(@usedtag, $path);
    }
  }
}
close(HD);

my $files_not_allowed;
foreach my $p ( @usedtag ) {
  print LOG "ckecking $p\n";
  my $allowed = 0;
  foreach my $tag ( @addedtag ) {
    if (substr($p, 0, length($tag)) eq $tag) {
      $allowed = 1;
      print LOG "$p allowed by $tag\n";
      next;
    }
  }
  if (! $allowed) {
    $files_not_allowed .= "$p ";
    print LOG "not allowed: $p\n";
  }
}
close(LOG);

if (length($files_not_allowed) > 0) {
  print STDERR "files below are operated under existing tag.\n";
  print STDERR "$files_not_allowed\n";
  exit 1;
}

exit 0;

そして hooks/pre-commit に追加。

$REPOS/hooks/kick-tag-update.pl "$TXN" "$REPOS" || exit 1

ちなみに、空っぽもしくはそれに近いコミットログを蹴るのも適当に作成。

$SVNLOOK log -t "$TXN" "$REPOS" | \
    sed 's/[. \t\r\n]//g' | grep -q '....' || exit 1

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり

読み込み中...