darcs: versiebeheer op een nieuwe manier

darcs logo

Toen Andreas Gohr enkele maanden geleden opzoek ging naar een geschikte source control-tool voor DokuWiki koos hij voor darcs. Het was de eerste keer dat ik van darcs hoorde, maar sindsdien ben ik het meer en meer tegengekomen.

In vergelijking met 'klassieke' SCM-tools, zoals CVS, Subversion en SourceSafe, werkt darcs opmerkelijk anders. Bij deze klassieke systemen heb je meestal enerzijds een centrale server met een 'repository' waar al de code wordt bewaard en anderzijds een sandbox op je lokale computer die alle bestanden bevat waaraan je kan werken. darcs echter is een gedistribueerd systeem. Hierbij is dus iedere 'sandbox' ook meteen een 'repository'. Dat heeft aardig wat voordelen. Zo moet je bijvoorbeeld geen verbinding hebben met een server om bewerkingen op de repository uit te voeren.

In tegenstelling tot CVS werkt darcs niet met versies van bestanden maar met 'patchsets'. Zo'n patchset wordt gemaakt aan de hand van alle wijzigingen die je aanbracht ten opzichte van je lokale repository. Dit is handig want op die manier zitten alle wijzigingen die bij elkaar horen in ??n patchset samen. Het delen van je wijzigingen in de vorm van patchsets is dan ook erg makkelijk.

Een ander groot verschil tussen systemen zoals CVS enerzijds en darcs anderzijds is het updaten van de code met de recentste code van andere mensen die mee aan het project werken. Met CVS doe je dit met behulp van het commando cvs update Dit commando haalt de meest recente versies van alle bestanden op vanop de CVS-server. Omdat darcs een gedistribueerd systeem is en dus niet met een centrale server werkt gebeurt het synchroniseren op een aantal andere manieren. Zo zijn er de commando's darcs pull en darcs push Deze commando's brengen wijzigingen uit een andere repository over naar jouw repository ('overtrekken'), respectievelijk voeren de wijzigingen uit jouw repository door op een andere repository (duwen dus). Deze methodes werken natuurlijk enkel als je de nodige lees- ?n schrijfrechten hebt op die andere repository (schrijfrechten zijn enkel nodig voor een push). Een andere manier om te synchroniseren, waarbij je geen toegang moet hebben tot de andere 'repo' is darcs send Dit verstuurt de patch via e-mail naar de eigenaar van de andere repository. Ook darcs send -o patchfile is erg handig. In plaats van de patch te mailen schrijft het alle data weg naar 'patchfile', zodat je het manueel kan mailen of bijvoorbeeld als attachment in je bugtracker kan stoppen. Wanneer je een patch ontvangt kan je die h??l eenvoudig op je repository toepassen: darcs apply patchfile

Erg handig aan darcs is dat je een repository online kan plaatsen via een eenvoudige webserver. Nadat je een repository op je webserver hebt gezet, bijvoorbeeld via ftp, kan iedereen een darcs get http://example.org/my/darcs/repo doen met de url. Op die manier heeft iedereen die dat wenst leestoegang tot je repository en kan men lokaal wijzigingen maken. Deze wijzigingen kunnen dan eventueel weer in de vorm van een patchfile naar de eigenaar van de repository gemaild worden. Door een repository op een server beschikbaar te maken maak je het ook makkelijker om te synchroniseren omdat deze repository dan beschouwd kan worden als de 'moederrepository'. Iedereen is echter steeds vrij om z'n lokale repository al dan niet te synchroniseren met deze moederrepository.

Vermits darcs met patches werkt is het ook perfect mogelijk om een eigen aangepaste versie te maken van een applicatie die je toch automatisch kan updaten met offici?le code zonder je eigen wijzigingen te verliezen.

Hoewel ik nog niet zo heel veel heb kunnen experimenteren met darcs vind ik het tot hiertoe een zeer knap systeem. Zeker voor kleinere projecten lijkt het me erg geschikt. Ik plan dan ook om voor m'n eigen kleinere projectjes, zoals Nucleus Plugins, CVS in te ruilen voor darcs. Ik heb alvast een plekje opgezet waar ik al m'n repo's online zal plaatsen: http://dev.budts.be/darcs/. Momenteel vind je daar al een repo met de meest recente code van AttachFile, een Nucleus plugin waaraan ik momenteel werk.

Wat momenteel nog wel als een nadeel kan overkomen, vooral dan voor (windows)gebruikers die niet gewend zijn aan de commandline, is dat er nog geen enkele grafische interface beschikbaar is voor darcs. Hieraan wordt echter wel gewerkt door afzonderlijke projecten, zoals bijvoorbeeld EclipseDarcs.

Het overzetten van een bestaande repository, bijvoorbeeld je CVS repository, is vrij makkelijk met de verschillende tooltjes die beschikbaar zijn. Het overzetten van mijn CVS repository voor de AttachFile-plugin naar een darcs repository ging bijvoorbeeld vrij gemakkelijk met het cvs2darcs tooltje. Hoewel ik hiervoor wel even heb voor moeten prutsen met Cygwin en enkele benodigde programma'tjes zelf heb moeten compileren.

Een kort voorbeeld van hoe je de repo van AttachFile zou kunnen gebruiken vind je in de versie van dit artikel op m'n Dev-Blog.

Comments

Comment Atom Feed