1

コードファイルを 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」のすべてのファイルがチェックされます (コミットしたいファイルだけではありません)。プロセスの後、いくつかの失敗 (つまり、コーディング ガイドラインの違反) が見つかりますが、ビルド プロセスは終了し、ファイルはコミットされます (ただし、この場合はコミットされていません)。

ここに私の質問があります:

  1. コミットしたいファイルのみを使用するように Phing に指示するにはどうすればよいですか。または: コミットするファイルに関する情報を git から Phing に転送するにはどうすればよいですか?

  2. ビルド プロセスが失敗する必要がある場合、ビルド プロセスのターゲットで失敗したもの (ファイル名が間違っている、またはコーディング ガイドラインに違反しているなど) を「収集」し、制御するにはどうすればよいですか。

  3. 1 つ以上のターゲットが失敗した場合、戻り値 (1) を git に送信して、git がコミットを停止するにはどうすればよいですか?

  4. adhoc-task で失敗したことを定義するにはどうすればよいですか (プロパティ ${failure} で試しましたか?

協力してくれてありがとうございます!

ステファン

4

2 に答える 2

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 でフィルタリングし、結果を外部ファイル uncommited_files.txt に保存します。このファイルをロードして、コミットされていないファイルでファイルセットを作成します。(これは、結果をプロパティに保存し、インクルードを使用してファイル セットを構築する場合にも機能します。)

私の場合、 @cweiske:checkout the filesで行ったように、コミットされていないすべてのファイルを別のディレクトリにコピーするのがより良い方法のようです。 )。

于 2013-09-05T08:51:04.797 に答える