2009-11-05 18 views
11

Me pregunto si hay una extensión/comando mercurial que simplemente comprueba si un conjunto de cambios determinado está en una rama. El comando sería algo así como:mercurial: prueba si una rama contiene un conjunto de cambios

hg contains [-r branch] changeset_id 

y debe comprobar si el conjunto de cambios es dada en la rama actual/dado, devolviendo simplemente "Sí" o "No".

Conozco el comando "debugancestor", pero una respuesta "Sí/No" es mucho más fácil de leer.

Y si hay, ¿es posible verificar también los conjuntos de cambios trasplantados?

EDITAR: El escenario se encuentra en un repositorio donde las ramas con nombre tienen varias cabezas. Digamos que una rama se llama "dev-X", tiene más de 1 cabeza y una historia más larga, al menos demasiado tiempo como para rastrearla con varias visualizaciones de gráficos. Quiero saber si un conjunto de cambios X en la rama "dev-X" se fusionó con otro encabezado de "dev-X". Por lo tanto, no puedo usar nombres de ramas, sino solo números de cambios/hash para especificar una rama.

Y para colmo, estoy tratando de averiguar si el cambio X se trasplantó allí, posiblemente tomando más de 1 paso de trasplante. Sé que la información necesaria está almacenada en mercurial (la he visto al manipular las partes internas de mercurial), simplemente no es accesible a través de la interfaz de línea de comando.

+0

Bueno, lo di disparó y esto es lo que salió: http://bitbucket.org/resi/hg-contiene /. djc tenía razón, realmente no era demasiado difícil (al menos, este código funciona con mis repositorios). – resi

Respuesta

5

Como se menciona en el comentario anterior me decidí probarlo, esto es lo que salió:

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

+0

Nice. Mencione esto en la lista mercurial y agréguelo a las extensiones en la wiki de Mercurial. – quark

+0

incluso si es mi propia respuesta, esto funciona mejor para mí. – resi

2

Debería ser muy fácil transformar los resultados de debugancestor en un sí o un no (pero definitivamente no hay una manera incorporada de hacerlo, ¡escriba un guión ya!). Sin embargo, tenga en cuenta que la respuesta podría ser incorrecta si la rama tiene más de un ramal.

(Escrito una extensión para añadir un comando para hacer esto también debe ser casi trivial, por cierto.)

15

¿Qué tal esto:

hg log -r changeset_id -b branchname 

que le dará alguna salida si changeid_id incluye cambios en rama branchname, de lo contrario, no se devuelve ninguna salida.

Se podría envolverlo en una función fiesta si quieres:

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

que hace esto:

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

+1 para una solución completa –

+0

Esa es una muy buena solución para repositorios cuerdo. Sin embargo, no funciona en mi caso, donde hay varias cabezas para las ramas más nombradas. Pensando en eso, debería haberlo mencionado en la pregunta ... – resi

+0

Resi, creo que todavía funciona siempre que uses ramas con nombre (que aún pueden tener varias cabezas). Cada conjunto de cambios tiene una y solo una rama con nombre asociado - "predeterminado" si nunca ha escrito 'hg branches'. Ese código simplemente comprueba si el cset en cuestión tiene el nombre especificado como su campo 'rama'. Ignoraba las cabezas (y la punta) por completo y funciona con múltiples cabezas por rama con nombre. Sin embargo, si no utiliza ramas con nombre (y yo no), entonces es completamente inútil porque cada conjunto de cambios tiene 'valor predeterminado' en la propiedad de sucursal. –

0

siempre se puede simplemente imprimir el nombre de la rama de esa revisión (que Estará vacío si es el predeterminado) y luego pruebe eso con lo que quiera (en bash o en un lenguaje de scripting de algún tipo):

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

usando 1.6 y más tarde con el poder de revisión establece todo lo que necesita es

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

por ejemplo

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

blanco significa que no, medios de salida sí, es en su historia. Algunas de las otras soluciones publicadas aquí no funcionarán si el conjunto de cambios se creó en una rama con nombre, incluso si se fusionó en algún momento posterior.

+3

Bastante seguro que el 'y la revisión' deberían estar * fuera * de la llamada' ancestros': 'antepasados ​​(.)' Creará un conjunto de todos los antecesores de la revisión actual, y 'y' devuelve la intersección de 2 cambios. '. y 1234' será un conjunto vacío a menos que '.' * sea *' 1234', por lo que 'antepasados ​​(.y 1234)' será el conjunto vacío a menos que '.' sea' 1234'. Por otro lado, 'ancestros (.) y 1234' darán la intersección de 'ancestros (.)' y 'conjunto (1234)', que es o bien '1234' si' 1234' es un antecesor de '.' o un conjunto vacío si no lo es. – xmo

+1

También vea [esta respuesta] (http://stackoverflow.com/a/9349431/1127485) (que está utilizando 'descendientes()' en lugar de 'ancestros()', pero eso no debería hacer una diferencia aquí). – sschuberth

0

He probado la mayoría de los enfoques anteriores, no funcionó. La extensión 'contiene' de alguna manera toma la revisión mal (creo que es un error), "antepasados ​​y 1234 (.)" El registro de Hg --rev trabajo, pero me encontré con enfoque aún más simple de hacer esto:

hg merge -P <changeset>

le mostrará si permanece sin combinar cualquier cosa (que también incluirá conjuntos de cambios que no se fusionan padres del conjunto de cambios que se trate)

Cuestiones relacionadas