2010-07-15 4 views
1

J'ai un bug qui est présent dans un changeset mais pas son parent. Y a-t-il des fonctionnalités dans mercurial où je peux "mettre à jour" en plus petits incréments, pour voir où le problème commence? Par exemple, si le diff est un changement dans les fonctions A, B et C, j'exécuterai la suite de tests après avoir effectué chacun de ces changements, pour essayer de diagnostiquer le problème.Hg: Mise à jour sur un niveau ligne par ligne?

+0

Bisect a été abattu en bas que son niveau changeset seulement, mais je vais souligner que beaucoup de petits commits sont préférés à moins, plus engage exactement parce que les choses comme sécable (et fusionne en général) sont plus difficiles avec des changesets plus grands. –

Répondre

0

Vous pouvez utiliser hg diff -r firstrev -r secondrev et filtrer la sortie uniquement sur les bits concernant ces fonctions, puis parcourir les correctifs un par un.

Ou vous pouvez utiliser l'extension bisectée, conçue à cet effet - bien qu'elle vous donne toutes les modifications apportées à votre base de code, pas seulement celles concernant une fonction particulière. Vous pouvez améliorer ceci en n'extrayant que les révolutions en changeant votre fonction et en faisant une recherche de bissection de ces révisions seulement.

+0

Je pensais que bisect travaillé sur un niveau changset, pas un niveau ligne par ligne. –

+0

bisect ne fonctionne que sur le niveau de changeset – heckj

+0

Oui, je sais que bisect est changement par changement. Je connais. – Borealid

1

La réponse est: cela dépend du travail manuel que vous êtes prêt à mettre en

Qu'est-ce que vous pouvez faire est retrousser vos manches et utiliser l'extension du grenier en mode interactif.. Si vous utilisez TortoiseHg, vous l'avez déjà, exécutez simplement hgtk shelve et il vous permet de déplacer les modifications autour d'un gros différentiel à la fois. (un morceau étant un ensemble de différences de ligne contiguës)

Il existe de nombreux autres outils de correction de diff qui vous donneront une résolution mono-morceau. Faites-moi savoir si vous avez besoin de plus de détails. Et juste pour le plaisir, parlons de la façon dont une solution automatisée comme bisect n'est pas possible, car il n'est pas toujours logique que la moitié d'un ensemble de modifications doive encore compiler. Pire encore, que se passe-t-il s'ils compilent, mais ont des erreurs de logique? Voici un scénario simple pire des cas ...

void main(){ 
    Foo *x = malloc(128); 
    frobFoo(&x); 
- free(x); //line 4 removed in changeset 
} 

void frobFoo(Foo ** x){ 
+ free(*x); //line 8 added in changeset 
} 
Questions connexes