2009-11-05 7 views
11

Ich frage mich, ob es einen mercurial-Befehl/eine Erweiterung gibt, die nur testet, ob eine gegebene Änderungsmenge in einer Verzweigung ist. Der Befehl wäre so etwas wie:mercurial: Test, ob eine Verzweigung einen Changeset enthält

hg contains [-r branch] changeset_id 

und soll überprüfen, ob die gegebene changeset im aktuellen/Verzweigung sie, Rückkehr nur „Ja“ oder „Nein“.

Ich weiß über den "debugancestor" Befehl, aber eine "Ja/Nein" Antwort ist viel einfacher zu lesen.

Und wenn ja, ist es möglich, auch nach transplantierten Changesets zu suchen?

EDIT: Das Szenario befindet sich in einem Repo, wo benannte Zweige mehrere Köpfe haben. Nehmen wir an, eine Verzweigung hat den Namen "dev-X" und hat mehr als einen Kopf und eine längere Historie, zu lang, um sie mit verschiedenen Grafikvisualisierungen zu verfolgen. Ich möchte herausfinden, ob ein Changeset X in Zweig "dev-X" in einen anderen Kopf von "dev-X" zusammengeführt wurde. Daher kann ich keine Verzweigungsnamen verwenden, sondern nur Änderungsnummern/Hashes, um eine Verzweigung festzulegen.

Und zu allem Überfluss versuche ich herauszufinden, ob changeset X dort transplantiert wurde, möglicherweise mehr als 1 Transplantationsschritt. Ich weiß, dass die notwendigen Informationen in mercurial gespeichert sind (ich habe es bei der Manipulation der mercurialen Interna gesehen), es ist einfach nicht über die Befehlszeilenschnittstelle zugänglich.

+0

Nun, ich habe es geschossen und das ist, was herauskam: http://bitbucket.org/resi/hg-contains /. djc hatte recht, es war wirklich nicht zu schwer (zumindest funktioniert dieser Code mit meinen Repos). – resi

Antwort

5

Wie im Kommentar oben genannten ich ihm einen Schuß gegeben hat, ist es das, was herauskam:

http://bitbucket.org/resi/hg-contains/

+0

Schön. Erwähnen Sie dies in der Merkurliste und fügen Sie es den Erweiterungen im Mercurial-Wiki hinzu. – quark

+0

Auch wenn es meine eigene Antwort ist, funktioniert das am besten für mich. – resi

2

Es sollte ziemlich einfach sein, die Ergebnisse von debugancestor in ein Ja oder Nein umzuwandeln (aber es gibt definitiv keine eingebaute Möglichkeit das zu tun; schreibe ein Skript schon!). Beachten Sie, dass die Antwort möglicherweise falsch ist, wenn der Zweig mehr als einen Zweig hat.

(Schreiben eine Verlängerung um einen Befehl hinzuzufügen dies auch fast trivial, BTW tun sollte.)

15

Wie wäre es damit:

hg log -r changeset_id -b branchname 

, dass einige Ausgang geben, wenn changeid_id auf Änderungen enthält Verzweigung branchname, sonst wird keine Ausgabe zurückgegeben.

Man konnte es in einer Bash-Funktion wickeln, wenn Sie wollen:

function contains() { 
    if [ "$(hg log -r $1 -b $2)" == "" ] 
    then 
     echo no 
    else 
     echo yes 
    fi 
} 

, die tut dies:

$ contains 0 default 
yes 
$ contains 0 other 
no 
+0

+1 für eine vollständige Lösung –

+0

Das ist eine sehr gute Lösung für gesunde Repos. Es funktioniert jedoch nicht in meinem Fall, wo es mehrere Köpfe für die am meisten genannten Zweige gibt. Wenn ich darüber nachdenke, hätte ich das in der Frage erwähnen sollen ... – resi

+0

Resi, ich denke, es funktioniert immer noch so lange, wie Sie benannte Zweige verwenden (die immer noch mehrere Köpfe haben können). Jedem Changeset ist nur ein einziger Zweig zugeordnet - "default", wenn Sie "hg branches" noch nicht eingegeben haben. Dieser Code prüft nur, ob das in Frage stehende cset den angegebenen Namen als sein "Zweig" -Feld hat. Es ignoriert Kopf (und Tipp) vollständig und funktioniert mit mehreren Köpfen pro benanntem Zweig. Wenn Sie jedoch keine benannten Zweige verwenden (und ich nicht), dann ist das völlig nutzlos, da jedes Changeset in seiner Verzweigungseigenschaft "default" hat. –

0

Sie können immer für auszudrucken nur den Namen der Branche dieser Revision (it wird leer sein, wenn es Standard ist) und dann testen, was Sie wollen (in bash oder in einer Skriptsprache irgendeiner Art):

hg log --template '{branches}' -r <revision name/number> 
12

1 verwendet wird.6 und später mit der Kraft der Revision setzt alles, was Sie brauchen, sind

hg log --rev "ancestors(.) and <revNum>" 

zB

hg log --rev "ancestors(.) and 1234" 

leeren Mittel nein, Ausgabemittel ja, sein in Ihrer Geschichte. Einige der anderen hier aufgeführten Lösungen funktionieren nicht, wenn das Changeset in einem benannten Zweig erstellt wurde, auch wenn es zu einem späteren Zeitpunkt zusammengeführt wurde.

+3

Ziemlich sicher, dass die 'und Revision' * außerhalb * der 'Vorfahren' Aufruf sein sollte:' Vorfahren (.) 'Wird eine Reihe aller Vorfahren der aktuellen Revision erstellen, und' und 'gibt die Schnittmenge von 2 revsets zurück. '. und 1234 wird eine leere Menge sein, es sei denn, "." ist 1234, also sind "Vorfahren" (und 1234) die leere Menge, es sei denn, "." ist "1234". Auf der anderen Seite, Vorfahren (.) und 1234 'geben den Schnittpunkt von' Vorfahren (.) 'und 'Satz (1234)', was entweder' 1234 'ist, wenn' 1234 'ein Vorfahre von '.' ist, oder eine leere Menge, wenn dies nicht der Fall ist. – xmo

+1

Siehe auch [diese Antwort] (http://stackoverflow.com/a/9349431/1127485) (die 'Nachkommen()' anstelle von 'Vorfahren()' verwendet, aber das sollte hier keinen Unterschied machen). – sschuberth

0

Ich habe die meisten Ansätze oben getestet, hat nicht funktioniert. Die Erweiterung ‚enthält‘ irgendwie falsch Revision nimmt (ich glaube, es ist ein Fehler), die „Vorfahren und 1234 (.)“ --rev hg log Arbeit, aber ich fand noch einfacher Ansatz, dies zu tun:

hg merge -P <changeset>

werden Sie zeigen, wenn etwas unmerged bleibt (es auch Changesets umfassen wird, die Eltern der changeset in Frage nicht verschmolzen sind)

Verwandte Themen