¿Cómo funciona la bisectria de mercurial cuando el range incluye ramificación?

Si el range de bisección incluye múltiples twigs, ¿cómo funciona la búsqueda de hg bisect? ¿Biseca efectivamente cada sub-twig (yo pensaría que sería ineficiente)?

Por ejemplo, tomando prestado, con gratitud, un diagtwig de una respuesta a esta pregunta relacionada , ¿qué pasaría si la bisecada llegase primero al set de cambios 7 de la twig "buena" del lado derecho?

@ 12:8ae1fff407c8:bad6 | o 11:27edd4ba0a78:bad5 | o 10:312ba3d6eb29:bad4 |\ | o 9:68ae20ea0c02:good33 | | | o 8:916e977fa594:good32 | | | o 7:b9d00094223f:good31 | | o | 6:a7cab1800465:bad3 | | o | 5:a84e45045a29:bad2 | | o | 4:d0a381a67072:bad1 | | o | 3:54349a6276cc:good4 |/ o 2:4588e394e325:good3 | o 1:de79725cb39a:good2 | o 0:2641cc78ce7a:good1 

¿Entonces se verá solo entre 7 y 12, perdiendo el primer mal verdadero que nos importa? (utilizando así el order numérico "tonto") o es lo suficientemente inteligente como para usar la topografía completa y saber que el primer mal podría estar debajo de 7 en la twig del lado derecho, o podría estar en cualquier lugar de la twig del lado izquierdo.

El propósito de mi pregunta es (a) entender mejor el algorithm, y (b) comprender si puedo extender liberalmente mi range de bisección inicial sin pensar mucho sobre a qué twig me dirijo. He estado en situaciones de bisección con grandes ramificaciones, donde me pedía después de cada testing que se extendiera más allá de la siguiente combinación, de modo que todo el procedimiento era esencialmente O (n). Me pregunto si puedo lanzar el primer marcador "bueno" más allá de un nido de fusiones sin pensarlo demasiado, y si eso ahorraría time y daría resultados correctos.

Para citar de Mercurial: La guía definitiva :

El command hg bisect es consciente de la naturaleza "ramificada" del historial de revisión de un proyecto de Mercurial, por lo que no tiene problemas para tratar con twigs, fusiones o encabezados múltiples en un repository. Puede podar twigs completas de la historia con una sola sonda, que es la forma en que funciona de manera tan eficiente.


El código que hace el trabajo está en hbisect.py y realmente mira los treees descendentes y antepasados ​​de cada nodo donde se ha determinado el estado.

Me parece que el set de cambios elegido para evaluar se elige ponderando "qué tan central" es en el gráfico de los que aún no se han probado (es decir, biseccionar por ancestros vs. no ancestros, en lugar de por cronología):

 108 x = len(a) # number of ancestors 109 y = tot - x # number of non-ancestors 110 value = min(x, y) # how good is this test?