2017-04-10 splitpatch

by Vasil Kolev

Нов ценен tool – splitpatch (има го в debian, нищо, че е на ruby).

Трябваше да вкараме едно парче код (на perl) в главното ни repo, и след code review имаше забележки като за 11 промени. Вкарахме ги, тествах го и открих, че не работи – output-а беше много много различен от този в началото (който си се знаеше, че е верен).

Един вариант беше някой да гледа промените ред по ред и да се разбере какво е объркано. Вместо да се стига до такива крайни мерки, намерих tool, който може да сцепи patch-а на hunk-ове, и след това направих следното:

for i in ptch/* ; do patch -o test TOOL $i ; ./test debug > $i.output ; done

и след това с един прост for и diff видях кои съвпадат и кои се различават, и проблемния commit лъсна…

Имаше и варианта вместо да patch-вам оригинала, да махам по един patch от финалния, докато не изчезне проблема. При зависещи един от друг hunk-ове пък може да се направи нещо още по-забавно – да се направят всичките комбинации от patch-ове (като са 11 не са толкова много), да се изтества и пак да се хване разликата сравнително лесно (ако например два са виновни).

Изводът е, че човек може да дебъгва код на нещо в много случаи и без да знае езика…

Tags:

3 Responses to “2017-04-10 splitpatch”

  1. Антон Тодоров Says:

    Не отива на добре света…

    Цяла програма написали вместо да се ползва инструмент от GNU coreutils който се намира във всяка дистрибуция* и върши общо взето същата работа?!

    $ csplit -k -f “prefix-” -b “%04d.patch” git_patch_file.patch /diff\ \-\-git/ {*}

    Лесно се преправя да цепи не-git пачове, тогава прави първия файл празен, но го преживявам :)

    [*] На FreeBSD версията е малко тегава ама пак може да се докара да свърши работа

  2. Иван Says:

    `man git-bisect`

  3. Vasil Kolev Says:

    @Иван, git-bisect работи в/у цял commit, и е интерактивен донякъде, докато това можах да го пусна веднъж и да се види много лесно коя точно промяна го прави. bisect-а не е лош, но за някои неща е в категорията “тъпа брадва”.
    (в сборника админски задачи ще вкарам една такава, може да пробваш да я решиш с bisect:) )

Leave a Reply