Phing PHP构建选择文件的Git预提交钩子

Phing PHP构建选择文件的Git预提交钩子,php,git,build,phing,pre-commit,Php,Git,Build,Phing,Pre Commit,在将代码文件提交到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="MyAppl

在将代码文件提交到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

如果构建过程必须失败,我如何收集构建过程目标中的失败,即错误的文件名或违反编码准则和控制

如果一个或多个目标失败,我如何向git发送返回值1,以便git停止提交

我如何在临时任务中定义它失败?我已经用属性${failure}尝试过了

非常感谢您的支持


Stefan

关于我想提交的内容:

在中,我们将访问一个临时暂存区并检查这些区域。这是只验证阶段性更改的唯一方法。还可以考虑git add-p

返回值:让您的构建失败。phing以非0状态代码存在。

返回值:

如果我的任务失败,我将把它存储在属性${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过滤未收集的文件,并将结果存储到外部文件uncommitted_files.txt中。然后,我将加载此文件以创建包含未提交文件的文件集。当我将结果存储到属性中并使用include构建文件集时,这也会起作用

在我的例子中,这似乎是一种更好的方法,将所有未提交的文件复制到一个单独的目录中,如中所述,因为我不想移动一些MB,我必须提交一些非常大的文件