Skip to main content
 首页 » 编程设计

python之如何编写基本的 Mercurial 扩展

2025年05月04日10傻小

所以,我想制作一个基本的 Mercurial 扩展,将一个字符串附加到提交消息中。下面显示的代码放在一个文件中 - myextension.py 并包含在 .hgrc 中。

当我运行 hg commit -m "A message" 时,提交编辑器打开,并按预期显示消息 "A message APPENDED"。但是,如果我尝试通过按 CTRL+X 来中止提交,提交仍然会出现完整的、现在附加的消息。

我在这里做错了什么?

from mercurial import commands, extensions 
 
def commit(originalcommit, ui, repo, *pats, **opts): 
 
    if not opts["message"]: 
        return originalcommit(ui, repo, *pats, **opts) 
    else: 
        opts["force_editor"] = True 
        opts["message"] += " APPENDED" 
        return originalcommit(ui, repo, *pats, **opts) 
 
def uisetup(ui): 
    extensions.wrapcommand(commands.table, 'commit', commit) 

请您参考如下方法:

我认为这是正确的行为,因为 mercurial 的临时文件 传递给您的编辑器已经包含提交消息。你可以覆盖 这在某种程度上通过猴子修补 cmdutil.commitforceeditor 功能:

from mercurial import commands, extensions, cmdutil, util 
 
cfe = cmdutil.commitforceeditor 
 
def commitforceeditor(repo, ctx, subs): 
    text = cfe(repo, ctx, subs) 
 
    # Do not commit unless the commit message differs from  
    # the one you specified on the command line 
    if ctx.description() == text.strip(): 
        raise util.Abort("empty commit message") 
    else: 
        return text 
 
def commit(originalcommit, ui, repo, *pats, **opts): 
    if not opts["message"]: 
        return originalcommit(ui, repo, *pats, **opts) 
    else: 
        opts["force_editor"] = True 
        opts["message"] += " APPENDED" 
 
        # monkey-patch 
        cmdutil.commitforceeditor = commitforceeditor 
 
        return originalcommit(ui, repo, *pats, **opts) 
 
def uisetup(ui): 
    extensions.wrapcommand(commands.table, 'commit', commit)