2012年1月5日木曜日

[python] バージョン管理ツールbazaarのフックスクリプトを書いてみた

今日、文末に「;」がついてないphpソースをコミットしてしまった。

2回も。

bazaarのフックスクリプトを書いた。

内容は、コミットするときに、対象となるphpファイルに対して、
「php -l」を実行し、エラーがあったら、コミットしないというもの。
pythonで簡単にフックスクリプトを書けるのはありがたい。
参考文献が少なくて結構手こずったけども。

ソース


"""this is a plugin/hook for bazaar. just add this file to ~/.bazaar/plugins/"""


import os
import subprocess
import commands
from itertools import chain
from bzrlib import branch
from bzrlib import errors

version_info = (0, 0, 1, 'dev', 1)


def get_php_files(tree_delta):
    """get php files"""
    php_files = []

    for delta_file in chain(tree_delta.added, tree_delta.modified):

        # not php file
        bzr_path, file_id, type_ = delta_file[:3]
        root, ext = os.path.splitext(bzr_path)

        # not php file
        if ext == ".php":
            php_files.append(bzr_path)
            continue

    return php_files


def pre_commit_hook(local, master, old_revno, old_revid, future_revno, future_revid, tree_delta, future_tree):
    """This hook will execute precommit script from root path of the bazaar
        branch. Commit will be canceled if precommit fails."""

    # fix flg
    errflg = 0

    # get root directory path
    root_path = commands.getoutput("bzr root")

    # check file
    for bzr_path in  get_php_files(tree_delta):
        # exe php -l
        absolute_path = root_path + "/" + bzr_path
        if subprocess.call(["php", "-l", absolute_path]):
            errflg = 1
        print ""

    # commit
    if errflg == 1:
        raise errors.BzrError("You hsve several bugs in your php files.")
    else:
        print "Congratulations! There are no errors."

branch.Branch.hooks.install_named_hook('pre_commit', pre_commit_hook, 'Check pre_commit hook')

「~/.bazaar/plugins/」以下におけば、自動で読み込まれるはず。

rootのパスを取るために「bzr root」を実行しているところがすごくいけてない・・・。
絶対、引数から持ってこれるとは思うけど、調べてもわからなかったから、
取り急ぎこれで。


結果


ダメなphpファイルをコミットしてみる。


コミット結果
karino@goldfish:~/bzr_test/bran/karino$ bzr commit -m 'karino' 
Committing to: /home/karino/bzr_test/karino/                                                                                                                          
modified karino.php
PHP Parse error:  syntax error, unexpected $end, expecting T_VARIABLE or T_DOLLAR_OPEN_CURLY_BRACES or T_CURLY_OPEN in /home/karino/bzr_test/bran/karino/karino.php on line 4
Errors parsing /home/karino/bzr_test/bran/karino/karino.php

bzr: ERROR: You hsve several bugs in your php files. 
このようにコミット拒否される。

phpファイルを修正してコミットしてみると。


karino@goldfish:~/bzr_test/bran/karino$ bzr commit -m 'karino' 
Committing to: /home/karino/bzr_test/karino/                                                                                                                          
modified karino.php
No syntax errors detected in /home/karino/bzr_test/bran/karino/karino.php                                                                                             

Congratulations! There are no errors.
Committed revision 4650.


参考になったページ


bazaarのプラグインを作る(1)

フックを利用する

how to execute tests on a bazaar pre-commit hook

jk0 / bzr-pre-commit-hook

0 件のコメント:

コメントを投稿