2010-05-10 13 views
8

Ho recentemente iniziato a utilizzare mercurial per il controllo della versione in un progetto Java. Quando eseguo il mio programma, i parametri di input che ha usato per produrre un certo output, sono scritti su un file specifico. Sarebbe bello se potessi aggiungere il numero attuale del changeset mercurial (indicando la versione del mio programma) anche a quel file di output.Java: come ottenere il numero di changeset attuale mercurial da utilizzare nel programma

Quale sarebbe il modo più semplice per farlo su Windows? Potrei scrivere un semplice parser Java per recuperare l'output della prima riga del comando hg log -l 1, ma forse c'è un modo più semplice (cioè meno righe di codice)?

risposta

10

È possibile utilizzare lo hg identify.

hg id dovrebbe essere durante la fase di confezionamento, quando le origini sono state commesse e si genera la versione pacchettizzata (jar) dell'applicazione.
Durante questo passaggio, è possibile generare un file version.txt con quel tipo di informazioni.

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

(si veda ad esempio "build identification" for Python)

+2

Quella finale segno più significa VonC ha, modifiche non locali, che possono essere bello notare troppo. –

+0

A proposito, come si evolve questa migrazione? – Santa

+0

intendi hg identifica; e un lato negativo è che mostra il breve hash umano leggibile piuttosto che il completo 40 caratteri sha1 –

2

Qui è la vista degli sviluppatori Mercurial: Keyword Substitution - Why You Don't Need It

+0

Hmm, non capisco il punto. Cosa si intende per espansione delle parole chiave? L'unica cosa che posso pensare è ad es. che puoi scrivere 'hg id' invece di 'hg identity', ma quel concetto non sembra applicarsi qui. – Rabarberski

+3

Altri VCS consentono di aggiungere parole chiave speciali come $ Id $, $ Rev $, $ Autore $ che vengono espanse quando il file viene estratto. Questo ti ha permesso di scrivere cose come const char * version = "$ Rev $"; che diventerebbe qualcosa come const char * version = "$ Rev: 1.2 $" quando il file è stato estratto. –

7

Visto che sei in un progetto Java, questo potrebbe essere relativo al sistema. Uso questo obiettivo Ant per visualizzare le informazioni sulla versione (id del changeset Mercurial) nell'elenco delle applicazioni nella pagina di Tomcat Manager. Ho semplicemente inserito l'id del changeset all'interno del nome-display elemento xml nel mio 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> 

All'interno del web.xml, c'è un token nel elemento XML display-name, in questo modo:

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

Mercurial ha un'estensione di espansione parola chiave. Vedi KeywordExtension per istruzioni e avvertenze.

+0

È carino. Suppongo che ogni file ottenga informazioni dal commit più recente che ha effettivamente modificato il singolo file?(e sì, io * DO * ho bisogno dell'espansione delle parole chiave, se voglio tenere traccia di ciò che altre persone stanno facendo inavvertitamente (cambia completamente al di fuori del controllo di revisione, ahimè) .Solo quando il tuo sistema di rilascio viene effettivamente seguito correttamente, la necessità di informazioni come le parole chiave vanno via – Roboprog

+0

Questo è mappato come "funzione di ultima istanza" e non dovrebbe essere usato – RS1980

2

hg ramo | xargs hg log -l1 --template {rev} -b

Questo ti darà il numero di revisione per il ramo corrente in cui stai lavorando - molto importante per le build di rami diversi.

In un file formica questo è quello che ti serve ...

<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> 
Problemi correlati