5.2. diff og patch

Ofte vil programmøren skulle se hvad der er ændret mellem to udgaver af en fil. Er der måske 2000 linjer kode er dette ofte umuligt at gøre manuelt, og derfor bør du se nærmere på et par værktøjer der kan hjælpe dig meget. Lad os tage et eksempel på hvordan dette gøres:

Eksempel 5-10. Anvendelse af diff

Først ser vi på en program-stump vi kan kalde A_org.c.


typedef struct {
  unsigned int R;
  unsigned int G;
  unsigned int B;
} RGB_Image;

typedef struct {
  int *m,*n;
  int No;
} pixar;

Denne skal vi sammenligne med A.c, der ser således ud:


typedef struct {
  unsigned int R;
  unsigned int G;
  unsigned int B;
} RGB_Image;

typedef struct {
  int *m,*p;
  int No;
} pixar;

int a,b,c;

De ser jo meget ens ud, de to stumper kode. For at se forskelle kører vi


hven% diff A_org.c A.c
8c8
<   int *m,*n;
---
>   int *m,*p;       
10a11,13
>
> int a,b,c;
Vi kan se at linje 8 er ændret (8c8 betyder at linje 8 i A_org.cer ændret i forhold til linje 8 i A.c). Næste information (10a11,13) er at linje 11 til 13 i A.c er appended, dvs. tilføjet, i forhold til linje 10 i A_org.c.

En lille huskeregel mht. > og <: < er filen til venste i argumentlisten til diff, og tilsvarende er > filen til højre (2. argument).

Det skal også nævnes at man ofte laver en "unified diff" med


hven% diff -u A_org.c A.c
--- A_org.c     Tue Dec 19 21:ec 19 21:56:43 2000
@@ -5,6 +5,8 @@
 } RGB_Image;
 
 typedef struct {
-  int *m,*n;
+  int *m,*p;
   int No;
 } pixar;
+
+int a,b,c;      

Her er samme information gemt, men med en anden syntaks. Med - og + vises hvilke linjer som er ændret, men også et par af de foregående og efterfølgende linjer kommer også med. Det gør det lidt nemmere at finde stedet for ændringer efterfølgende.

Ofte er der kun små ændringer mellem to udgaver af en fil, og derfor ses det ofte at man distribuerer kildetekst til en basisudgave og derefter en eller flere "lapper" til programmet. Lapperne er filer lavet ved at finde forskellen mellem basisudgaven og den nye udgave af filen med diff. Lad os se dette i et eksempel.

Eksempel 5-11. Anvendelse af patch

Normalt anvendes lapper til at sende ændringer/opdateringer fra programmøren til andre der programmerer på samme fil(er). Derfor er filnavne A_org.c og A.c som var anvendt i eksemplet ovenfor normalt anvendt som den originale fil i forhold til den nye. Ofte har programmøren to fil-strukturer liggende - den originale og den nye med ændringer.

Først lader vi programmøren af programmet danne en lap svarende til forskellen mellem filerne A_org.c og A.c hvor de to filer er nævnt ovenfor:


hven% diff -u A_org.c A.c > A_patch

Bemærk at jeg her, ligesom i de forrige eksempler, vender de to filer så den nye er sidst!

Nu kan programmøreren sende lappen A_patch til andre programmører som kan opdatere deres A.c. Lad os prøve dette. Vi antager nu at vi er brugeren "tyge" som har en fil A.c som er lig med programmørens fil A_org.c.


hven% patch < A_patch
patching file A.c  
Så nemt er det at opdatere filen. En lap kan indeholde rettelser til mange filer som så automatisk opdateres.