我需要使用hg关键字扩展将构建日期和修订版嵌入到源文件中。撇开整个“你真的不想这样做”的论点,我怎么能这样做呢?
这是我的源文件(lib/foo/version.rb
)的样子(恰好是Ruby,但从我的构建中我没有“编译”步骤的角度来看,这只是相关的,我可以在-DREVISION =“$(hg id)”中执行:
module Foo
VERSION = {
:date => "$Date$",
:changeset => "$Revision$"
}
end
问题是$ Revision $和$ Date $使用该文件的变更集和提交日期进行了扩展,而我需要的是整个存储库的tip更改集和提交日期。 / p>
我没有看到我可以在hg help templates
中使用的明显模板,关键字扩展也没有提到具有全局范围的任何内容。我正在尝试做什么?
答案 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
。
我保证,无论您的设置是什么,都有比关键字扩展更漂亮的方式。