Я хочу использовать ловушку перед фиксацией, чтобы проверить свои файлы кода перед их фиксацией в git. Для проверки я буду использовать 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) в git, чтобы git остановил фиксацию?
Как я могу определить в специальной задаче, что она терпит неудачу (я пробовал это со свойством $ {failure}?
Большое спасибо за вашу поддержку!
Стефан