0

私の職場では、誰かが 10 ~ 20 個のプロジェクトのいずれかの SVN リポジトリにファイルをチェックインしようとするたびに、Unix マシンで実行される Perl スクリプトが 1 つあります。

各プロジェクトには、誰かが何かをチェックインしたときに SVN が自動的に実行する「pre-commit」と呼ばれるファイルを含む独自の「Hooks」フォルダーがあります。ただし、「事前コミット」ファイルは、実際にはすべてのプロジェクトに共通の 1 つの中央 Perl スクリプトへのシンボリック リンクであるため、Perl スクリプトを変更する必要がある場合でも、すべてのプロジェクトで変更を行う必要はありません。

したがって、私の問題は次のとおりです。これらの各プロジェクトの「フック」ディレクトリに、そのプロジェクトに固有の設定を含むテキスト ファイルを配置する必要があります。したがって、10 ~ 20 個の設定ファイル (プロジェクトごとに 1 つ) がそれぞれの「フック」ディレクトリに存在します。

問題は、これらのテキスト ファイルを Perl スクリプトで開いて読み取る必要があることですが、Perl にファイルの場所を知らせる際に問題が発生しています。スクリプトがどこから実行されているかを示すはずの $0 パラメータを使用してみましたが、シンボリック リンクであるため、「ディレクトリではありません」と表示され、スクリプトが終了します。テキスト ファイルを見つけることができるように、"hooks" ディレクトリのパスを取得する必要があります。

4

1 に答える 1

0

SVN pre-commitスクリプトは、リポジトリへのパスを最初の引数として呼び出されることになっています。Perlスクリプト内では、その引数はとして使用可能である必要があります$ARGV[0]次のように、リポジトリパスに追加するだけで、対応するフックディレクトリまたはそのディレクトリ内のファイルへのパスを作成できるはずです。

$repopath = $ARGV[0];
$hookspath = $repopath . "/hooks";
$myfilepath = $hookspath . "/myfile";

ただし、移植性を最大限に高めるには、File::Specモジュールのpathname-manipulation関数を使用してこれを行う方がクリーンです。

このアプローチが機能しない場合は、Perlスクリプトがどのように呼び出されるかについて詳しく説明する必要があります。たとえば、pre-commitスクリプトが実際にシェルスクリプトラッパーであり、最終的に呼び出すperl場合は、pre-commit引数が適切に渡されていない可能性があります。

失敗している現在のコードを表示するのも良いことです。

于 2012-06-09T02:51:12.077 に答える