2011-03-01 15 views
6

Estamos tratando de ejecutar un trabajo crónico que convierta automáticamente módulos separados de CVS en módulos mercuriales y, finalmente, consolide esos módulos mercuriales convertidos en un único repositorio mercurial.De todos modos para combinar automáticamente o concatenar hgtags (Mercurial)?

He estado tratando de encontrar maneras de fusionar automáticamente .hgtags (desde los repos hg convertidos) sin tener que solicitar una ventana de usuario (por lo tanto, el uso en un trabajo cron).

¿Hay alguna forma de saber mercurial cuando usa hg merge para tomar el archivo local y anexarlo al archivo entrante?

gracias por cualquier información o cualquier sugerencia

+1

Solo por curiosidad, ¿por qué quieres convertir los repos de CVS con un trabajo de cron? –

+0

@Oben: conversión incremental. Estoy haciendo lo mismo desde SVN-> Hg (sin la combinación de repo.) –

Respuesta

2

La pronta ventana sólo ocurrirá si usted tiene un conflicto en su archivo .hgtags, que debe ser bastante raro. Sin embargo, aquí hay una idea que funcionará.

Mercurial le permite usar una herramienta de combinación diferente a la interna, para obtener más información, vea MergeToolConfiguration. También puede cambiar mergetool a través de la línea de comando con la opción --tool (consulte hg merge --help).

Tal vez puedas escribir un pequeño programa para que sirva como una herramienta de combinación especial para .hgtags que hacen exactamente lo que quieres, es decir, anexar el archivo local al archivo entrante. A continuación, puede modificar su hgrc para usar esta nueva herramienta al fusionar .hgtags.

Nunca probé esta solución, es solo una idea, pero tal vez te ayude.

8

Sí, puede configurar un merge tool como describe Krtek. Yo sólo lo probé y funciona esto:

[merge-tools] 
merge-tags.executable = cat 
merge-tags.args = $local $other | sort -u >> $output 

[merge-patterns] 
.hgtags = merge-tags 

poner esto en su archivo en el servidor .hg/hgrc y futuras fusiones se acaba de añadir las etiquetas. Lo que pasa es que hg merge ejecutará

cat /tmp/hgtags.local /tmp/hgtags.other | sort -u >> .hgtags 

donde el primer argumento de cat es la versión local del archivo .hgtags, y el segundo argumento es la versión que está combinando con.

Ordeno y hago único el resultado para evitar la duplicación de líneas que son comunes en los dos archivos. Siempre que solo agregue etiquetas, esto funcionará bien, pero si también elimina las etiquetas, entonces el orden de las líneas en el archivo .hgtags es importante y, por lo tanto, no puede ordenarlo así. Consulte my extended answer para manejar esta situación.

Esta es mi sesión de prueba.Comienzo por hacer un depósito con dos cabezas:

$ hg init 
$ echo a > a.txt 
$ hg add a.txt 
$ hg commit -m a 
$ echo b > b.txt 
$ hg add b.txt 
$ hg commit -m b 
$ hg tag b 
$ hg update 0 
0 files updated, 0 files merged, 2 files removed, 0 files unresolved 
$ echo c > c.txt 
$ hg add c.txt 
$ hg commit -m c 
created new head   
$ hg tag c 

Las ramas son visibles en la salida de la graphlog extension:

@ changeset: 4:54c5397a23a4 
| tag:   tip 
| user:  Martin Geisler <[email protected]> 
| date:  Wed Mar 02 11:45:20 2011 +0100 
| summary:  Added tag c for changeset aff5fe9be7d9 
| 
o changeset: 3:aff5fe9be7d9 
| tag:   c 
| parent:  0:0db5fae8b6cc 
| user:  Martin Geisler <[email protected]> 
| date:  Wed Mar 02 11:45:17 2011 +0100 
| summary:  c 
| 
| o changeset: 2:a9af8514a64e 
| | user:  Martin Geisler <[email protected]> 
| | date:  Wed Mar 02 11:45:02 2011 +0100 
| | summary:  Added tag b for changeset 0518533f37f6 
| | 
| o changeset: 1:0518533f37f6 
|/ tag:   b 
| user:  Martin Geisler <[email protected]> 
| date:  Wed Mar 02 11:44:44 2011 +0100 
| summary:  b 
| 
o changeset: 0:0db5fae8b6cc 
    user:  Martin Geisler <[email protected]> 
    date:  Wed Mar 02 11:44:33 2011 +0100 
    summary:  a 

Hay un conflicto en el archivo .hgtags:

$ hg cat -r 2 .hgtags 
0518533f37f6f37edbea5b46d9af2192f69ddecd b 
$ hg cat -r 4 .hgtags 
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c 

pero la combinación sigue siendo no interactiva:

$ hg merge 
merging .hgtags 
1 files updated, 1 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

Se puede ver cómo se adjuntaron los archivos:

$ cat .hgtags 
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c 
0518533f37f6f37edbea5b46d9af2192f69ddecd b 
+0

Gracias, parece que esta es probablemente la solución – DavidW

+2

¿Cómo se puede hacer esto en Windows? –

+0

@NickHodges Escribí un exe básico de C# que se puede utilizar como una alternativa para cat en Windows: https://bitbucket.org/janverley/hgtagsmerger/ – jan

1

Aquí hay una herramienta de combinación simple en Python. También intenta mantener el orden existente de líneas en el archivo .hgtags.

Se aplican las mismas advertencias que en la respuesta de Martin.

import sys 
from heapq import merge 

local = sys.argv[1] 
other = sys.argv[2] 
output = sys.argv[3] 

merged_tags = merge(file(local).readlines(), file(other).readlines()) 

unique_tags = [] 
for tag in merged_tags: 
    if tag not in unique_tags: 
     unique_tags.append(tag) 

file(output, 'w').writelines(unique_tags) 
3

sort -mu me dieron lo que quiero. Este comando no ordena, pero elimina los duplicados.

sort -u orden de tiempo de ruptura.

0

La sugerencia en https://stackoverflow.com/a/9783478/1183010:

hgtags.merge.template: conjunto de cambios = "{tags}" tag = "{nodo} {tag} \ n"

[Merge-tools] hgtags .executable = hg hgtags.args = log -r "etiquetado()" --style hgtags.merge.template> $ hgtags.premerge salida = Falso

[Merge-patrones] .hgtags = hgtags

funciona para nosotros.

Cuestiones relacionadas