SVN通过指定JIRA票证id自动从主干合并到分支

SVN通过指定JIRA票证id自动从主干合并到分支,svn,merge,jira,Svn,Merge,Jira,我使用JIRA作为bug跟踪系统。如果有一个新发现的bug,那么它将首先提交到主干。提交是在特定票证下完成的。 例如,票证#37由提交来固定:65、68和74 有时我需要把一张票退到一家分行。因此,我必须下载一个分支的存储库,即#3并应用以下命令 svn merge -c65,68,74 http://.../svn/trunk 然后对每张票进行承诺等等 我想做的是指定来自JIRA和分支id的票证列表。这样它们将自动从主干合并到特定分支 实现这一点的选项有哪些?如果您从提交消息中以一致的方式

我使用JIRA作为bug跟踪系统。如果有一个新发现的bug,那么它将首先提交到主干。提交是在特定票证下完成的。 例如,票证#37由提交来固定:65、68和74

有时我需要把一张票退到一家分行。因此,我必须下载一个分支的存储库,即#3并应用以下命令

svn merge -c65,68,74  http://.../svn/trunk
然后对每张票进行承诺等等

我想做的是指定来自JIRA和分支id的票证列表。这样它们将自动从主干合并到特定分支


实现这一点的选项有哪些?

如果您从提交消息中以一致的方式引用Jira票证,使用Jira ABC-123票证号码格式,您可以通过搜索SVN日志获得修订列表

svn log --search=FOO-57 http://.../svn/trunk
这将为您提供每个相关提交的日志消息和修订号。假设是类unix环境,您可以使用一些管道和shell操作将svn日志输出转换为修订号列表,如下所示:

svn log --search=FOO-57 http://.../svn/trunk | grep ^r | cut '-d|' -f1 | sed s,r,,
再多一点shell操作,就可以以逗号分隔的格式提供相同的修订列表:

REVISIONS=($(svn log --search=FOO-57 http://.../svn/trunk | grep ^r | cut '-d|' -f1 | sed s,r,,))
echo "${REVISIONS[*]}" | sed 's/ /,/g'
因此,现在只需将第二个命令的输出用作
-c
参数,即可合并到
svn merge

REVISIONS=($(svn log --search=FOO-57 http://.../svn/trunk | grep ^r | cut '-d|' -f1 | sed s,r,,))
svn merge -c$(echo "${REVISIONS[*]}" | sed 's/ /,/g') http://.../svn/trunk
通过将搜索词和URL替换为
“$1”
“$2”
,可以将上述内容转换为可重用的shell脚本。或者,如果您想一次将其应用于多张Jira票据,您可以将整个内容包装在一个循环中,如下所示:

#!/bin/bash
TRUNK_URL="http://.../svn/trunk"
REVISIONS=($((for search_term in "$@"; do
    svn log --search="$search_term" "$TRUNK_URL" | grep ^r | cut '-d|' -f1 | sed s,r,,;
done) | sort -u))
svn merge -c$(echo "${REVISIONS[*]}" | sed 's/ /,/g') "$TRUNK_URL"

如果您希望避免使用shell脚本来获取修订列表,那么可以使用带有
libsvn
绑定的任何语言来获得类似的结果。下面是一个使用Python和:


更通用的方法?@NikolayKuznetsov以什么方式更通用?如果你的意思是平台无关,那么在任何可以使用I/O管道的语言中都可以实现相同的基本方法,因为我所做的只是操纵标准输出和命令行参数,Jira API不可能给你任何有用的东西,除非你把修订号存储在Jira的某个地方。您可以使用libsvn绑定在SVN日志消息中搜索票号;我已经用Python中的一个例子更新了答案。
#!/usr/bin/env python
import pysvn
logs = pysvn.Client().log('http://.../svn/trunk')
to_merge = { x['revision'].number for x in logs if 'FOO-57' in x['message'] }