2010-03-21 49 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