我希望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在提交时自动将实际版本写入版本文件。
答案 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")
如果有人知道,我很乐意将原始作者归功于此代码段。否则我希望它有所帮助!