Bazaar:提交修改时提交时自动修改文件

时间:2011-08-03 11:49:02

标签: file hook commit bazaar

我希望bazaar在提交到已提交分支中的文件时写入修订号,以便此修改包含在提交中。

我查看了钩子,但pre_commit钩子只在创建变更集后运行,因此不会提交由它执行的修改。

我发现了一个相关的问题: Bazaar: Modify file content before commit via hook? 但是,建议的bzr-keywords解决方案不起作用,因为它的写入转换未应用于提交:

``bzr commit``之后不会隐式应用写转换器 准备文件。如果这对给定的插件提供有意义 一个内容过滤器,插件通常可以通过使用一个来实现这个效果 ``start_commit``或``post_commit``钩子。

让我回到pre_commit钩子问题。

我这样做的原因是:我的软件在编译时从版本文件中读取其版本。版本由主号,分号和修订号组成(例如5.3.78)。我希望bazaar在提交时自动将实际版本写入版本文件。

2 个答案:

答案 0 :(得分:4)

您应该使用start_commit挂钩,因为这是在提交之前更改文件的唯一方法:http://doc.bazaar.canonical.com/bzr.2.3/en/user-reference/hooks-help.html#start-commit

  

start_commit

     

在对树执行提交之前调用。 start commit hook能够在提交之前更改树。使用bzrlib.mutabletree.MutableTree调用start_commit,即正在执行提交。

答案 1 :(得分:2)

我有一个插入start_commit的插件脚本,名为start_commit.py。每次提交时,它都会从项目树的基础调用名为.startcommit的shell脚本。我将此与Ledger数据一起用于在每次提交之前转储所有余额以进行验证。

我没有写这个插件,我无法通过快速搜索找到我从哪里获取它,所以这里是源(〜/ .bazaar / plugins / start_commit.py):

from bzrlib import errors, mutabletree

def start_commit(tree):
    """This hook will execute tree/on-commit."""
    import os,subprocess
    from bzrlib import errors
    abspath = tree.abspath('.startcommit')
    # if there is no on-commit, bail
    if not os.path.exists(abspath):
        return
    try:
        subprocess.check_call(abspath)
    # if precommit fails (process return not zero) cancel commit.
    except subprocess.CalledProcessError:
        raise errors.BzrError("on-commit failed")

mutabletree.MutableTree.hooks.install_named_hook('start_commit', start_commit, 
    "tree on-commit")

如果有人知道,我很乐意将原始作者归功于此代码段。否则我希望它有所帮助!