2011-08-03 113 views
2

我希望bazaar在提交時將修訂編號寫入提交分支中的文件,以便將此修改包括在提交中。Bazaar:在提交修改時自動修改文件

我查看了鉤子,但pre_commit鉤子只在創建變更集後運行,因此它所執行的修改不會被提交。

我發現了一個相關的問題: Bazaar: Modify file content before commit via hook? ,然而,所提出的BZR的關鍵字解決方案無法正常工作或作爲不適用其寫入轉換提交:

``BZR commit``不會隱在 指定文件後應用寫入轉換器。如果這對於提供內容過濾器的給定插件是有意義的,則插件通常可以通過使用「start_commit」或「post_commit」鉤子來實現這種效果。

這讓我回到pre_commit掛鉤問題。

我這樣做的理由:我的軟件在編譯時從版本文件中讀取其版本。版本由主號碼,分行號碼和修訂號碼組成(例如5.3.78)。我希望集市在提交時自動將實際版本寫入版本文件。

回答

4

您應該使用start_commit掛鉤,因爲這是改變文件的唯一方法之前承諾:http://doc.bazaar.canonical.com/bzr.2.3/en/user-reference/hooks-help.html#start-commit

start_commit

提交上一棵樹執行之前調用。啓動提交鉤子能夠在提交之前更改樹。 start_commit是通過正在執行提交的bzrlib.mutabletree.MutableTree調用的。

+0

非常感謝 - 它甚至寫在我的問題中......我只是希望鉤子會從某種原因被稱爲分支... mutabletree工作得很好。 – jvm

+1

Bazaar插件[Bazaar版權更新程序](https://launchpad.net/bzr-text-checker)演示了使用'start_commit'鉤子的一個很好的例子。 – tvStatic

2

我有一個插入start_commit的插件腳本,名爲start_commit.py。這會在每次提交時從項目樹的底部調用名爲.startcommit的shell腳本。我將這個與Ledger數據一起使用,以便在每次提交之前轉儲所有餘額以進行驗證。

我沒有寫這個插件,我無法找到,我從一個快速搜索了它,所以這裏的源(〜/ .bazaar /插件/ 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") 

如果有人知道,我很樂意把這個片段的原作者信任。否則,我希望它有幫助!

+0

感謝這個例子 - 我以類似的方式工作。 – jvm