Portál AbcLinuxu, 10. června 2024 02:29

Jednoduché patchování v praxi

8.6.2005 21:07 | Přečteno: 1926× | Linux | poslední úprava: 8.6.2005 21:11

Právě jsem si trochu vyzkoušel známé příkazy diff a patch pěkně v praxi. Jak jednoduše na to, tak aby to opravdu fungovalo?

Jednoduše řečeno, diff zkoumá rozdíly s souborech (difference) a patch provádí na základě těchto rozdílů záplatu (patch). Nejčastěji se s tím setkáme u patchů do jádra, nebo do jiných programů, ale dá se to dobře využít téměř na jakékoli textové soubory, které se hodně mění a my o tom chceme mít přehled.

[pozadí] Mám tu lokalizaci jednoho známého publikačního systému (ano je Wordpress) a chci do ní aplikovat nové bezpečnostní záplaty. Před nějakým časem jsem ručně mergoval změny mezi verzí 1.5 a 1.5.1 do 1.5-cz za vzniku 1.5.1-cz. Možná to zní složitě, ale je to tak. A je to pracné. Tady moc patch a diff použít nešel, ale možná, že by mi ušetřil trochu práce. Jenže než jsem stihnul vydat 1.5.1-cz, objevily se bezpečností updaty - 1.5.1.1 a 1.5.1.2. Tentokrát jsem se rozhodl použít patch.[/pozadí]

Takže cílem bylo zanést změny mezi 1.5.1 a 1.5.1.2 do 1.5.1-cz za vzniku 1.5.1.2-cz. Ok? Nejdřív si tedy uděláme diff mezi 1.5.1 a 1.5.1.2:


wordpress$ diff -ruN 1.5.1 1.5.1.2 > 1.5.1.2.diff

Parametry: -r = rekurzivně prohledá podadresáře. -u = unified format, a defaultní počet (3) okolních řádků (jako kontext). -N = neexistující soubory bereme jako prázdné.

Poté si zkopírujeme 1.5.1-cz do 1.5.1.2-cz a přesuneme se tam. Pak provedeme samotný patch:


1.5.1.2-cz$ patch -p1 --verbose < ../1.5.1.2.diff &> ../patch.log

Parametry: -p1 = počet lomítek na začátku, které se uříznou. --verbose = ukecaný výstup. Ještě pro testování můžeme použít --dry-run = neprovádět akci doopravdy, jen ukázat, co to udělá.

Patch načítá ze standardního vstupu, proto <. Jinak můžeme použít rouru, máme-li diff soubor komprimovaný: bzcat neco.diff | patch -p1. Nakonec si oba výstupy šoupnem do souboru patch.log pomocí &>.

Tím se provede sloučení změn, neboli merge. Občas se však vyskytnou kolize, které sám patch neumí vyřešit a nechá to na nás. Dá nám to alespoň vědět podobnými hláškami:

Hunk #1 FAILED at 2.
1 out of 1 hunk FAILED -- saving rejects to file wp-content/themes/default/header.php.rej

Zanechá nám ještě soubory *.rej (jako rejected), kde se dozvíme, s čím si patch neví rady a co musíme sloučit ručně.

Pokud máte rádi trochu pohodlnější práci (nemyslím zrovna hromadné zpracování pomocí automatických skriptů), zkuste KDiff3, což je velice povedený program, který umí hodně, pokud jde o diffování a patchování v grafickém prostředí.

To by k jednoduchému příkladu použití patche a diffu snad stačilo. Více informací a příkladů použití najdete jako obvykle v manuálech, howto a jiných článcích. Možná tu mám někde chybu(y), tak se nehňevejte.

Odkazy:

       

Hodnocení: -

zatím nehodnoceno
        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

8.6.2005 21:10 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Kdiff3
Odpovědět | Sbalit | Link | Blokovat | Admin
Pokud si někdo, tak jako já, nemá v úmyslu nechat do systému nakvartýrovat Qt, tak může zkusit třeba diffovátko, které je součástí Xfce :-)
Copak toho není dost?
Bohumír Zámečník avatar 8.6.2005 21:14 Bohumír Zámečník | skóre: 19 | blog: bohous
Rozbalit Rozbalit vše Re: Kdiff3
Třeba... těch grafickejch udělátek k tomu je dost, ale kdiff3 mi přišel tady na Mandraku v KDE nejrychleji pod ruku. Ale pokud má jít o (polo)automatické zpracování, není na holý diff/patch.
"Dobrý den pane, nevíte, která bije?!"
8.6.2005 22:13 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
Rozbalit Rozbalit vše Re: Kdiff3
používám vimdiff, teda většinou jeho grafickou podobu - gvimdiff a nemusím řešit nějaké kněco nebo xfce
-- Nezdar není hanbou, hanbou je strach z pokusu.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.