Mercurial关键字扩展可在每次提交时进行扩展

时间:2011-04-05 10:43:23

标签: mercurial commit keyword

我需要使用hg关键字扩展将构建日期和修订版嵌入到源文件中。撇开整个“你真的不想这样做”的论点,我怎么能这样做呢?

这是我的源文件(lib/foo/version.rb)的样子(恰好是Ruby,但从我的构建中我没有“编译”步骤的角度来看,这只是相关的,我可以在-DREVISION =“$(hg id)”中执行:

module Foo
  VERSION = {
    :date => "$Date$",
    :changeset => "$Revision$"
  }
end

问题是$ Revision $和$ Date $使用该文件的变更集和提交日期进行了扩展,而我需要的是整个存储库的tip更改集和提交日期。 / p>

我没有看到我可以在hg help templates中使用的明显模板,关键字扩展也没有提到具有全局范围的任何内容。我正在尝试做什么?

2 个答案:

答案 0 :(得分:3)

您可以安装更新文件的post-commit挂钩:

[hooks]
post-commit = sed -i lib/foo/version.rb \
  -e "s|\$Date.*\$|\$Date: $(date)\$|" \
  -e "s|\$Version.*\$|\$Version: $(hg id -i)\$|"

然后您应该将版本文件添加到.hgignore文件中 - 它会在每次提交后更改,因此总是很脏。您还可以添加一个用于清理版本文件的编码过滤器:

[encode]
lib/foo/version.rb =  sed -e "s|\$Date.*\$|\$Date\$|" \
                          -e "s|\$Version.*\$|\$Version\$|"

此脚本将使Mercurial将文件视为干净 - 无论它确实包含哪个日期和变更集,Mercurial都会将其视为包含未展开的$Date$$Version$关键字:

$ hg commit -m test
$ hg tip
changeset:   7:df81c9ddc9ad
tag:         tip
user:        Martin Geisler 
date:        Wed Apr 06 14:39:26 2011 +0200
summary:     test

$ hg status
$ hg cat version.py
date = "$Date$"
version = "$Version$"
$ cat version.py
date = "$Date: Wed Apr  6 14:39:26 CEST 2011$"
version = "$Version: df81c9ddc9ad$"

答案 1 :(得分:0)

如果您从结帐中运行代码,则可以直接调用hg并缓存该值。类似的东西:

module Foo
  VERSION = {
    :version => system("hg log --template '{note|short}-{latesttag}-{latesttagdistance}' -r .")
  }
end

如果您没有在安装了Mercurial的系统上的结帐中运行代码,那么您的部署脚本可以轻松获取/使用该值 - 可能通过使用hg archive来获取tarball发送然后自动包含.hg_archive.txt

我保证,无论您的设置是什么,都有比关键字扩展更漂亮的方式。