如何为名称遵循模式的标记创建revset别名?

时间:2015-06-17 21:01:52

标签: mercurial mercurial-revsets

在我的存储库中,我有version-1.2.3形式的标签。我想制作一个像这样调用的revset别名new()

hg log -r 'new(1.2.3, 1.2.4)'

...并扩展到:

hg log -r '::version-1.2.4 - ::version-1.2.3'  # What's new in 1.2.4?

当我尝试这样做时:

[revsetalias]
new($1, $2) = ::version-$2 - ::version-$1

... Mercurial将其解释为从修订版$2中减去修订版1.2.3(例如version),这不是我的意图。

我也尝试过使用##连接运算符:

new($1, $2) = ::"version-" ## $2 - ::"version-" ## $1

但是hg log -r 'new(1.2.3, 1.2.4)'给了我这个错误:

hg: parse error at 13: syntax error

我还尝试使用ancestors()而不是::语法,但仍然出现语法错误。这可能吗?

2 个答案:

答案 0 :(得分:5)

我测试了以下有效的方法:

new($1, $2) = (::"version-" ## $2) - (::"version-" ## $1)

供参考$1::$2不会给你同样的东西,它意味着$1$2之间的修订 我更喜欢的等效转换是:

new($1, $2) = only("version-" ## $2, "version-" ## $1)

根据文件,它完全等同于你想要的东西:

"only(set, [set])"
      Changesets that are ancestors of the first set that are not ancestors of
      any other head in the repo. If a second set is specified, the result is
      ancestors of the first set that are not ancestors of the second set
      (i.e. ::<set1> - ::<set2>).

答案 1 :(得分:-1)

旁注 $1::$2将更具可读性并为您提供DAG的相同部分only()提供正确的结果 in所有案例,根据@ lc2817答案中的讨论,DAG可能会失败

我几乎成功获得答案,但在最后一步遇到了一些麻烦(并且知道无法调试):在[revsetalias]中汇总所有内容

<强>前言

因为参数是标签而tag()谓词允许在参数中使用正则表达式 - 我会使用它们

Revset tag("re:version\-")显示所有代码,以&#34;版本开头 - &#34;

Revset,硬编码为字符串显示单一变更集

hg log -r "tag('re:version\-1.7$')
changeset:   2912:454a12f024f3

(尾随$是强制性的,否则它将是所有1.7 *标签)

我在revsetalias中的最佳尝试是tag('re:version\-\$1$') - 没有错误也没有输出:我无法完全扩展命令以查看所有处理和替换并使用参数化的revsetalias检测我的错误

HTH