2011-04-05 9 views
6

Necesito usar la extensión de palabra clave hg para incrustar la fecha de compilación y la revisión en un archivo fuente. Dejando de lado todo el argumento de "realmente no quieres estar haciendo eso", ¿cómo puedo hacer esto?Extensión Mercurial de palabras clave para expandir en cada confirmación

Esto es lo que mi archivo fuente (lib/foo/version.rb) parece (que pasa a ser Ruby, pero eso solo es relevante desde el punto de vista que no tengo un paso de "compilación" en mi compilación que podría hacer DREVISION = "$ (ID HG)" in):

module Foo 
    VERSION = { 
    :date => "$Date$", 
    :changeset => "$Revision$" 
    } 
end 

el problema es que $ Revision $ y $ fecha $ se expanden con el conjunto de cambios y la fecha de ese archivo se comprometen, mientras que lo que necesito es el tip changeset y commit date de todo el repositorio.

No veo una plantilla obvia que pueda usar en hg help templates, ni la extensión de palabra clave menciona nada con alcance global. ¿Es lo que estoy tratando de hacer posible?

+1

entiendo que quiere dejar a un lado el "no querer hacerlo" parte, pero para cualquier otra persona que lee esto: la página de la extensión de palabras clave hace un gran trabajo de explicar por qué esta es probablemente una mala idea. En resumen: con un DVCS, todos los archivos en el proceso de compra son de la misma revisión, por lo que simplemente verificar el resultado de 'hg parents' o el contenido de' .hg_archive.txt' es casi siempre un mejor plan. Teniendo todos sus archivos modificados todo el tiempo, los tornillos con 'hg status' y el uso de DVCS en general. –

Respuesta

3

Puede instalar un gancho post-commit que actualiza el archivo:

[hooks] 
post-commit = sed -i lib/foo/version.rb \ 
    -e "s|\$Date.*\$|\$Date: $(date)\$|" \ 
    -e "s|\$Version.*\$|\$Version: $(hg id -i)\$|" 

A continuación, debería probablemente agregar el archivo de versión en el fichero de .hgignore - que va a cambiar después de cada confirmación y así siempre estar sucio. También puede añadir un filtro de codificación que se va a limpiar el archivo de la versión:

[encode] 
lib/foo/version.rb = sed -e "s|\$Date.*\$|\$Date\$|" \ 
          -e "s|\$Version.*\$|\$Version\$|" 

Este script hará Mercurial ver el archivo como limpia - no importa qué fecha y de cambios ha realmente contiene, Mercurial verlo como que contienen no expandido $Date$ y $Version$ palabras clave:

 
$ hg commit -m test 
$ hg tip 
changeset: 7:df81c9ddc9ad 
tag:   tip 
user:  Martin Geisler 
date:  Wed Apr 06 14:39:26 2011 +0200 
summary:  test 

$ hg status 
$ hg cat version.py 
date = "$Date$" 
version = "$Version$" 
$ cat version.py 
date = "$Date: Wed Apr 6 14:39:26 CEST 2011$" 
version = "$Version: df81c9ddc9ad$" 
+0

Ok, voy a intentarlo. Parece una versión mucho más simple de lo que hace la extensión de palabras clave bajo el capó, solo por repositorio en lugar de por archivo. – regularfry

+0

Una gran solución, pero ¿hay alguna manera de lograr esto en una caja de Windows también, sin tener que instalar libs adicionales? –

+0

@Jon: no hay una forma incorporada, pero podría escribir una pequeña extensión de Python para que Mercurial lo haga. –

0

Si está ejecutando su código desde un proceso de pago, puede invocar hg directamente y almacenar en caché el valor. Algo así como:

module Foo 
    VERSION = { 
    :version => system("hg log --template '{note|short}-{latesttag}-{latesttagdistance}' -r .") 
    } 
end 

y si no se está ejecutando el código desde el interior de una extracción en un sistema con instala Mercurial, a continuación, la secuencia de comandos de despliegue puede conseguir fácilmente/utilizar el valor - tal vez mediante el uso de hg archive para obtener el tarball para enviar que luego incluye automáticamente un .hg_archive.txt.

Te garantizo que hay una manera más bonita de hacer esto que la extensión de palabras clave sin importar cuál sea tu configuración.

+0

Sí, eso no va a funcionar para mí. Ni siquiera sé que tendré lib/foo/version.rb como un archivo distinto cuando ocurre la implementación (que no tengo control), y mucho menos que me ejecutaré desde un repositorio. Creo que post-commit podría ser la única forma de obtener lo que busco. – regularfry

Cuestiones relacionadas