LINUX.ORG.RU

Как сформировать правильный патч?

 ,


0

2

Допустим, есть патч1 и патч2, в патч1 есть

@@ -2145,6 +2152,7 @@ main(int argc, char *argv[])
        checkotherwm();
        setup();
        scan();
+       runAutostart();
        run();
        cleanup();
        XCloseDisplay(dpy);

Когда я накладываю патч1, то всё ок. Но если я накладываю патч2, который изменяет положение main c

@@ -2145,6 +2152,7

На другое, то если я попробую наложить патч1 после патч2, то он не наложится, т.к сместился main. Как сделать так, чтобы не привязываться к позиции строки, а привязываться к строке т.е ищем main(int argc, char *argv[]) и добавляем после scan runAutostart();. Это возможно?

★★★★

man diff

       -c, -C NUM, --context[=NUM]
              output NUM (default 3) lines of copied context

       -u, -U NUM, --unified[=NUM]
              output NUM (default 3) lines of unified context
man patch

       -F num  or  --fuzz=num
          Set  the  maximum  fuzz factor.  This option only applies to diffs that
          have context, and causes patch to ignore up to that many lines of  con‐
          text  in looking for places to install a hunk.  Note that a larger fuzz
          factor increases the odds of a faulty patch.  The default  fuzz  factor
          is  2.   A  fuzz factor greater than or equal to the number of lines of
          context in the context diff, ordinarily 3, ignores all context.
anonymous
()

На другое, то если я попробую наложить патч1 после патч2, то он не наложится, т.к сместился main. Как сделать так, чтобы не привязываться к позиции строки, а привязываться к строке т.е ищем main(int argc, char *argv[]) и добавляем после scan runAutostart();. Это возможно?

Не просто невозможно, но и не нужно. Мелкие смещения patch сам резолвит, крупные говорят о том, что база значительно поменялась(и, возможно, сам патч уже устарел и более не является верным).

anonymous
()
Ответ на: комментарий от anonymous

Подождите-ка! Крупное смещение не о чём не говорит. У меня сейчас патчи dwm, которые являются независимыми друг от друга. Т.е не одна строка из любого патча не конфликтует с другими патчами, но из-за того, что добавляются блоки кода, - появляется явление «патч не накладывается». По-моему, поведение думать в этом направлении - это не должно быть компетенцией патча. Его дело найти строку и произвести манипуляцию до\после\вместо этой строки

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от bryak

тебе же написали про -u, ты попробовал?

в общем случае после каждого патча надо делать ребейз. закомить их один за другим и сделай git format-patch чтобы получить патчсет.

anonymous
()
Ответ на: комментарий от anonymous

я делаю патч гитом, типа такого:

git diff master Branch1 > ../patchfile

Видимо надо какую-то опцию добавить. Дока по гиту большая, не ясно что именно надо ему указать

bryak ★★★★
() автор топика
Ответ на: комментарий от bryak
git help format-patch
git help am
git help diff
git help apply
anonymous
()
Ответ на: комментарий от bryak

если ты патчи накладываешь не гитом, попробуй ещё patch -u <patchfile. возможно проблема не в том как ты генеришь дифф, а в том как ты его применяешь.

With context diffs, and to a lesser extent with normal diffs, patch can detect when the line numbers mentioned in the patch are incorrect, and attempts to find the correct place to apply  each hunk  of  the  patch.   As a first guess, it takes the line number mentioned for the hunk, plus or minus any offset used in applying the previous hunk.  If that is not the correct place, patch scans both forwards and backwards for a set of lines matching the context given in the hunk.  First patch looks for a place where all lines of the context match.  If no such  place  is  found, and it's a context diff, and the maximum fuzz factor is set to 1 or more, then another scan takes place ignoring the first and last line of context.  If that fails, and the maximum fuzz factor is set to 2 or more, the first two and last two lines of context are ignored, and another scan is made.  (The default maximum fuzz factor is 2.)
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.