Diff en patch

Diff

Diff is een klein unix programma om 2 files te vergelijken en de verschillen te laten zien. Dit wordt door ontwikkelaars gebruikt om wijzichingen in programma's naar elkaar door te sturen. Diff toont met de symbolen "<" Wat er verwijderd is en met ">" wat er nieuw is. Hiermee is een redelijk snel inzicht te krijgen wat er veranderd is.

De meest simpele manier van het gebruik van diff is diff <oldfile> <newfile>.

Een voorbeeld van diff

Stel we zijn enthosiast geworden en hebben ons hello programma veranderd zo dat hij hello <loginname> roept. We willen dat de hele wereld dat weet. Daarom maken we een diff die we de wereld in sturen:
[marceln@paard hello-1.3]$ diff my/hello.c mynew/hello.c
1a2,4
> #include 
> #include 
> #include 
4c7,11
<         printf ("Hello world\n");
---
> 	struct passwd *pwline;
> 	uid_t user;
> 	user = getuid ();
> 	pwline = getpwuid (user);
>         printf ("Hello %s\n", pwline->pw_name);
We zien hier dat er nog al wat code bij gekomen is. Er is slechts een regel veranderd. Nu kan de hele wereld onze wijzichen na bouwen.

Patch

Natuurlijk wil de hele wereld onze grandioze verbetering over nemen. Ze zijn echter te lui om het over te typen. Daarom gebruiken ze patch om precies de zelfde wijzichingen uit te voeren als ik gedaan heb.

Helaas blijkt dat niet makelijk te gaan. Er staat net niet genoeg informatie in dit diff file om het patchen ook makelijk te maken. Daarom zijn er extra opties voor diff om de verschillen van complete directorie structuren in een file op te slaan en via patch in een keer toe te passen op een ongemodificeerde source.

De goede manier

diff

Voor het aanmaken van de patch ga onder de directory staan waar de nieuwe source klaar staat. Je gebruikt dan bijvoorbeeld de volgende opties diff -Naur <olddir> <newdir>. Hiermee creeer je een recursief patch file waarin ook een stuk context van de veranderingen staan. Hierdoor is het ook mogenlijk om die stukken in de source te vinden als op die source andere wijzichen plaats hebben gevonden.

patch

Ga in source directorie staan waarop de patch toegepast moet worden en geef het commando patch -p1 <patchfile. Nu worden alle wijzichen aangebracht. Normaal gesproken krijg je nu een lijst te zien met geslaagde gepatchde files.

Werkt het?

Een goed voorbeeld dat het gebruik van diff en patch werkt vind ik de linux kernel. Tussen iedere versie haal je een patch file op waarin precies de wijzichen staan. Die pas je toe op je kernel source en je hebt de volgende versie in huis.