CVS onder de knie krijgen met KDE's Cervisia

Originele auteur: Carlos Leonhard Woelz
Vertaling: Tom Verbreyt
Herziening 0.2
Licenties en verdiensten

Inhoudsoverzicht

CVS is een hulpmiddel bij het beheren en verspreiden van verschillende versies van bestanden. Het helpt je om op de hoogte te blijven van de snel wijzigende stand van zaken. Anders gezegd: CVS is een versie-controlesysteem. Met CVS wordt samenwerking erg vergemakkelijkt, omdat alle betrokkenen tegelijkertijd aan lokale kopieën kunnen werken, zonder zich daarbij zorgen te moeten maken over de wijzigingen van de anderen. CVS maakt het mogelijk om versies uit het verleden terug op te diepen (handig voor het opsporen van bugs), om branches (vertakkingen) te creëren (handig voor experimentele ontwikkeling en voor releases) en nog veel meer.

1 Inleiding

Een CVS-"repository" bevat alle huidige bestanden. Alle betrokkenen hebben hun eigen, lokale kopie van die bestanden, in het Engels als working folder bestempeld. Je kan je wijzigingen toebrengen aan de CVS-repository (dat noem je in het Engels "committing") en/of je eigen kopie bijwerken om de wijzigingen van andere personen toe te brengen aan de documenten die je zelf bezit. Dit artikel beschrijft hoe je je CVS-repository efficiënt kan beheren met behulp van Cervisia, een handig front-end voor CVS.

Je kan ervoor zorgen dat de hoofd-repository je eigen project bevat, als je gebruik wil maken van de handige versie-controlefuncties van CVS. Een lokale repository opzetten is eenvoudig en maakt het mogelijk om

Om de mogelijkheden van CVS optimaal te benutten, bewaar je best alle bestanden en documenten als tekstbestanden. Het merendeel van de functies die CVS je biedt, heeft immers te maken met het manipuleren van tekst. Het is dan ook logisch dat CVS vooral populair is in kringen van programmeurs en web-ontwikkelaars, omdat net daar hoofdzakelijk met tekstbestanden gewerkt wordt.

Het concept van versie-controle is echter even nuttig voor niet-programmeurs. Iedereen komt weleens in aanraking met opdrachten die samenwerking vereisen, zij het op het werk, aan de universiteit of eender waar. Ook complexe persoonlijke projecten kunnen baat hebben bij versie-controle. Tekstbestanden die in binair formaat opgeslagen zijn (bestanden die je aanmaakt met OpenOffice.org of KOffice zijn bijvoorbeeld gecomprimeerd), worden helaas ook als binaire bestanden behandeld. Zelfs tekst-documenten die opmaakinformatie bevatten, zoals .html-, .xml- en .rtf-bestanden, maken het gewone eindgebruikers moeilijk om de broncode van het document te bekijken. Hetzelfde geldt dan ook voor de wijzigingen die CVS toont.

In een volmaakte wereld zouden gebruikers ervoor kunnen kiezen enkel de inhoud te bekijken en niet de ruwe informatie die gepaard gaat met vele tekstbestanden en alle binaire bestanden. Zo'n toestand is echter afhankelijk van afzonderlijke applicaties, die dan immers met CVS in het achterhoofd geschreven zouden moeten zijn, opdat ze bestanden efficiënt zouden kunnen ontleden. Je kan je voorstellen dat dat geen eenvoudige taak is, afhankelijk van bestandtypes en applicaties. Laten we echter vooral niet afdwalen; dat probleem ligt buiten het bereik van dit artikel.

Het doel van deze korte handleiding ligt niet in het beschrijven van alle functies en commando's van CVS; de bedoeling is om de gebruiker te tonen hoe hij de meest gebruikelijke taken met CVS kan uitvoeren. Het zou bijvoorbeeld niet bijster nuttig zijn om alle CVS CLI-commando's van buiten te leren als je enkel wil meewerken aan de documentatie van een OSS-project. Hetzelfde geldt als je enkel de broncode van een programma wil downloaden of van een repository gebruik wil maken om samenwerkingsmogelijkheden te bieden in je bedrijf.

