Подтвердить что ты не робот

Постоянное изменение патча файла

Иногда по какой-то причине мне приходится создавать патч файлы (под Linux), которые находятся в неправильном направлении. Я знаю, что я могу справиться с этим, используя переключатель -R, применяя его через patch, но было бы неплохо, если бы существовал способ постоянного изменения патча файла. Есть ли утилита, которая может это сделать, или, например, регулярное выражение, которое будет гарантировано работать?

UPDATE

Ли Райан предложил аккуратный способ сделать это. Однако для этого требуется доступ к исходным исходным файлам. Поэтому я предполагаю, что должен обновить свой вопрос, чтобы заявить, что я больше подойду для достижения этого, учитывая только сам файл патча.

4b9b3361

Ответ 1

Вы можете использовать инструмент interdiff(1) из patchutils. В частности, на странице руководства для interdiff говорится:

Чтобы отменить патч, используйте /dev/null для diff2.

Так,

$ interdiff -q file.patch /dev/null > reversed.patch

-q / --quiet предотвращает вставку reverted: линий.

Ответ 2

Try:

patch -R file.txt file.patch
diff file.txt.orig file.txt > file.patch.rev
// you can then `rm file.txt.orig file.patch`

EDIT:

Чтобы изменить унифицированный diff, вам нужно изменить три вещи:

  • заголовок патча
  • заголовок блока
  • от + до - и - до +

Итак, как выглядит заголовок патча для a:

--- b.asm   2010-09-24 12:03:43.000000000 +1000    
+++ a.asm   2010-09-24 23:28:43.000000000 +1000

вам нужно отменить его, чтобы он выглядел так:

--- a.asm   2010-09-24 23:28:43.000000000 +1000
+++ b.asm   2010-09-24 12:03:43.000000000 +1000    

в основном переключаем порядок и переключаем +++ на --- и наоборот.

Затем заголовок блока:

@@ -29,5 +27,7 @@

Вам нужно изменить цифры, чтобы они выглядели следующим образом:

@@ -27,7 +29,5 @@

в основном, переключите числовые пары

и, наконец, переключите каждую строку, начинающуюся с +, и каждую строку, начинающуюся с -.

EDIT:

для переключения заголовка блока, вы можете сделать:

sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"

для переключения + в - и - на +, вы можете сделать:

sed -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/"

НАКОНЕЦ:

чтобы отменить заголовок патча, выполните:

head -2 orig.diff | tac | sed -e "s/+++/PPP/" -e "s/---/+++/" -e "s/PPP/---/" > head
tail orig.diff -n+3 > tail
cat head tail > headtail
rm head tail

Итак, наконец, наш (быстрый и грязный) script выглядит следующим образом:

#!/usr/bin/env sh
F="$1"
head -2 $F | tac | sed -e "s/+++/PPP/" -e "s/---/+++/" -e "s/PPP/---/" > $F.head
tail $F -n+3 | sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/" -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/" > $F.tail
cat $F.head $F.tail 
rm $F.head $F.tail

Я тестировал его и, похоже, работал.

хотя, чтобы сделать вещи более удобными и чистыми:

#!/usr/bin/env sh
swap() {
    sed -e "s/^$1/PPP/" -e "s/^$2/$1/" -e "s/^PPP/$2/"
}
file_header() {
    head -2 $1 | tac | swap +++ ---
}
fix_chunk_header() {
    sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/" 
}
fix_lines() {
    swap + -
}
file="$1"
file_header $file
tail $file -n+3 | fix_chunk_header | fix_lines

Ответ 3

Я применил патч patch -N -p0 < path/file.patch, но я начал сталкиваться с проблемами компиляции из-за неполного кода, все, что я сделал, - это запустить эту команду patch -p0 -R < path/file.patch. Наслаждайтесь ссылкой