Создание журналов слияния с Mercurial

Мы используем Mercurial для контроля исходного кода и хотели бы ввести автоматическое слияние и журнал изменений для нашего процесса обеспечения качества. Для целей этого обсуждения давайте просто предположим, что мы используем простой поток из 3 веток, подобный приведенному ниже:

\ = forward merge
| = back merge of fix

Default --O--A--*--B--*---
           \    ^      \
            \   |       \
QA      -----M--X--C--*--N---
                ^      \ 
                |       \
Master  --------H--------*---  

Поэтому возникает вопрос: возможно ли построить запрос revset, который при слиянии N, предпочтительно до, но в противном случае после фактического его выполнения, приведет к записи журнала всех коммитов в ветви Default, которые еще не находятся в ветви QA (On рисунок выше, который будет А и В).

Альтернативная формулировка: возможно ли построить запрос revset, который будет возвращать все наборы изменений, которые будут объединены, если мы объединим Default в QA.

Меня интересуют только коммиты в ветке Default, а не отдельные коммиты в ветвях объектов, уже объединенных в Default (ветки объектов не включены в чертеж). Я также не заинтересован в коммитах на ветке QA.

Хранилище довольно хорошо поддерживается, но пару лет тому назад и содержит около 13000 узлов.

Я экспериментировал с предком и предками, но либо я получаю X в качестве последнего общего предка, либо какой-то очень очень старый узел. Я понимаю логику получения X, но я действительно после O.

Больше всего мне повезло с вариациями этого:

hg log --rev "((heads(branch('Default')) and !closed()) % heads(branch('QA'))) and branch('Default') and p2(!branch('QA'))"
hg log --rev "((heads(branch('Default')) and !closed()) % heads(branch('QA'))) and branch('Default') and !children(branch('QA'))"

Обновить

Использование "hg merge --preview --rev XYZ", как предполагает Том, генерирует вывод примерно так:

changeset:   13070:7e59fc16aa4e
branch:      Default
parent:      13068:5b9409ad504f
parent:      13069:849bd43d2023
user:        *******
date:        Mon Dec 18 18:40:46 2017 +0200
summary:     Merged Feature branch A

changeset:   13071:07470ff919ff
branch:      Feature branch B
parent:      13061:540eda2c959b
parent:      13068:5b9409ad504f
user:        *****
date:        Mon Dec 18 18:49:42 2017 +0200
summary:     Merge with Default

changeset:   13072:a53260ffabca
branch:      Feature branch B
user:        *****
date:        Mon Dec 18 18:58:05 2017 +0200
summary:     Some text

changeset:   13073:37c895f2abf0
branch:      Default
parent:      13070:7e59fc16aa4e
parent:      13072:a53260ffabca
user:        *******
date:        Mon Dec 18 18:58:05 2017 +0200
summary:     Merged Feature branch B

Не так уж плохо, но не супер весело тоже. По крайней мере, для анализа требуется больше логики, чем для простых grep/sls.

Заранее спасибо Джон

1 ответ

Решение

Я нашел решение, которое в основном делает то, что я хочу:

hg log --rev "branch('Default') & !ancestors(branch('QA')) & ancestors(heads(branch('Default')) & !closed()) & !children(branch('QA'))"

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

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