Cervisia is een front-end voor versie-controle. Cervisia is geschreven om CVS en andere versie-controleprogramma's te ondersteunen via één gemeenschappelijke bedieningsinterface. Op dit moment biedt Cervisia vele mogelijkheden, zoals het oplossen van conflicten, het aanschouwelijk maken van verschillen tussen bestanden en de geschiedenis van die bestanden en het bekijken van de status van bestanden in de werkmap. Voorts is er ondersteuning voor de meest gebruikte functies van CVS. Cervisia maakt deel uit van het pakket kdesdk. Onder Debian volstaat iets als apt-get install cervisia cvs om Cervisia te installeren. Raadpleeg de documentatie van jouw distributie als je er niet uit raakt. In dit artikel wordt gebruik gemaakt van CVS versie 2.1 en KDE 3.2.

In de omgang met een CVS-repository zijn dit de meest voorkomende handelingen:

De opties van Cervisia worden door de eigen configuratie bepaald, dus niet door het gebruikelijke bestand voor CVS-instellingen, ".cvsrc". Omdat de standaardinstellingen van Cervisia best zinvol zijn, hoeven we niets te configureren.

2 Een lokale repository opzetten (optioneel)

Als je lokaal werk wil verrichten dat ook maar een zekere graad van complexiteit in zich draagt, dan is het een goed idee om de mogelijkheden van CVS te benutten. Het aanmaken van een lokale repository is erg eenvoudig en er is weinig verschil tussen het werken met een lokale repository en het werken met een repository die je via een netwerk-protocol benadert: al je wijzigingen breng je aan in je werkmap en met een CVS-programma naar keuze werk je de stand van zaken bij en doe je aan committing alsof het via een netwerk ging. Om een lokale repository op te zetten in de persoonlijke map van gebruiker "bassie" en er een module voor je werk aan toe te voegen, bijvoorbeeld "bassie_adriaan_afl3", geef je hetvolgende in (in een terminal zoals Konsole):

mkdir /home/bassie/repository
cvs -d /home/bassie/repository init
mkdir /home/bassie/repository/bassie_adriaan_afl3

Fijn! Je hebt nu een lokale CVS-repository onder /home/bassie/repository.

3 De locatie van de repository opsporen en het ophalen van bestanden instellen

Er zijn meerdere manieren om een CVS-repository te benaderen. Het kan gaan om een lokale repository waartoe je toegang hebt via een paswoord (:pserver:), andere toegangsmogelijkheden zijn secure shell (:ext:) en kerberos-authentificatie (:kserver:) om er maar enkele te noemen. Deze handleiding beslaat lokale repositories en repositories die met een paswoord beveiligd zijn. Voor andere toegangsmethoden raadpleeg je best de documentatie van CVS. De opmaak van de locatie van een repository ziet er zo uit:

[:methode:][[gebruiker][:paswoord]@]computernaam[:[poortnummer]]/pad/naar/repository

Je hebt niet altijd al die informatie nodig (gebruiker, paswoord, computernaam, poortnummer). Als je bijvoorbeeld, zoals in het voorbeeld hierboven, een lokale CVS-repository opgezet hebt, dan is de naam van de repository eenvoudigweg het pad dat erheen leidt (in het voorbeeld dus /home/bassie/repository).

Het is gebruikelijk dat OSS-projecten anonieme toegang tot hun broncode via CVS voorzien. Zo kan je eenvoudig de meest recente broncode binnenhalen zonder eerst een CVS-account te moeten aanvragen. Anonieme CVS maakt gebruik van paswoorden. Wil je beginnen werken met een project dat op die manier toegang aanbiedt, dan zoek je best naar de details op de homepage van dat project.

We zullen zien dat je niet noodzakelijk een CVS-account nodig hebt om bij te dragen aan je favoriete project. Met anonieme CVS kan je je werkmap wijzigen, een bestand met wijzigingen aanmaken (een diff- of patch-bestand) en dat bestand naar het project verzenden. Zodra je rol binnen het project echter vaste vorm begint aan te nemen als artiest, schrijver van documentatie, vertaler, webmaster of eender wat, dan kan het zinvol worden om een CVS-account te vragen.

In wat volgt zullen we de hoofd-repository van KDE's anonieme CVS gebruiken in de voorbeelden. Vervang de voorbeelden vooral met de locatie die je gekozen hebt. Als dat een locatie is met pserver om bestanden op te halen, dan moet je inloggen met een gebruikersnaam en een paswoord. In het geval van anonieme CVS kan je gewoon de entertoets gebruiken als je om een paswoord wordt gevraagd. Dat alles is trouwens maar één keer per locatie nodig, omdat de CVS-paswoorden voor later gebruik opgeslagen worden in het bestand .cvspass in je persoonlijke map. Mocht je, tot slot, gebruik maken van een lokale repository, dan hoef je uiteraard niet eens in te loggen.

