2010-05-10 1 views
8

Ich habe vor kurzem mit der Verwendung von mercurial für die Versionskontrolle in einem Java-Projekt. Wenn ich mein Programm starte, werden die Eingabeparameter, die es verwendet hat, um bestimmte Ausgaben zu erzeugen, in eine bestimmte Datei geschrieben. Es wäre schön, wenn ich auch die aktuelle Merkur-Änderungsnummer (die die Version meines Programms angibt) zu dieser Ausgabedatei hinzufügen könnte.Java: wie man mercurial aktuelle changeset Nummer für die Verwendung in Programm

Was wäre der einfachste Weg, dies unter Windows zu tun? Ich könnte einen einfachen Java-Parser schreiben, um die Ausgabe der ersten Zeile des Befehls hg log -l 1 zu holen, aber vielleicht gibt es einen einfacheren Weg (d. H. Weniger Codezeilen)?

Antwort

10

Sie können lieber hg identify verwenden.

hg id sollte während des Verpackungsschritts sein, wenn die Quellen festgeschrieben wurden und Sie die gepackte (JAR) Version Ihrer Anwendung generieren.
Während dieses Schritts können Sie eine version.txt-Datei mit dieser Art von Informationen generieren.

$ MY_VERSION=$(hg id) 
$ echo $MY_VERSION 
53efa13dec6f+ tip 

(siehe zum Beispiel "build identification" for Python)

+2

Das Pluszeichen Hinter bedeutet VonC lokale, unbestätigte Änderungen hat, was schön sein kann, zu beachten. –

+0

Apropos, wie kommt diese Migration voran? – Santa

+0

du meinst hg identifizieren; und ein Nachteil ist, dass es die kurze menschlich lesbare Hash zeigt, anstatt die volle 40 Zeichen sha1 –

2

Hier ist der Blick auf den Mercurial Entwickler: Keyword Substitution - Why You Don't Need It

+0

Hmm, ich verstehe nicht den Punkt. Was ist mit Keyword-Erweiterung gemeint? Das einzige, was ich mir vorstellen kann, ist z.B. dass Sie "hg id" anstelle von "hg identity" schreiben können, aber dieses Konzept scheint hier nicht zu gelten. – Rabarberski

+3

Mit anderen VCS können Sie spezielle Schlüsselwörter hinzufügen, z. B. $ Id $, $ Rev $, $ Author $, die beim Auschecken der Datei erweitert werden. So konnten Sie Dinge wie const char * version = "$ Rev $" schreiben; Das würde etwas wie const char * version = "$ Rev: 1.2 $" werden, wenn die Datei ausgecheckt wurde. –

7

Da Sie in einem Java-Projekt sind, dies für Sie relevant sein könnte. Ich verwende dieses Ant-Ziel, um die Versionsinformationen (Mercurial Changeset-ID) in der Anwendungsliste auf der Tomcat Manager-Seite anzuzeigen. Ich setzte einfach die Changeset-ID innerhalb der Anzeigename XML-Element in meiner web.xml.

<target name="build.release"> 
    <exec executable="/usr/local/bin/hg" outputproperty="scm.version.tag.id"> 
     <arg value="id"/> 
     <arg value="-i"/> 
    </exec> 
    <filter token="build.version.tag" value="${scm.version.tag.id}" /> 
    <copy file="${web.home}/WEB-INF/web.xml" todir="${build.home}" filtering="true" /> 
</target> 

Innerhalb der web.xml, gibt es ein Token in der display-name XML-Element, wie folgt aus:

<display-name>My Webapp @[email protected]</display-name> 
2

Mercurial hat eine Erweiterung für Keyword-Erweiterung. Anweisungen und Warnungen finden Sie unter KeywordExtension.

+0

Das ist ziemlich nett. Ich nehme an, dass jede Datei Informationen aus dem letzten Commit erhält, das die einzelne Datei tatsächlich geändert hat?(Und ja, ich * DO * brauche eine Erweiterung des Schlüsselwortes, wenn ich verfolgen möchte, was andere Leute versehentlich tun (Änderungen außerhalb der Versionskontrolle beiseite, leider) Nur wenn Ihr Freigabesystem tatsächlich korrekt befolgt wird, bedarf es zusätzlich Informationen wie Keywords gehen weg – Roboprog

+0

Dies ist als "Feature of Last Resort" zugeordnet und sollte eher nicht verwendet werden – RS1980

2

hg zweig | xargs hg log -l1 --vorlage {rev} -b

Dies gibt Ihnen die Revisionsnummer für den aktuellen Zweig, in dem Sie arbeiten - sehr wichtig für Builds aus verschiedenen Branchen.

In einer Ameise Datei das ist, was Sie brauchen ...

<exec dir="${basedir}" 
     executable="/usr/local/bin/hg" 
     outputproperty="branch"> 

      <arg value="branch"/> 
    </exec> 

    <exec dir="${basedir}" 
      executable="/usr/local/bin/hg" 
      outputproperty="version"> 

      <arg value="log"/> 
      <arg line="-l1 --template {rev} -b${branch}" /> 
    </exec> 
Verwandte Themen