Hg: Обновлять построчно? - PullRequest
1 голос
/ 15 июля 2010

У меня есть ошибка, которая присутствует в одном наборе изменений, но не является его родителем.Есть ли какая-то функциональность в Mercurial, где я могу «обновлять» меньшими шагами, чтобы увидеть, где начинается проблема?

Например, если diff - это изменение функций A, B и C, я бы запустилнабор тестов после внесения каждого из этих изменений, чтобы попытаться диагностировать проблему.

Ответы [ 2 ]

1 голос
/ 16 июля 2010

Ответ таков: это зависит от того, сколько ручного труда вы готовы потратить.

Что вы можете сделать - это засучить рукава и использовать чердак в интерактивном режиме. Если вы используете TortoiseHg, он у вас уже есть, просто запустите hgtk shelve, и он позволит вам перемещать изменения по одному разному блоку за раз. (кусок - это набор смежных линий различий)

Существует множество других инструментов исправления различий, которые дадут вам разрешение на один блок. Дайте мне знать, если вам нужно больше деталей.

И просто для удовольствия, давайте поговорим о том, что автоматическое решение, такое как bisect, невозможно, так как не всегда имеет смысл, что половина набора изменений все равно должна компилироваться. Хуже того, что если они скомпилируются, но у них будут логические ошибки? Вот простой наихудший сценарий ...

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
}
0 голосов
/ 15 июля 2010

Вы можете использовать hg diff -r firstrev -r secondrev и фильтровать выходные данные только по битам, относящимся к этим функциям, а затем последовательно проходить патчи.

Или вы можете использовать расширение bisect, разработанное для этой цели - хотяэто даст вам все изменения, сделанные в вашей кодовой базе, а не только те, которые касаются конкретной функции.Вы можете улучшить это, извлекая только те обороты, которые меняют вашу функцию, а затем делите пополам поиск только тех ревизий.

...