Существует ли эквивалент функции git "описать" для Mercurial?

В настоящее время я добавляю упаковку к тому, что поддерживается в Mercurial. В настоящее время версия определена в Makefile. Я хотел бы изменить это, чтобы я мог создавать ежедневные пакеты или файлы с правильной версией.

Git предоставляет функцию "описать", которая может дать вам описание ближайшей помеченной сборки и текущей версии. Например, если я запустил это в ядре:

git describe HEAD

Git возвращает:

v3.0-rc7-68-g51414d4

сообщит мне, что ревизия позже v3.0-rc7, с git commitish из 51414d4

Есть ли что-то подобное в Mercurial?

Ответ 1

Может быть, что-то вроде этого?

hg log -r . --template '{latesttag}-{latesttagdistance}-{node|short}\n'

Конечно, вы должны сделать псевдоним для AliasExtension.

Обратите внимание, однако, в отличие от "git описать", эта команда всегда будет показывать части "lasttagdistance" и "node | short" вместо того, чтобы опускать их, когда максимальное значение 0.

Ответ 2

Это близкая эмуляция git describe:

hg log -r . -T "{latesttag}{sub('^-0-.*', '', '-{latesttagdistance}-m{node|short}')}"

Функция {sub(...)} гарантирует, что рабочая копия точно в теге v0.1.0 будет отображаться как v0.1.0, а не v0.1.0-0-m123456789abc.

Обратите внимание, что m перед хешем для m ercurial, аналогично тому, как git describe использует g для g.

Для удобства создайте псевдоним, добавив следующее к вашему ~/.hgrc:

[alias]
describe = log -r . -T "{latesttag}{sub('^-0-.*', '', '-{latesttagdistance}-m{node|short}')}"

Затем используйте псевдоним, просто набрав hg describe.

Если вы хотите эмулировать git describe --dirty, все становится еще более грязным - но вы все равно можете скрыть все это в псевдониме hg:

[alias]
describe = !
    dirtymark=;
    case " $1 " in " --dirty ") dirtymark=-dirty; ;; esac;
    echo $($HG log -r . --template "{latesttag}-{latesttagdistance}-m")$($HG id -i) |
        sed -r -e "s/\+\$/${dirtymark}/" -e 's/-0-m[[:xdigit:]]+//'

Теперь работающий hg describe --dirty будет создавать строки типа:

  • v0.1.0
  • v0.1.0-dirty
  • v0.1.0-1-mf6caaa650816
  • v0.1.0-1-mf6caaa650816-dirty

Опускание опции --dirty означает, что вы никогда не получите суффикса -dirty типа (2) и (4), даже если рабочая копия содержит незафиксированные изменения.