2010-03-21 16 views
14

当我为应用程序的代码使用Subversion时,我可以在版本号上附加句号和svnversion的结果以创建唯一且单调增加的版本号,要保证任何签出相同修订版本的代码都会生成相同的版本号。基于Mercurial提交的单调递增版本号

在Mercurial中,由于版本号在克隆之间未必一致,因此本地修订号不适用。该散列适当地唯一且一致,但不会创建单调递增的数字。如何根据Mercurial存储库提交生成一个合适的数字以追加到版本号?

编辑:我有一个应用程序具有自动更新检查,它依赖于一个版本号,这是一个由句点分隔的整数链来确定版本是否更新。在发布之间的这段时间里,我有一些用户正在尝试构建测试版,这已经很常见了。通常,这些构建解决了测试人员遇到的问题,因此测试人员停止使用发布的版本并切换到测试版本。我在添加额外组件的版本号原来的目标是:

  • 确保当释放出来,使用测试版本,那些被自动更新以及提出
  • 能够很容易地辨别测试人员正在使用最新的测试版本

例如,0.5.0版的版本号为0.5.0.410;在0.5.1发布之前,有版本号为0.5.1.411,0.5.1.420和0.5.1.421的测试版本;那么,0.5.1版本的版本号为0.5.1.423。

+0

它不清楚为什么你认为你需要这个。 – 2010-03-22 12:23:28

+0

@jk我已经添加了更多解释 - 这有帮助吗? – Isaac 2010-03-22 17:01:58

+0

我正在考虑从SVN切换到Hg,我也遇到同样的问题 - 基于单调递增内部版本号的自动更新。 – 2011-07-20 05:54:00

回答

4

仍需要一些尝试,以保持有序和各种发展的配套建造,我第一次使用最后的Unix时间戳提交尝试:

REV=$(hg tip --template '{date|hgdate}' | cut -f1 -d' ') 

然而,这是烦人长(10位)。 (当然,这并不保证是唯一的,但是在我是唯一开发者的项目中,在同一秒内两次提交的概率基本上为0;事实上,在1分钟内提交两次提交的概率对方基本上是0)

由于“基地”版本号(到这个版本号被追加的部分)只有一个标签释放后立即改变,我已经结束了使用之间的分钟数尖端和最新的标记祖先:

HG_LAST_TAG_TIMESTAMP=$(hg log -r "$(hg log -r '.' --template '{latesttag}')" --template "{date|hgdate}\n" | cut -f1 -d' ') 
HG_TIP_TIMESTAMP=$(hg log -r '.' --template "{date|hgdate}\n" | cut -f1 -d' ') 
REV=$((($HG_TIP_TIMESTAMP - $HG_LAST_TAG_TIMESTAMP)/60)) 

编辑:使用tip是个错误,因为它是指把最新提交的任何分支;采用log -r '.'指的是工作副本所基于的修订版。)

+1

对于任何人在将来看这个(我不想碰到问题,所以我没有编辑它),我已经切换到(1)使用Python访问mercurial信息,(2)使用version.major.minor.days.minutes(例如0.7.0.196.72136)其中days是自上次发布以来的3位数天数,minutes是自上次发布以来的5位数分钟数(不包括整数以及(3)在组装开发测试版本时自动在本地回购中标记修订版本,这些版本将发布给其他人。这并不完美,但它符合我的需求。 – Isaac 2010-11-10 05:55:59

+0

注意:传统的环境变量为大写,局部变量为小写。 – 2016-12-31 18:24:34

4

你几乎击中了头部。使用任何单调增加的局部修订版本号都会与分布式特性发生冲突。这个基本的设计决定并没有优雅的方法。

+0

...修订号码根据定义是本地的,因为它们是从发展历史中推断出来的。 – 2010-03-21 06:49:31

+0

+1谢谢,这是我所期望的,但我希望我错过了一些东西。 – Isaac 2010-03-22 17:05:58

6

由于@Matthew表示,您不能期望跨克隆的版本号之间的任何比较具有任何价值。但是,如果您将应用程序基于单个存储库并始终从任何克隆推回到该中央存储库,那么只要您坚持一个分支,就可以依赖该单个中央版本号。

本质上,如果您以一种模仿Subversion的方式使用Mercurial,即使用单个中央存储库,则可以将版本号用作应用程序构建中的标记。

希望这会有所帮助。

+0

+1谢谢你的回答。 虽然我确实有一个中央repo,我推送所有更改,但是尝试使用它来获取内部版本号是因为在构建时没有推送当前版本。 更重要的是,正如你所说,那么我只是模仿Subversion,可能没有很好地利用Mercurial。 – Isaac 2010-03-22 17:05:06

+2

您仍然可以使用Mercurial的所有功能,但只需使其适用于适合您需求的工作流程即可。在你的情况下,你基本上希望你的克隆*了解*关于构建在其他克隆上的版本。对于“官方”版本使用中央存储库似乎是一种合理的方式。 – 2010-03-23 09:24:02