2017-12-18 19 views
1

Wir verwenden Mercurial für die Quellcodeverwaltung und möchten automatisches Zusammenführen und Changelog für unseren QA-Prozess einführen. Für die Zwecke dieser Diskussion nehmen wir an, nur, dass wir ein einfaches 3-Zweigströmungs wie unten verwenden:Erstellen von Seriendruckprotokollen mit mercurial

\ = forward merge 
| = back merge of fix 

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

Die Frage ist also: Ist es möglich, eine revset Abfrage, die, bei merge N zu konstruieren , vorzugsweise vor, aber ansonsten nach der tatsächlichen Ausführung, führt zu einem Protokoll aller Commits in der Standard-Verzweigung, die noch nicht in der QA-Verzweigung sind (in der obigen Zeichnung, die A und B wäre).

Alternative Formulierung: Ist es möglich, eine Revset-Abfrage zu erstellen, die alle Changesets zurückgibt, die zusammengeführt werden würden, wenn wir Default in QA zusammenführen würden.

Ich bin nur in Commits auf Standard-Zweig interessiert, nicht einzelne Commits in Feature-Zweige bereits in Default (Feature Zweige in der Zeichnung nicht enthalten) zusammengeführt. Ich bin auch nicht an Commits in der QA-Branche interessiert.

Das Repository ist ziemlich gut gepflegt, aber ein paar Jahre alt und enthält etwa 13000 Knoten.

Ich habe mit Vorfahren und Vorfahren experimentiert, aber entweder bekomme ich X als den letzten gemeinsamen Vorfahren oder einen sehr sehr alten Knoten. Ich verstehe die Logik der X bekommen, aber ich bin wirklich nach O.

Das meiste Glück hatte ich habe, ist mit Variationen dieses:

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'))" 

aktualisieren

Mit „hg fusionieren --preview --rev XYZ“, wie Tom vorgeschlagen, erzeugt eine Ausgabe wie folgt aus:

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 

nicht schlecht, aber auch nicht super Spaß. Zumindest benötigt es mehr Logik als einfach grep/sls zu parsen.

Vielen Dank im Voraus, John

+0

Wird Vorschau nicht zusammengeführt geben Sie, was Sie wollen? z.B. hg Aktualisierung -b QA; hg merge-P -r REV – Tom

+0

Die Zusammenführungsvorschau gibt jedes einzelne Commit für alle Feature-Zweige sowie die Zusammenführungs-Commits dieser Feature-Zweige zurück. Es hat auch keine Option --template, also müsste ich die Ausgabe so analysieren, wie sie ist. Dein Kommentar hat mich dazu gebracht, merge prview, das ich schon früh bei meiner Suche aufgegeben hatte, zu überdenken, weil ich überzeugt war, dass ich es mit hg log besser machen könnte. Jetzt denke ich, dass das Parsing des Vorschauprotokolls, um den ersten Knoten in der Standardverzweigung zu finden und dann das darauf basierende hg-Protokoll zu verwenden, funktionieren könnte. – JJJ

+0

einfach grep: hg merge-P -r REV | grep --before-context 1 'Zweig:. * Default' | grep changeset – Tom

Antwort

1

fand ich eine Lösung, die vor allem das tut, was ich will:

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

Die jetzt fehlt nur noch mehrere Kopf übergeht auszuschließen, da sie nur Lärm sind in einem Änderungsprotokoll.