承诺:标记" bug-无处不在"消息中提到的问题已完成

时间:2014-08-05 15:34:33

标签: git githooks bugs-everywhere

我在项目中使用gitbugs-everywhere。如果你不知道后者,它是一个简单的基于文本文件的问题跟踪器,即错误只是文件,修改它们是使用命令行工具be完成的。文件本身存储在git存储库中。 bugs-everywhere的想法是让问题状态与您提交的代码保持同步。

我想要实现的目标:如果程序员提交更改并引用他刚刚修复的消息中的错误(例如消息类似于fixed #123),我想标记使用相应的be命令完成的问题。这显然会更改问题文件。然后我希望这些更改包含在当前提交中。

由于我需要解析提交消息,我不能使用pre-commit挂钩但需要使用commit-msg挂钩。但我无法找到任何信息是否可以更改正在提交的内容而只能更改提交的消息

我的想法是,在commit-msg钩子中,总是拒绝这样的提交,但也做另一个提交,其中包括问题文件中的相应更改。这留下了一些悬而未决的问题:

  • 是否可以在commit-msg hook期间执行提交?
  • 是否可以可靠地找出用户最初要提交的文件? (我想我可以简单地使用提交消息中的注释行,但它们是否可能被截断?)

或者你能想到一种不同的方法吗?

另一个没有真正解决上述问题的想法是仅使用钩子来检查程序员是否已将问题标记为已完成。我的主要目标是避免忘记将问题标记为已完成。

1 个答案:

答案 0 :(得分:1)

正如评论中所讨论的那样,并不是真的建议像这样配置工作流程。

作为替代方案,我选择反过来:当提交包含对问题文件的更改时,请在准备好的提交消息中提及错误。

我使用prepare-commit-msg钩子实现了这个机制,我将在这里逐步描述:

  • 首先,我根据当前工作目录中的文件列出所有当前修复的错误,并获取其UUID:

    fixedbugs="`be list -x --status fixed | sed -n 's#  <uuid>\(.*\)</uuid>#\1#p'`"
    
  • 对于他们每个人,我检查以下两件事:HEAD中是否已修复错误?问题文件本身是否为提交暂存(允许部分提交)?这可以使用git diffHEAD之间的--staged来检查;然后根据使用"status": "fixed"的差异找出行grep是否已添加。 (注意,这里,十六进制字符串2111156...是我的bugdir的ID,替换为您自己的ID:

    for bug in $fixedbugs; do
        if git diff HEAD --staged .be/211156fd-fa49-4e87-878c-7642f7163a4b/bugs/$bug/values | grep '^\+    "status": "fixed",.\?$' > /dev/null; then
            # (do something with $bug, e.g. `be show $bug...`)
        fi
    done
    
  • 对于每个此类问题“现在要提交修复”(在上面的if内),我收集一些信息并连接要提交给提交消息的文本行:

    # collect information
    details="`be show -x 211156fd-fa49-4e87-878c-7642f7163a4b/$bug`"
    short="`echo "$details" | sed -n 's#.*<short-name>\(.*\)</short-name>.*#\1#p'`"
    shorter="`echo "$short" | sed 's#211/##'`"   # remove bugdir
    summary="`echo "$details" | sed -n 's#.*<summary>\(.*\)</summary>.*#\1#p'`"
    
    # prepend string in format 'fixed #123: "foo bar is broken"'
    prepend="$prepend`echo fixed \#$shorter: \\\"$summary\\\"`\n"
    
  • 在钩子的末尾,将此字符串添加到准备好的提交消息:

    tmpfile="`mktemp`
    echo "$prepend" > $tmpfile
    cat "$1" >> $tmpfile
    mv "$tmpfile" "$1"
    

完整挂钩文件作为https://gist.github.com/leemes/dd336e5fc88096ad6924

的要点发布

如果您有任何改进建议或发现错误,请发表评论。