コードファイルを git にコミットする前に、pre-commit フックを使用してコードファイルをチェックしたいと考えています。確認には、Phing (PHP ビルド ツール) を使用します。
ここに私の pre_commit_hook (MacOS) があります:
#!/bin/sh
echo "Checking files before commit!"
phing -f pre_commit_build.xml || exit 1
そして、ここにビルドファイルがあります:
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyApplication" default="main" basedir=".">
<fileset id="php_project_files" dir="app">
<include name="*.php" />
<include name="**/*.php" />
</fileset>
<target name="main">
<echo message="+------------------------------------------+"/>
<echo message="| |"/>
<echo message="| Pre_Commit_Build |"/>
<echo message="| |"/>
<echo message="+------------------------------------------+"/>
<phingcall target="check_file_names" />
<phingcall target="check_syntax" />
<phingcall target="check_coding_guideline" />
<phingcall target="unit_test" />
</target>
...
<target name="check_file_names">
<property name="failure" value="0" />
<adhoc-task name="check_filename"><![CDATA[
class CheckFileName extends Task {
/** Any filesets of files that should be appended. */
private $filesets = array();
/**
* Nested creator, adds a set of files (nested <fileset> attribute).
* This is for when you don't care what order files get appended.
* @return FileSet
*/
function createFileSet() {
$num = array_push($this->filesets, new FileSet());
return $this->filesets[$num-1];
}
function main() {
// append any files in filesets
foreach($this->filesets as $fs) {
try {
$files = $fs->getDirectoryScanner($this->project)->getIncludedFiles();
foreach ($files as $file) {
if (preg_match('/^[a-z0-9-._]+$/', $file)) {
$this->log("Checked: " . $file);
} else {
$this->log("Error: " . $file . " : Allowed are only a-z 0-9 . - _", Project::MSG_ERR);
$this->project->setProperty('failure', '1');
}
}
} catch (BuildException $be) {
$this->log($be->getMessage(), Project::MSG_WARN);
}
}
}
}
]]></adhoc-task>
<echo message="+------------------------------------------+"/>
<echo message="| |"/>
<echo message="| Check PHP Filenames |"/>
<echo message="| |"/>
<echo message="+------------------------------------------+"/>
<check_filename>
<fileset refid="php_project_files" />
</check_filename>
<echo message="Failure ${failure}" />
...
<target name="check_syntax">
<phplint level="verbose" haltonfailure="false">
<fileset refid="php_project_files" />
</phplint>
</target>
...
</project>
現在、git はビルド プロセスを開始し、フォルダー「app」のすべてのファイルがチェックされます (コミットしたいファイルだけではありません)。プロセスの後、いくつかの失敗 (つまり、コーディング ガイドラインの違反) が見つかりますが、ビルド プロセスは終了し、ファイルはコミットされます (ただし、この場合はコミットされていません)。
ここに私の質問があります:
コミットしたいファイルのみを使用するように Phing に指示するにはどうすればよいですか。または: コミットするファイルに関する情報を git から Phing に転送するにはどうすればよいですか?
ビルド プロセスが失敗する必要がある場合、ビルド プロセスのターゲットで失敗したもの (ファイル名が間違っている、またはコーディング ガイドラインに違反しているなど) を「収集」し、制御するにはどうすればよいですか。
1 つ以上のターゲットが失敗した場合、戻り値 (1) を git に送信して、git がコミットを停止するにはどうすればよいですか?
adhoc-task で失敗したことを定義するにはどうすればよいですか (プロパティ ${failure} で試しましたか?
協力してくれてありがとうございます!
ステファン