Создание журналов слияния с 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'))"
Единственное, чего сейчас не хватает, - это исключить множественные слияния головок, поскольку они являются просто шумом в журнале изменений.