Git Pre Commit Hook para Phing PHP Build Seleccionar files

Quiero utilizar un gancho precompromiso para verificar mis files de código antes de enviarlos a git. Para verificar, usaré Phing (una herramienta de compilation de PHP).

Aquí está mi pre_commit_hook (MacOS):

#!/bin/sh echo "Checking files before commit!" phing -f pre_commit_build.xml || exit 1 

Y aquí está el file de compilation:

 <?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 az 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> 

Actualmente git inicia el process de compilation y se verifican TODOS los files de la carpeta 'aplicación' (no solo aquellos que deseo confirmar). Después del process, aunque se detectarán algunos errores (es decir, la violación de la pauta de encoding), el process de compilation finalizará y los files se confirmarán (pero no en este caso).

Aquí están mis preguntas:

  1. ¿Cómo puedo decirle a Phing que use solo los files que quiero comprometer? O bien: ¿cómo puedo transferir la información sobre los files para enviar desde Git a Phing?

  2. ¿Cómo puedo "recostackr" los errores en los objectives del process de compilation (es decir, nombres de file incorrectos o violación de una guía de encoding) y controlar, si el process de compilation tiene que fallar?

  3. Si uno o más objectives fallan, ¿cómo puedo enviar un valor de retorno (1) a git, para que git detenga la confirmación?

  4. ¿Cómo puedo definir en una tarea adhoc que falla (lo he probado con la propiedad $ {failure}?

¡Muchas gracias por su ayuda!

Stefan

Acerca de "solo lo que quiero comprometer":

En nuestro gancho de confirmación , comprobamos los files en un área de preparación temporal y los examinamos. Esa es la única forma de verificar solo los cambios por etapas. (También piense en git add -p ).

Valor de retorno: solo deja que tu compilation falle. phing existe con un código de estado que no es 0.

VALOR DEVUELTO:

Si mi tarea ha fallado, la almacenaré en la propiedad $ {task_failed} (failed = 1).

Deje que la construcción falle por

 <if> <equals arg1="${task_failed}" arg2="1" /> <then> <fail message="Task failed" /> </then> </if> 

RECOGIDA DE ARCHIVOS NO COMPROMETIDOS:

Gracias a @cweiske he creado una tarea para recostackr mis files no confirmados:

 <target name="collect_uncommited_files"> <exec command="git diff-index --name-only --cached --diff-filter=ACMR HEAD" output="uncommitted_files.txt" /> <fileset id="uncommitted_files" dir="./" includesfiles="uncommited_files.txt"> </fileset> </target> 

Filtrado files no recogidos con git diff-index y almacenar el resultado en el file externo uncommited_files.txt. De lo que cargaré este file para crear un set de files con mis files no confirmados. (Esto también funcionaría, cuando almacene el resultado en una propiedad y construya mi set de files con include).

En mi caso, parece ser una mejor forma de copyr todos los files no comprometidos en un directory separado como lo hago en @cweiske: revisar los files , porque no quiero mover algo de MB (tengo que enviar algunos files muy grandes) )