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