Patchar – snabblagningar

heart-48522_1280Tänk dig att du är mjukvaruutvecklare och har en gedigen kedja med hur du hanterar uppgifter, utvecklar kod, dokumenterar, granskar, testar, levererar.
Det är ett bra sätt att jobba men det tar tid från uppgift till leverans.
Senaste leveransen hade, trots alla tester, ett litet fel i sig och nu går det inte att köpa något på siten, detta måste fixas nu.

Vi tar den enkla vägen och gör en patch – en snabblagning.
När vi hittat var felet är tar vi en kopia av filen som ska ändras.
Vi åtgärdar felet, ser om det fungerar lokalt och skapar en patch.

Testa själv genom att skapa mappen test och däri filen: minfil.txt med detta innehåll:

Rad 1
Rad 2

Kopiera sedan minfil.txt till minfil-orig.txt
Nu ändrar du minfil.txt så det ser ut så här:

Rad 1
Ny rad
Rad 2

Stå utanför mappen test och skriv:
diff -uw test/minfil-orig.txt test/minfil.txt > my_quick_fix.patch

Patchen är skapad, nu kolar vi vad vi fått, skriv: cat my_quick_fix.patch
— test/minfil-orig.txt    2015-11-13 21:44:36.000000000 +0100
+++ test/minfil.txt    2015-11-13 21:45:03.000000000 +0100
@@ -1,2 +1,3 @@
Rad 1
+Ny rad
Rad 2
\ No newline at end of file

Patchfilen berättar att vi har lagt till en ny rad.
Det ser ut som vi har hela minfil.txt i patchen men så är inte fallet, diff tar med lite kod runt den ändrade raden för att ha en bättre chans att hitta var ändringen ska in ifall målfilen inte ser exakt ut som tänkt.

Nu testar vi om patchen fungerar. Vi vet hur minfil.txt ser ut:
cat test/minfil.txt
Rad 1
Ny rad
Rad 2

Låt oss återställa filen, kör: patch -p0 -l -R < my_quick_fix.patch
patching file test/minfil.txt
cat test/minfil.txt
Rad 1
Rad 2

Och så lägger vi på patchen igen,
patch -p0 -l < my_quick_fix.patch
patching file test/minfil.txt
cat test/minfil.txt
Rad 1
Ny rad
Rad 2

Nu gör vi det mer spännande. Återställ filen igen och ändra den till:
Ännu en rad
Rad 1
Rad 2

Nu ska vi se om det går att patcha filen.
patch -p0 -l < my_quick_fix.patch
patching file test/minfil.txt
Hunk #1 succeeded at 2 (offset 1 line).

Raden betyder att det gick bra men att den fick skjuta patchningen en rad (offset 1 line).
cat test/minfil.txt
Ännu en rad
Rad 1
Ny rad
Rad 2

Nåväl, klarar den att ta bort patchen också?
patch -p0 -l -R < my_quick_fix.patch
patching file test/minfil.txt
Hunk #1 succeeded at 2 (offset 1 line).

cat test/minfil.txt
Ännu en rad
Rad 1
Rad 2

Det gick ju bra.
Den här patchen gäller för en enda fil.

Nästa steg är att göra en patch som gäller för flera filer.
Man kan även göra patcher från versionshanterare som Mercurial (hg) och Git.
Jag spar det till nästa artikel på CharZam.com

Mer att läsa

http://www.gfi.com/blog/patch-management-process/

https://www.cocoanetics.com/2011/12/how-to-make-and-apply-patches/