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



我需要使用hg关键字扩展将构建日期和修订嵌入到源文件中。抛开"你真的不想这么做"的论点不谈,我该怎么做呢?

这是我的源文件(lib/foo/version.rb)看起来像(碰巧是Ruby,但这只是从我的构建中没有"编译"步骤的角度来看,我可以做一个-DREVISION="$(hg id)"in):

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

问题是,$Revision$和$Date$是用该文件的更改集和提交日期展开的,而我需要的是整个存储库的提示更改集和提交日期。

我没有看到可以在hg help templates中使用的明显模板,关键字扩展也没有提到任何具有全局作用域的内容。我想做的事有可能吗?

你可以安装一个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小费变更集:7:df81c9ddc9ad标签 : 提示用户:Martin Geisler日期:星期三4月6日14:39:26 2011 +0200摘要:测试$ hg状态$ hg cat version.pydate = "$ date $"version = "$ version $"$ cat version.pydate = "$ date:星期三4月6日14:39:26 CEST 2011$"version = "$ version: df81c9ddc9ad$"

如果您从签出运行代码,则可以直接调用hg并缓存该值。比如:

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

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

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

最新更新