Расширение ключевых слов Mercurial для расширения при каждом коммите - PullRequest
6 голосов
/ 05 апреля 2011

Мне нужно использовать расширение ключевого слова hg, чтобы встроить дату сборки и ревизию в исходный файл. Оставляя в стороне весь аргумент «вы действительно не хотите делать это», как я могу это сделать?

Вот как выглядит мой исходный файл (lib/foo/version.rb) (это Ruby, но это актуально только с той точки зрения, что в моей сборке нет шага «компиляции», который я мог бы сделать -DREVISION = "$ (hg id)" in):

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

Проблема состоит в том, что $ Revision $ и $ Date $ расширяются с помощью набора изменений и даты фиксации этого файла , тогда как мне нужна подсказка набора изменений и дата фиксации всего хранилища.

Я не вижу очевидного шаблона, который можно использовать в hg help templates, и расширение ключевых слов не упоминает ничего с глобальной областью действия. Возможно ли то, что я пытаюсь сделать?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Вы можете установить 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$"
0 голосов
/ 06 апреля 2011

Если вы запускаете код из кассы, вы можете напрямую вызвать hg и кэшировать значение. Что-то вроде:

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

и если вы не запускаете код из-за проверки в системе с установленным Mercurial, то ваш скрипт развертывания может легко получить / использовать значение - возможно, с помощью hg archive, чтобы заставить tar-архив отправить автоматически включает .hg_archive.txt.

Я гарантирую, что есть более красивый способ сделать это, чем расширение ключевых слов, независимо от настроек.

...