Revertir permanentemente un archivo de parche


A veces, por cualquier razón, tengo que producir archivos de parche (bajo Linux) que están en la dirección equivocada. Sé que puedo lidiar con esto usando el interruptor -R al aplicarlo a través de patch, pero sería bueno si hubiera una forma de revertir permanentemente el archivo de parche. ¿Hay alguna utilidad que pueda hacer esto, o por ejemplo, una expresión regular que se garantizaría que funcione?

ACTUALIZACIÓN

Lie Ryan ha sugerido una forma ordenada de hacer esto . Sin embargo, requiere acceso a los archivos fuente originales. Así que supongo que debo actualizar mi pregunta para indicar que estoy más después de una forma de lograr esto dado solo el archivo de parche en sí.

Author: Community, 2010-10-11

3 answers

Puede utilizar la herramienta interdiff(1) desde patchutils. En particular, la página de manual de interdiff dice:

Para invertir un parche, use /dev / null para dif2.

Así que,

$ interdiff file.patch /dev/null > reversed.patch
 47
Author: camh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-10 23:54:13

Intenta:

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

EDITAR:

Para revertir un diff unificado, necesitas cambiar tres cosas: {[11]]}

  • el encabezado del parche
  • el encabezado del fragmento
  • el + a - y - a +

Así que así es como se ve un encabezado de parche para a:

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

Necesitas invertirlo para que se vea así:

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

Básicamente cambia el orden, y cambia +++ a --- y viceversa.

A continuación, el trozo cabecera:

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

Necesitas invertir los números, para que se vea así:

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

Básicamente, cambiar los pares de números

Y por último, cambie cada línea que comienza con + y cada línea que comienza con -.

EDITAR:

Para cambiar el encabezado del fragmento, puede hacer:

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

Para cambiar + a - y-a+, puede hacer:

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

FINALMENTE:

Para invertir el encabezado del parche, haga:

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

Así que, finalmente, nuestro (rápido y sucio) script parece:

#!/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

Lo probé, y parece funcionar.

Sin embargo, para hacer las cosas más mantenibles y más limpias:{[11]]}

#!/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
 14
Author: Lie Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-10 23:39:13

Había aplicado un parche patch -N -p0 < path/file.patch pero empecé a enfrentarme a problemas de compilación debido a código incompleto todo lo que hice fue ejecutar este comando patch -p0 -R < path/file.patch. Se refiere a este enlace

 0
Author: tinker_fairy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-06 10:23:55