Mercurial: определить последний тег на каждой объединенной ветви

Чтобы определить, какие теги были объединены в данную ревизию, я использую такую ​​команду:

$ hg log --style=xml -r "ancestors(471694254d60) and tag()" | grep "<tag>"
<tag>3.27.0.0</tag>
<tag>3.27.0.1</tag>
<tag>3.27.0.2</tag>
<tag>3.27.0.3</tag>
<tag>3.27.0.4</tag>
<tag>3.27.0.5</tag>
<tag>3.28.0.0</tag>
<tag>3.27.0.6</tag>
<tag>3.28.0.1</tag>
<tag>3.28.0.2</tag>
<tag>3.28.0.3</tag>
<tag>3.29.0.0</tag>
<tag>3.28.0.4</tag>
<tag>3.29.0.1</tag>
<tag>3.29.0.2</tag>
<tag>3.29.0.3</tag>
<tag>3.29.0.4</tag>
<tag>3.29.0.5</tag>
<tag>3.29.0.6</tag>

Это нормально, но я бы хотел улучшить его, сообщая только о последних тегах из каждой ветви:

$ hg log --style=xml -r "ancestors(471694254d60) and tag() and <MYSTERY CLAUSE>" | grep "<tag>"
<tag>3.27.0.6</tag>
<tag>3.28.0.4</tag>
<tag>3.29.0.6</tag>

Надеемся, что подразумеваемая структура ветвей достаточно очевидна.

Кажется ли это возможным (без использования нескольких команд hg или фильтрации результатов по факту)?

1 ответ

Решение

Ну 2 (грязных) решения

Стиль постобработки

Немного изменена исходная команда в качестве отправной точки (использовался другой репозиторий)

>hg log -r "::. & tag()" --template "{branch} {tags}\n"

(короткий синтаксис и шаблоны, статический лист-узел для тестирования). Результат не подходит для постобработки

default 1.0
default 1.0.1
default 1.1
default 1.1.1
default 1.1.2
default 1.2
default 1.2.1
default 1.3
default 1.4
default 1.5
stable 1.5.1
default 1.6
stable 1.6.1

потому что конкретные теги филиала фрагментированы. Сортировка по веткам сохранит внутренний порядок тегов внутри каждой ветки

>hg log -r "sort(::. & tag(), branch)" --template "{branch} {tags}\n"
default 1.0
default 1.0.1
default 1.1
default 1.1.1
default 1.1.2
default 1.2
default 1.2.1
default 1.3
default 1.4
default 1.5
default 1.6
stable 1.5.1
stable 1.6.1

Вывести только последнюю запись для каждой ветви (+ последняя строка в списке) - простая задача на любом языке.

Для того, чтобы конвертировать hg log | <command> слиток в полезное решение, применяются следующие модификации

ltb = hg log -r "sort(::$1 & tag(), branch)" --template "{branch} {tags}\n"

(а также hg ltb 471694254d60 | <command> в скорлупе выдаст результат)

  • Для улучшения и сокращения полная команда может быть дополнительно преобразована в псевдоним оболочки, и ltb становится

ltb = !$HG log -r "sort(::$1 & tag(), branch)" --template "{branch} {tags}\n" | <command>

(используется сейчас как раз hg ltb 471694254d60)

Стиль предварительной обработки

"Последний помеченный набор изменений в ветке" в словаре revset будет (для вашего случая) last(::REV & tag() & branch(BRANCH))повторяется для каждой ветви или

(last(::REV & tag() & branch(BRANCH1))) | (last(::REV & tag() & branch(BRANCH2)) | ... | (last(::REV & tag() & branch(BRANCHN))

в единой гигантской команде. Основная проблема состоит в том, чтобы перечислить все необходимые ветви для команды (команд), потому что у вас нет предопределенного списка.

Вы можете

  • Получить список филиалов (для всего хранилища)

Самый простой способ hg branches

>hg branches
default                     1196:878372849175
stable                      1179:e4b737479302 (inactive)

и вставьте все имена ветвей (первое поле) в журнал вручную (hg log -r "last(::471694254d60 & tag() & branch(default))" > log.txt + hg log -r "last(::471694254d60 & tag() & branch(stable))" >> log.txt для моего репо и твоей ревизии)

  • Получить чистый ветвь-список (hg branch еще раз) и направить его в xargs, который выполняет hg log для одной ветви, что-то вроде (НЕ ПРОВЕРЕНО!)

hg branches | gawk {print $1} | \ xargs -I BRANCH hg log -r "last(::471694254d60 & tag() & branch(BRANCH))" --template "{branch} {tags}\n"

(после отладки также может быть преобразован в псевдоним оболочки)

Другие вопросы по тегам