jak z diff vytvorit patchovany zdrojak

Milan Kerslager milan.kerslager na spsselib.hiedu.cz
Čtvrtek Březen 4 13:19:11 CET 1999


On  3 Mar 98 at 23:17, Jakub Urban wrote:

> jakym zpusobem dostanu z originalniho zdrojove souboru a souboru, v kterem
> jsou dozdily orig. a patchovanoho souboru ten patchovany.

K vyrobe patchu (diferencni soubory) se pouziva program diff.
Standardem je tzv. unified diff format (diff umi i jine).
Vystupen je soubor, ktery je citelny i clovekem, obsahuje zmenene radky 
a znacky + (radek pridan) - (radek odebran) a kontext (standardne krome 
cisel radku v souboru i 3 okolni radky). Zmeny se pokud mozno seskupuji 
do tzv. "hunk". Kazdy hunk vypada tak, jako vystup prikladu nize.

Dva soubory:   diff -u stary novy
Cely podstrom: diff -urN stary/strom novy/strom

Priklad:

soubor.txt.orig
---------------
stary
stary stary
stary stary stary
stary stary stary stary


soubor.txt
----------
stary
novy
stary stary
stary stary stary
stary stary stary stary

pluto:~/prac/test> diff -u soubor.txt.orig soubor.txt
--- soubor.txt.orig     Thu Mar  4 12:06:26 1999
+++ soubor.txt  Thu Mar  4 12:06:40 1999
@@ -1,4 +1,5 @@
 stary
+novy
 stary stary
 stary stary stary
 stary stary stary stary
    
Tento vystup umi zpracovat program patch. Patch bere jako vstup diff 
soubor a meni podle zaznamenanych zmen stary soubor na novy. Pritom 
kontroluje zaznamenany kontext, aby si byl jisty, ze postupuje spravne. 
Pokud je kontext nespravny, patch zaznamena prislusny nepovedeny hunk 
do souboru s priponou .rej (soubor.txt.rej). Pak musite dodelat zmeny 
rucne. Muze se i stat, ze kontext sedi, ale je to cele posunute 
(soubor, ktery patchujete ma napriklad oproti souboru, ze ktereho se 
vychazelo na zacatku pridano 100 radku komentare). Proto se patch snazi 
sam zasynchronizovat podle vlozeneho kontextu (standardne o 2 radky, ale 
nemelo by to byt vetsi nez pocet radku kontextu).

Takze pokud A vyrobi diff souboru X a Y a zasle ho cloveku B, pak B 
muze aplikovat diff (patch) na soubor X, aby ziskal Y. Typicky priklad 
jsou patche pro jadro, protoze stahovat 300kB patch nebo 10MB cele 
jadro muze by rozdil.

Pokud nekomu zasilate vice patchu, musite se domluvit, vuci kterym 
verzim budou delane. Bud porad k jedne a te same (kumulativni patch) 
nebo vzdy k minule verzi (aditivni/rozdilovy). 
Linuxova jadra z duvodu snadneho patchovani pouzivaji takovy model:

Linus vyda verzi jadra a prijima patche vuci teto posledni verzi. Kdyz 
je patchu vice, vyda nove jadro (kompletni). Soucasne vyrobi patch k 
posledni oficialni verzi jadra (patchovat samozrejme musite rozbalene):

 linux-2.2.1.tar.bz2 + patch-2.2.2.bz2 = linux-2.2.2.tar.bz2

Nekdy ovsem vydava tzv. pre-patch. Tj. neni to jeste nova verze - pak:

 linux-2.2.1.tar.bz2 + pre-patch-2.2.2-1.bz2 = linux-2.2.2-pre1.tar.bz2
 linux-2.2.1.tar.bz2 + pre-patch-2.2.2-2.bz2 = linux-2.2.2-pre2.tar.bz2

Vsimete si, ze pre-patche nejsou prirustkove, ale vzdy se vychazi z 
posledni oficialni verze (tj. ne z opatchovane). Stejnym zpusobem 
uverejnuji patche ostatni (napr. A. Cox, A. Arcandeli, aj.).

Aplikace patche:

bzip2 -dc linux-2.2.2.tar.bz2 | tar xvf -
cd linux
zcat ../patch-2.2.2-ac3.bz2 | patch -p1 -s

Zbytek ponechavam vlastnimu studiu. Diff je v info, man patch.

--
                        Milan Kerslager, admin of spsselib.hiedu.cz
                        Monkey Linux, The Minimal Linux Distribution
                        See: http://www.spsselib.hiedu.cz/monkey/
                        E-mail: milan.kerslager na spsselib.hiedu.cz


Další informace o konferenci Linux