Git Pre Commit Hook для файлов выбора сборки PHP Phing

Я хочу использовать ловушку перед фиксацией, чтобы проверить свои файлы кода перед их фиксацией в 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 будут проверены (не только те, которые я хочу зафиксировать). После завершения процесса, хотя и будут обнаружены некоторые сбои (т.е. нарушение рекомендаций по кодированию), процесс сборки завершится, и файлы будут зафиксированы (но в данном случае этого не произошло).

Вот мои вопросы:

  1. Как я могу указать Phing использовать только те файлы, которые я хочу зафиксировать. Или: как я могу передать информацию о файлах для фиксации из git в Phing?

  2. Как я могу «собрать» отказы в целях процесса сборки (т.е. неправильные имена файлов или нарушение правил кодирования) и контролировать, если процесс сборки завершится ошибкой.

  3. Если одна или несколько целей выйдут из строя, как я могу отправить возвращаемое значение (1) в git, чтобы git остановил фиксацию?

  4. Как я могу определить в специальной задаче, что она терпит неудачу (я пробовал это со свойством $ {failure}?

Большое спасибо за вашу поддержку!

Стефан


person stefan    schedule 01.09.2013    source источник


Ответы (2)


О «только то, что я хочу зафиксировать»:

В нашем крючке фиксации мы извлечь файлы во временную промежуточную область и изучить их. Это единственный способ проверить только поэтапные изменения. (Также подумайте о git add -p).

Возвращаемое значение: просто позвольте вашей сборке потерпеть неудачу. phing существует с кодом статуса, отличным от 0.

person cweiske    schedule 02.09.2013

ВОЗВРАТНАЯ СТОИМОСТЬ:

Если моя задача не удалась, я сохраню это в свойстве $ {task_failed} (failed = 1).

Чем я позволил сборке провалиться

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

СБОР НЕЗАПИСАННЫХ ФАЙЛОВ:

Благодаря @cweiske я создал задачу по сбору незафиксированных файлов:

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

Я фильтрую несобранные файлы с помощью git diff-index и сохраняю результат во внешнем файле uncommited_files.txt. Затем я загружу этот файл, чтобы создать набор файлов с моими незафиксированными файлами. (Это также сработает, если я сохраню результат в свойстве и создаю свой набор файлов с помощью include.)

В моем случае, кажется, лучший способ вместо этого скопировать все незафиксированные файлы в отдельный каталог, как это сделано в @ cweiske: проверить файлы, потому что я не хочу перемещать некоторые МБ (мне нужно зафиксировать несколько очень больших файлов).

person stefan    schedule 05.09.2013