2012年10月29日月曜日

[git] とりあえず、pre-commit hookは必要でしょ

背景


コミットする時、PHP errorチェックをするいつものやつ。

pre-commit フック


git commitでコミットする時に実行サれるフック。
このスクリプトが0以外で終了すると、コミットが止められる。
引数は特にない・・・?

ソース


こんな感じ。
gitの場合、パスが通っているところにgit-*って名前で保存されて、
実行権限があればgitのhookスクリプトとして認識してくれるみたいなので言語はなんでもいい。

これは、pythonで書いてみた。

地味に長くなったな・・・。


これを、.git/hooks/下に、pre-commitという名前で保存しておけば、
コミットする時エラーチェックをやってくれる。

#!/usr/bin/python
# coding: utf-8

import sys
import os
import subprocess

def get_index_files():

    # コマンドを実行
    proc = subprocess.Popen(['git', 'status', '--porcelain'],
                            #shell=True,
                            #cwd='/',
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.STDOUT,
                            close_fds=True)

    # 結果を読む
    files = []
    while True:
        line = proc.stdout.readline()
        if not line:
            break

        # status, fileを分割
        status, file_path =line[:2], line[3:].rstrip('\n')
        if status[:1]=='A' or status[:1]=='M':
            root, ext = os.path.splitext(file_path)

            # not php file
            if ext == ".php":
                files.append( file_path )
                continue

    return files

def chk_php_error(file):

    # php -l
    proc = subprocess.Popen(['php', '-l', file],
                            #shell=True,
                            #cwd='/',
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.STDOUT,
                            close_fds=True)

    # 結果を読む
    line = proc.stdout.readline()
    if line.find('No syntax errors') >= 0:
        return ""

    return  line.rstrip('\n')


def main():

    result=0

    # ファイルを取得
    files = get_index_files()

    # php -l 実行
    for f in files:
        error_str = chk_php_error(f)
        if error_str != "":
            print error_str
            result = 1

    # exit
    if result == 1:
        print '!!! git commit Failed !!!'

    sys.exit(result)


if __name__ == '__main__':
    main()





0 件のコメント:

コメントを投稿