Подстановка ключевых слов в Mercurial - PullRequest
5 голосов
/ 21 января 2011

У меня возник бы вопрос по Mercurial с расширением расширения ключевого слова: возможно ли расширить фактическое сообщение о фиксации ключевым словом, чтобы оно появлялось в источниках для быстрого ознакомления с тем, что находится в источниках?

Редактировать: похоже, работает:

в репозитории hgrc

Log={desc}

Но он не складывается, как это делает якобы аналог CVS.

Используйте Источник, Люк:

Расширения, охватывающие более одной строки, и инкрементные расширения, как CVS '$ Log $, не поддерживаются. Ключевое слово шаблон карты "Журнал = {desc} "раскрывается до первой строки описания набора изменений.

1 Ответ

6 голосов
/ 27 января 2012

Ключевые слова могут раскрываться только в одну строку, поэтому вы не можете получить CVS-подобное поведение, когда сообщения журнала продолжают накапливать . Это задокументировано в hg help keyword после включения расширения.

Сообщения коммита доступны с ключевым словом шаблона {desc} в Mercurial, поэтому вы можете добавить

[keywordmaps]
Log = {desc}

[keyword]
**.c =

для расширенной строки $Log$ во всех .c файлах.

Обратите внимание, что расширение ключевого слова дает CVS-подобный взгляд на мир в том, как он работает для каждого файла. Mercurial обычно работает на основе хранилища. Если вы делаете

$ hg commit -m "Fixed bug 123" foo.c    # create changeset 10:84e0d0dc9ce5
$ hg commit -m "Fixed bug 234" bar.c    # create changeset 11:2e85d7f2f93e

тогда верно, что foo.c последний раз был изменен в 10-й ревизии, но нельзя сказать, что ревизия 11 содержит только bar.c. Файл foo.c также является частью ревизии 11 - вполне вероятно, что изменение на bar.c зависит от предыдущего изменения на foo.c, и поэтому снимок в ревизии 11 фиксирует состояние обоих foo.c и bar.c.

Расширение для ключевых слов работает по каждому файлу при расширении ключевых слов: оно будет записывать $Log: Fixed bug 123 $ в foo.c и $Log: Fixed bug 234 $ в bar.c при каждом обновлении до набора изменений 2e85d7f2f93e.

Если вы хотите увидеть, почему и когда каждый файл был последний раз затронут, тогда это будет делать то, что вы хотите. Если вы хотите знать глобальное состояние вашего хранилища - например, использовать его как строку версии! - тогда это неправильно. Проблема в том, что ваш файл version.h не изменится в течение длительного периода времени, когда вы разрабатываете, и поэтому ключевые слова в этом файле также останутся неизменными.

В этом случае вы должны просто запустить hg id как часть вашего Makefile. Вы можете сделать это более причудливым с чем-то вроде:

$ hg parents --template '{latesttag}+{latesttagdistance}-{node|short}\n'

, которая выведет строку типа 2.1+117-eed1e5bba9a8. Это означает, что ваша текущая версия (eed1e5bba9a8) составляет 117 коммитов после последнего тега (2.1). Это позволяет пользователям легко сравнивать сборки, сделанные из одного и того же центрального репозитория, и вы все равно можете однозначно воспроизвести сборку, если вам нужно.

...