Cervisia kan meerdere locaties opslaan voor afzonderlijke repositories.

Repositories toevoegen...

4 Checkout: broncode ophalen

Eenmaal je de locatie van je repository opgegeven hebt, wordt het tijd om de informatie van die repository op te halen en er werkmappen mee te vullen. De hoofdmappen op een CVS-server noemen we modules. Cervisia haalt de lijst van modules voor je op. Soms heb je meer dan één module nodig om een bepaalde taak uit te voeren; in die gevallen zal je dus meerdere keren een checkout moeten doen. Ben je niet zeker welke modules je nodig hebt, vis dan eerst uit hoe het precies zit (via de webpagina's van het project in kwestie).

Verder zou je op voorhand de naam moeten weten van de branch die je nodig hebt. De standaardinstelling van Cervisia (en van CVS op de CLI) zorgt ervoor dat dat de hoofdbranch (de meest recente branch dus) uitgecheckt wordt. Die branch wordt meestal HEAD genoemd. De branch waarop je werkmap zich baseert noem je BASE; uiteraard kan BASE hetzelfde zijn als HEAD. De bedoeling van branches (vertakkingen) is dat een module op verschillende manieren ontwikkeld kan worden. Een mooi voorbeeld uit het werkelijke leven is de vrijgave van een software-project. Na een belangrijke release bevat de programmacode tal van bugs die opgelost moeten worden. Tegelijkertijd willen medewerkers natuurlijk nieuwe mogelijkheden toevoegen aan het programma, waardoor er weer nieuwe bugs de kop opsteken. CVS maakt het mogelijk om de ontwikkeling van het programma op te splitsen (ook wel forken genoemd): er wordt dan een extra branch aangemaakt voor de stabiele release. Bugfixes gaan vervolgens naar beide branches, nieuwe features enkel naar HEAD.

Om een module uit te checken ga je als volgt te werk:

Uitchecken...

Nadat je de module met succes uitgecheckt hebt, bevindt de locatie van de repository zich in je werkmap, zodat interactie tussen de werkmap en de repository in de toekomst wat vlotter zal verlopen. Je moet immers niet telkens opnieuw de locatie opgeven van een module die je al een keer uitgecheckt hebt.

5 De werkmap bijwerken

Zodra je in je werkmap een kopie van de inhoud van de repository hebt, zorgt het "update"-commando ervoor dat die kopie gesynchroniseerd wordt: de stukken die gewijzigd zijn worden dan lokaal bijgewerkt, zodat je kopie weer up-to-date is met de huidige stand van zaken in de repository.

Je kan je werkmap trouwens bijwerken naar eender welke branch, tag of datum, zelfs van een experimentele versie naar een stabiele. Stel bijvoorbeeld dat je een release candidate van KDE 3.2 aan het testen was tijdens een feature freeze (dus een tijdstip waarop geen nieuwe mogelijkheden meer geïntroduceerd werden), door gebruik te maken van de HEAD-branch. In januari 2004 werd de KDE_3_2_BRANCH gecreëerd, zodat HEAD weer opengesteld werd voor verdere ontwikkeling. Om KDE 3.2 verder te testen zou je in zo'n geval moeten updaten naar KDE_3_2_BRANCH, anders zou je immers aan de slag gaan met de ontwikkelingsversie van KDE. Op een later moment zou je hoe dan ook kunnen terugkeren naar de HEAD-branch -- daarin schuilt net de kracht van CVS!

Cervisia noemt je werkmap "sandbox". Om een module (je werkmap) bij te werken, volg je deze stappen:

Bijwerken...

Je weet intussen wel wat branches zijn, en ook het bijwerken naar een bepaalde datum spreekt voor zich. Je kan echter ook updaten naar een tag. Tags zijn markeringen die aangebracht worden voor een specifieke versie van de repository, zoals een release. Wil je dus exact dezelfde code als een bepaalde release, dan kan je bijwerken naar de bijbehorende release-tag.

6 Uitvoer tijdens het bijwerken; de status van bestanden

Of je nu CVS als commando gebruikt of via Cervisia, tijdens het bijwerken van je werkmap zal je meldingen zien van datgene waar CVS precies mee bezig is. Je krijgt ook bijgewerkte informatie over de status van elk bestand. In Cervisia kan je die uitvoer voor alle commando's (dus niet enkel tijdens het bijwerken) in het onderste deel van het hoofdvenster zien.

P: libmedia.cpp
U: process.h
M: README
C: same_dialog.ui
?: TODO
A: new_dialog.ui
R: old_dialog.ui

De betekenis van de letters aan het begin:

Als je enkel de uitvoer van het CVS-commando ter beschikking hebt, kan het moeilijk zijn om in een oogopslag de status van bestanden te overzien. Cervisia toont de dingen wat gebruiksvriendelijker: de status van bestanden wordt in het hoofdvenster geïntegreerd. Ofschoon het programma de status van de bestanden automatisch nakijkt bij elke update, kan je onder het menu Bestand het item Status gebruiken (of gewoon "F5" drukken) om de status van bestanden te weten te komen zonder de werkmap te moeten bijwerken.

Bestanden kunnen als volgt ingedeeld worden, afhankelijk van de verschillen tussen de werkmap en de repository:

Status van bestanden...

7 Patches aanmaken, verschillen bekijken en patches toepassen in je werkmap

Patches aanmaken

Je hoeft geen CVS-account te bezitten voor een bepaald project, om ertoe te kunnen bijdragen. Je kan bijvoorbeeld patches aanmaken tegenover de repository. Een patch bevat de verschillen tussen twee bestanden of tussen een groep van bestanden, in een standaard-formaat dat het anderen mogelijk maakt de patch toe te passen op hun werkmap, zodat hun bestanden de wijzigingen bevatten.

Geef je patch een degelijke naam, waaruit de wijzigingen en de naam van de originele bestanden duidelijk worden. Stel bijvoorbeeld dat je een tekstbestand uit de repository nagekeken hebt. Een goede naam voor de patch zou dan bestandsnaam_nagelezen.diff zijn, waarbij "bestandsnaam" natuurlijk de naam van het originele bestand is. Het is gebruikelijk om de tekst die je gewijzigd hebt na te kijken en de wijzigingen te testen, alvorens je een patch verzendt.

Er wordt één bestand met verschillen opgesteld voor alle wijzigingen in de werkmap. Het opstellen van de verschillen gebeurt dus recursief: je kan één enkele patch aanmaken voor alle veranderingen die je hebt gemaakt tegenover de repository.

Meer moet dat niet zijn!

Verschillen bekijken

Cervisia heeft een ingebouwde functie om verschillen aanschouwelijk te maken.

Verschillen bekijken...

Patches toepassen in je werkmap

Stel dat je een bug hebt gemeld. De ontwikkelaar van het programma zou je een patch kunnen bezorgen met de vraag om na te kijken of het je probleem oplost. Je zal dus die patch moeten toepassen en het programma opnieuw moeten compileren om het te kunnen testen. Om de patch toe te passen op een bestand of een groep bestanden kan je het commando "patch" gebruiken ("patch" maakt deel uit van de GNU diffutils). Om er zeker van te zijn dat alles goed verloopt, pas je de patch toe op het juiste doel: een map (en alle submappen en bestanden die erin zitten) of een bestand. Ben je niet zeker wat de bedoeling van de patch is, open het patch-bestand dan in een teksteditor. Ergens aan het begin van het bestand staat normaalgezien wat het doelbestand van de patch is. Je kan ook het programma "Kompare" uit het pakket kdesdk gebruiken. Pas je patch toe als volgt:

# begeef je eerst naar de map die het doelbestand bevat
cd /pad/naar/doelbestand/of/map
patch <patchbestand

Normaalgezien vertelt de uitvoer van het patch-commando je of alles goed verlopen is. Meer informatie vind je in de documentatie van patch (man patch of info patch).

8 Conflicten oplossen

Een conflict doet zich voor wanneer een andere ontwikkelaar enkele wijzigingen doorvoerde aan een bestand waar je zelf net mee bezig was. Je zal het bestand moeten aanpassen om de wijzigingen op een zinvolle manier toe te brengen.

CVS duidt de conflicterende aanpassingen op deze manier:

<<<<<<<
wijzigingen in je werkmap
=======
wijzigingen in de repository
>>>>>>> revisie_nummer

Je moet dit hele blok vervangen door de nieuwe versie. Daarna kan je een commit doorvoeren of een patch aanmaken tegen de repository.

Gelukkig heeft Cervisia een handige interface aan boord voor de omgang met conflicten. Dat wil niet zeggen dat je nooit manueel bestanden zal moeten aanpassen, maar je hoeft dat tenminste niet meer te doen voor het wegwerken van eerder triviale conflicten.

Conflicten oplossen...

Merk op dat bovenstaande afbeelding geen conflicten bevat; de knoppen zijn dus niet beschikbaar.

9 Committing: bestanden en mappen wijzigen, toevoegen en verwijderen

Wijzigingen aanbrengen aan de repository

In CVS-jargon betekent een commit dat je bepaalde veranderingen aan je werkmap doorvoert naar de repository. Om dat te doen voor een repository via een netwerk, heb je een CVS-account nodig, en de betrokken modules zal je met die account moeten ophalen. Anonieme CVS staat geen commits toe. Het is ten zeerste aan te bevelen om de richtlijnen voor ontwikkelaars van het project in kwestie te raadplegen alvorens je een commit uitvoert. Het KDE-project heeft bijvoorbeeld een FAQ-sectie voor ontwikkelaars en een pagina over de regels omtrent commits die je wordt verondersteld in acht te houden.

Om een bestand of een groep bestanden te committen doorloop je de volgende stappen:

Een commit toebrengen...

Bestanden verwijderen uit en toevoegen aan de repository

CVS beschouwt bepaalde bestanden pas als een onderdeel van de werkmap nadat je het expliciet zegt dat het dat moet doen. Dat is een slimme aanpak, omdat er een breed gamma aan automatisch gegenereerde bestanden bestaat, zoals backups, binaire bestanden als resultaat van een compilatie enzovoort. Geen van die bestanden moet samen met de broncode ge-upload worden, omdat het nu eenmaal om eenvoudig genereerbare afgeleiden gaat. Ga er bijvoorbeeld even van uit dat je een nieuw bestand in je werkmap hebt gecreëerd (of naar je werkmap hebt gekopieerd): eerst moet je het toevoegen aan de lijst van bestanden die CVS niet mag negeren. Daarna kan je het bestand vastleggen (commit). Op dezelfde manier moet je een bestand niet enkel verwijderen als je het ook uit de repository wil verwijderen, omdat CVS het dan bij de volgende update gewoon opnieuw aanmaakt! Nadat je het bestand lokaal verwijderd hebt, vertel je CVS dus dat het ook uit de repository verwijderd moet worden; dat zal dan gebeuren bij je eerstvolgende commit.

Onthoud ook vooral dat CVS ontworpen is voor de omgang met tekstbestanden. Vele mogelijkheden, zoals het samenvoegen van herzieningen, het overzichtelijk weergeven van verschillen enzovoort, zijn enkel mogelijk met tekstbestanden. Dat betekent niet dat je CVS niet kan gebruiken voor het beheren van binaire bestanden, het impliceert echter wel dat je CVS moet duidelijk maken dat het om een binair bestand gaat (anders kan je bestand gecorrumpeerd worden).

Ga als volgt tewerk om bestanden in een module (een werkmap) aan de repository toe te voegen:

Bestanden	toevoegen...

Bestanden verwijderen verloopt vrijwel identiek:

10 Besluit

Zoals je intussen hopelijk gemerkt hebt, valt het werken met CVS best wel mee. Er zijn paar minder intuïtief bevattelijke concepten, zoals de verschillende behandeling van tekstbestanden en binaire bestanden of het moeten doormaken van twee stappen om bestanden te verwijderen en toe te voegen, maar daar blijft het ook bij.

Cervisia maakt het geheel nog eenvoudiger, met een mooie interface voor het uitchecken van bestanden, het aanschouwen van verschillen, het oplossen van conflicten en het nagaan van de status van bestanden in de werkmap.

De auteur dankt Gary Cramblitt, auteur van "Building the KDE Source Newbie Guide", voor zijn bijdragen en Christian Loose, die Cervisia onderhoudt, voor zijn verbeteringen.

11 Licenties en verdiensten

De originele, Engelstalige versie van dit artikel verscheen op OSNews.com, meerbepaald op 20 februari 2004. Het artikel is van de hand van Carlos Leonhard Woelz; je kan hem bereiken op carloswoelz@NOSPAM.imap-mail.com.

Carlos Leonhard Woelz is een sponsor van Quanta Plus. Hij houdt zich bezig met het KDE Quality Team, dat ernaar streeft het kwaliteitsniveau van KDE-applicaties te verbeteren door de drempels te verlagen tussen potentiële ontwikkelaars en het daadwerkelijke ontwikkelen.

Tot nader order vind je het origineel van dit artikel terug op http://www.osnews.com/story.php?news_id=6096.

Over deze site | Laatst gewijzigd: $Date: 2005/04/24 18:27:05 $ door: $Author: tijmen $