Trots att patchar ofta bara är någon kilobyte stora ska man inte underskatta deras betydelse i det fortlöpande arbetet med Drupal. Patchen är förutsättningen för att tusentals personer kan gemensamt arbeta på Drupal och alla dess moduler.
Patchar är alltså viktiga och därför är det bra att förstå vad de är och hur de fungerar. I detta blogginlägg berättar jag hur en patch fungerar och hur patchar används i utveckligen av Drupal och dess moduler.
Hur en patch fungerar
För att förklara hur en patch fungerar tar vi ett exempel med helt vanlig text. Vi skulle kunna jämföra programkod men patchar fungerar lika bra med vilken text som helst.
Nedan ser du de två första meningarna ur Hemsöborna av August Strindberg.
Han kom som ett yrväder en aprilafton och hade ett höganäskrus i en svångrem om
halsen. Clara och Lotten voro inne med sköt-ekan att hämta honom på Dalarö brygga;
men det dröjde evigheter, innan de kommo i båt. De skulle till handelsman och ha
en tunna tjära och på abeteket och hämta gråsalva åt grisen, och så skulle de på
posten och få ett frimärke, och så skulle de ner till Fia Lövström i Kroken och
låna tuppen mot ett halvpund småtärna till notbygget, och sist hade de hamnat
på
gästgivaregården, där Carlsson bjudit på kaffe med dopp.
Versionen nedan kommer från en 5,25-tums floppy-diskett från en okänd högstadieskola som på 80-talet hade framtidstron att införskaffa Compis-datorer till undervisningen i svenska. Rektorn jublade – Strindberg fanns nu i digital version!
Eleverna var inte helt entusiastiska och tyckte att boken behövde uppdateras. Efter lektionen hittade läraren Sören disketten med boken i denna tappning:
Han kom som ett yrväder en aprilafton och hade en bira i en svångrem om
halsen.
Clara och Lotten voro inne med epatraktorn att hämta honom på Dalarö busstation;
men det dröjde evigheter, innan de kommo i båt. De skulle till ICA-butiken och
ha
en tunna tjära och på hälsoshoppen och köpa mjällschampoo åt hunden, och så
skulle de på
posten och få ett frimärke, och så skulle de ner till Fia Lövström
i Kroken och
låna bulldoggen mot ett halvpund småtärna till notbygget, och sist
hade de hamnat på
gästgivaregården, där Carlsson bjudit på kaffe med dopp.
Sören såg snabbt att något inte stämde och undrade av ren nyfikenhet vad eleverna hittat på. Hur ska stackars Sören kunna se vilka ändringar som gjorts?
Sören vet på en lösning. Han kan Unix och beslutar sig för att använda programmet diff!
Sören hade en backupdiskett utan elevernas kreativa modifikationer. Den kunde nu Sören använda som original. Året är 1991 och Sören använder det splitternya formatet unified diff, som av en händelse är samma format som tio år senare används inom Drupalprojektet. På sin dator kör Sören detta kommando:
$ diff -u hems1.txt hems2.txt > hems.patch
Skillnaden mellan originalet hems.txt och den modifierade versionen hems2.txt sparas i filen hems.patch. Växeln -u anger att formatet skall vara unified. Med denna patchfil kan Sören se exakt vad som ändrats. Han kan också återställa filen till originalet utan att behöva skriva över den.
Vi kikar på vad patchfilen innehåller:
--- hems1.txt 2010-02-19 19:24:25.000000000 +0100
+++ hems2.txt 2010-02-19 19:24:21.000000000 +0100
@@ -1,7 +1,7 @@
Han kom som ett yrväder en aprilafton och hade ett höganäskrus i en svångrem om
-halsen. Clara och Lotten voro inne med sköt-ekan att hämta honom på Dalarö brygga;
+halsen. Clara och Lotten voro inne med epatraktorn att hämta honom på Dalarö busstation;
men det dröjde evigheter, innan de kommo i båt. De skulle till handelsman och ha
en tunna tjära och på abeteket och hämta gråsalva åt grisen, och så skulle de på
posten och få ett frimärke, och så skulle de ner till Fia Lövström i Kroken och
-låna tuppen mot ett halvpund småtärna till notbygget, och sist hade de hamnat på
+låna bulldoggen mot ett halvpund småtärna till notbygget, och sist hade de hamnat på
gästgivaregården, där Carlsson bjudit på kaffe med dopp.
Jämförelsen har gjorts mellan hems1.txt och hems2.txt, och datumen anger de datum vardera fil senast ändrats. Efter det kommer två kanelbullar, och beskriver de rader som ändrats, det är sju rader med början från rad ett.
Efter det kommer det riktigt intressanta – själva jämförelsen. Denna görs rad för rad och patchen beskriver vilka rader från originalet som inte finns med i den förändrade versionen. De raderna har ett minustecken framför sig. De rader som finns med i den förändrade versionen men saknar motsvarighet i originalet får ett plustecken framför sig.
Sören kan nu se att hans kreativa elever ändrat dessa rader:
halsen. Clara och Lotten voro inne med sköt-ekan att hämta honom på Dalarö brygga;
låna tuppen mot ett halvpund småtärna till notbygget, och sist hade de hamnat på
De har sedan ersatt dem med dessa:
halsen. Clara och Lotten voro inne med epatraktorn att hämta honom på Dalarö busstation;
låna bulldoggen mot ett halvpund småtärna till notbygget, och sist hade de hamnat på
Endast ett ord i varje rad har ändrats men diff gör jämförelsen per rad och därför bedömer diff att raden har ändrats i dess helhet. Diff tolkar det som att raden raderats (minustecken) och att en helt annan rad lagts till (plustecken).
Att skillnaden enbart är ett ord bryr sig diff inte om.
Det finns jämförelseprogram som kan jobba på tecken och ord-nivå men resultatet blir att patcharna blir svåra att läsa. Radnivå är tillräcklig detaljnivå för de flesta.
Sören kan nu få tillbaka originalet med programmet patch. Han kör detta kommando:
$ patch hems2.txt hems.patch
Patch läser ändringarna ur hems.patch, “spolar tillbaka bandet” och återställer originalet genom att vända ändringarna. Resultatet blir att hems2.txt får samma text som hems1.txt.
Samma teknik kan tillämpas på programkod. Det blir då väldigt tydligt vad som ändrats och ännu bättre är att man med patch kan tillämpa ändringarna utan manuellt arbete.
Programmen patch och diff ingår i Linux, Unix och Mac OS X. Om du har Windows kan du ladda ned programmen här och här. Flera utvecklingsmiljöer, bland andra Eclipse och NetBeans, har inbyggt stöd för patch och diff.
Patchar och versionshantering som ett sätt att skriva mjukvara tillsammans
Det är många som är med och bidrar när Drupals kod utvecklas och förbättras. Eftersom så många är inblandade är det inte realistiskt att låta alla göra ändringar direkt i koden. I stället används patchar för att dela med sig av kodändringar.
Nästan alla ändringar i Drupal och dess moduler börjar som patchar. Ofta rapporteras ett problem, en bugg eller ett så uttrycks önskemål om ny funktionalitet . I många fall skickar rapportören med en patch med förslag på hur koden kan förändras för att lösa problemet eller skapa den nya funktionaliteten.
För att kunna samarbeta effektivt med programkod räcker det inte bara med patchar, ytterligare en ingrediens måste till – versionshanteringsverktyget.
När man utvecklar program och skriver programkod vill man gärna hålla koll på ändringar. Genom att veta vad som ändrades när man kan lättare hitta felkällor när man felsöker, eller debuggar som utvecklare säger. Sådana ändringar spårar man med ett versionshanteringsverktyg. Dessa verktyg fungerar så att de från början läser in alla filer med kod och sparar dem. När du sedan gjort ändringar kan versionshanteringsverktyg detektera ändringarna genom att köra en variant av diff. Sedan sparar verktyget undan ändringarna som en ny version. Handlingen att spara undan ändringar kallas för en commit.
Genom att ändringar sparas på varandra i tids- och versionsordning kan du gå tillbaka version för version och se exakt vad som ändrades när och av vem. Allt detta är möjligt tack vare diff och patchar.
Alla moduler och kod på drupal.org ligger lagrade i ett versionshanteringssystem och allt arbete med kod sker mot det systemet. När man utvecklar för Drupal hämtar man ofta en kopia av en fil från versionshanteringssystemet. Man gör sedan sina ändringar i filen, och skapar därefter en patch. Andra intresserade kan ladda hem patchen, hämta ut samma kod från versionshanteringssystemet, tillämpa patchen och se de ändringar du gjort.
Den som har ansvaret för modulen kan därefter undersöka patchen och avgöra ifall lösningen är bra och ifall den är önskvärd eller om den bör lösas på annat sätt. Andra intresserade kan också göra patchar och ladda upp. På detta sätt kan många delta i ärendet och hjälpa till att förbättra patchen eller föreslå andra lösningar.
När tillräckligt många bedömer att en patch är bra nog kan den som är ansvarig göra en commit med ändringarna. Därmed går ändringen in i versionshanteringssystemet och blir en del av modulen. När det är dags att släppa en ny version av modulen kommer ändringen med.
Hela den här processen sker helt öppet. Du kan besöka ärendeköerna på drupal.org för att se hur arbetet med Drupal sker genom tusentals små kodändringar som delas och förbättras gemensamt.
Vill du lära dig mer?
Ett tips är att läsa introduktionen till patchar på drupal.org:
Om du vill komma igång med att bidra med kod finns mycket information att tillgå här:
http://drupal.org/node/10259
Det finns ett antal ärenden som man jobbar med på drupal.org. Du kan dra nytta av dina nyförvärvade patch-kunskaper på direkten genom att bidra till Drupal och delta i arbetet att lösa dem. Här finns ett axplock av saker man jobbar med just nu:
- http://drupal.org/bug-bingo
- http://drupal.org/contrib-bug-bingo
- http://drupal.org/patch/spotlight
- http://drupal.org/patch-bingo
- http://drupal.org/contrib-patch-bingo
Om du är nyfiken på versionshantering i allmänhet finns mycket information på Wikipedia:
http://en.wikipedia.org/wiki/Revision_control
Bild: aperfect1@sxc.hu










Kommentarer
Skriv ny kommentar