Visual Sourcesafe Integration in Foxpro
Iets wat eigenlijk al heel lang kan in Foxpro is de integratie met Visual Sourcesafe. Voor mensen die al lang met Visual Sourcesafe werken, zal dit artikel misschien dan ook niet zo veel nieuws brengen. Uit de vele aanvragen die we krijgen voor trainingen over dit onderwerp blijkt echter dat er nog steeds bedrijven zijn die nog niet goed weten hoe ze nu het beste kunnen omgaan met de combinatie.
Terwijl ik dit artikel schrijf is er een beta beschikbaar van een nieuwe Sourcesafe versie. Overigens wordt bij de release van deze nieuwe versie aangeraden om voor grotere ontwikkelteams te kijken naar Visual Studio Team Foundation, onderdeel van Visual Studio 2005 Team System. Voor meer informatie kijk je op http://lab.msdn.microsoft.com/vs2005/get/default.aspx#vss.
Dit artikel heeft nog betrekking op het ‘oude’ Sourcesafe, maar de manier van integratie in Foxpro zal niet anders zijn.
Visual Sourcesafe is een file-based client-server database voor het opslaan en delen van allerlei bestanden
Introductie
Visual Sourcesafe is een file-based client-server database voor het opslaan en delen van allerlei bestanden, dus niet persé alleen source-code. Je kunt b.v ook je Word-documenten in Sourcesafe zetten.
Dat het “file-based” is heeft voor- en nadelen. Een voordeel is dat je eenvoudig de database kunt oppakken en deze in een andere directory (of computer) kunt plaatsen. Een nadeel is dat het kwetsbaar is, dus lang niet zo betrouwbaar als b.v. een SQL Server database.
Er zijn overigens andere version control systems die wel met een SQL Server database werken maar dat valt buiten de scope van dit artikel.
Een version control systeem is eigenlijk een must voor ontwikkelaars, zeker in het geval van team-development. Het maakt het delen van bestanden tussen de ontwikkelaars veel eenvoudiger, je kunt makkelijk zien wie eigenaar is van een source-file, maar tevens zorg je zo voor een backup van de verschillende versies van je sources. Je kunt goed zien welke wijzigingen er in vorige versies zijn gemaakt, door jezelf of door een ander teamlid.
Hoe gebruik je Sourcesafe ?
Er zijn twee mogelijkheden om Sourcesafe te gebruiken: via de Sourcesafe Explorer, zeg maar de cliënt-tool van Sourcesafe, of via Visual Foxpro, geïntegreerd in de IDE. Dit artikel gaat met name over de laatste mogelijkheid, maar dit neemt niet weg dat ik even kort enkele aspecten opnoem die nodig zijn om op de juiste manier met Sourcesafe om te gaan.
De werkwijze via Sourcesafe is dat iedere programmeur zijn eigen lokale directories met sources heeft. In de Sourcesafe database wordt een kopie van de laatste versie bijgehouden. Deze kopie kun je b.v. via “Get Latest Version” naar je eigen lokale schijf halen, zodat je eigen omgeving weer ‘in sync’ loopt met die van je collega’s. Zodra je klaar bent met een wijziging aan een (source)file (program, class, menu, report, etc), kopieer je deze naar de Sourcesafe database door middel van een Check-In.
Je hoeft ook niet noodzakelijk altijd in verbinding te staan met Sourcesafe. Het kan zijn dat je, voordat je ’s avonds naar huis gaat, een bestand uitcheckt op je notebook, dit ’s avonds aanpast en ’s morgen op kantoor het bestand weer incheckt. Natuurlijk kun je remote via een VPN verbinding ook gebruik maken van Sourcesafe, maar houd er rekening mee dat dat traag kan gaan. Sourcesafe blinkt niet echt uit in snelheid.
Aanmaken database
Het handigste is natuurlijk om de Sourcesafe database aan te maken op een file-server, zodat je teamleden bij de database kunnen. Je kunt Sourcesafe echter ook stand-alone, d.w.z. alleen voor jezelf, gebruiken, en dan heb je nog steeds het voordeel van versiebeheer en backups van je sources. In het laatste geval kun je natuurlijk de database ook op je lokale computer aanmaken.
Als je SourceSafe hebt geïnstalleerd, moet je via de admin-tool een database aanmaken. De admin-tool kun je ook gebruiken voor het uitdelen van rechten op de database. Je kunt per project de rechten instellen. Let er overigens op dat standaard de admin-user geen wachtwoord heeft. Dus stel dat eerst in voordat iemand anders dat voor je doet!
Begrippen
Voordat ik inga op de integratie, volgen hier eerst enkele begrippen:
| Check out |
Haal de laatste versie op van een specifieke source en markeer in de Sourcesafe database dat jij nu de eigenaar bent van deze source. In theorie kunnen anderen nu niet aan deze source komen. Zet het source-file read/write op je lokale schijf. |
| Check in |
Kopieer je eigen lokale versie naar de Sourcesafe database waardoor deze versie de laatste versie wordt. Dit kan alleen als je eerst het source-file “uitgechecked” had. Zet het lokale file read-only. |
| Get latest version |
Haal de laatste versie op van een specifieke source, maar markeer nu niet dat jij de eigenaar bent. Laat het lokale file op read-only staan. |
| Undo check out
|
Vervang het eerder uitgecheckte file met de laatste versie uit Sourcesafe; hierdoor worden jouw wijzigingen ongedaan gemaakt. De eigenaarmarkering is dan verwijderd in de database. Het lokale file weer read-only. |
| Set working folder |
Geef aan welke locatie op je lokale schrijf overeenkomt met het Sourcesafe project. |
Tabel 1: Enkele SourceSafe begrippen
Configureer Foxpro
Als je in Foxpro gebruik wilt maken van Sourcesafe, zul je dit eerst moeten instellen.
Ga naar het Tools-menu kies voor Options en vervolgens het tabblad Projects.
Kies hier Visual Sourcesafe als de active source control provider (zie figuur 1).
Mocht Sourcesafe niet als optie beschikbaar zijn, dan heb je vermoedelijk Sourcesafe niet op deze lokale machine geïnstalleerd. Dat is naast een eventuele server installatie noodzakelijk.
Je ziet overigens in figuur 1 dat er nog meer zaken in te stellen zijn, maar dat laat ik nu even buiten beschouwing.

Fig. 1: Tools – Options – Project
Add project to SourceSafe
Als het project nog niet aan Sourcesafe is toegevoegd, moet je dat eerst doen voordat het project onder source-control werkt.
Open hiervoor je project en kies in het Foxpro – Project menu voor “Add Project to Sourcecontrol”. Vervolgens zie je een scherm waar je moet inloggen in de Souresafe database. Gebruik de usernaam en het wachtwoord zoals je dat via de admin-tool ingesteld hebt. Als er niet standaard een database is geselecteerd, kies dan via browse de directory waar de gewenste Sourcesafe database staat. Je moet het SRCSAFE.INI file in deze directory aanwijzen.
Vervolgens kom je in een scherm waarin je m.b.v. een treeview kunt kiezen waar je wilt dat je project binnen de Sourcesafe database wordt opgeslagen. Dit is te vergelijken met een directory structuur, denk dan ook even goed na over de indeling hiervan.
Join Source Control Project
Als een project door jezelf of door een teamlid is toegevoegd, moeten de andere teamleden “joinen” in dit project om gezamenlijk via Sourcesafe te werken. Hiervoor is het niet nodig dat op deze computer al de sources van dit project staan.
In het file menu van Foxpro is er een menuoptie bijgekomen met de naam “Join Source Control Project”. Kies deze, log in in de juiste Sourcesafe database en selecteer de Sourcesafe directory waar het project te vinden is. In het “Join Source Control Project” schermpje wat nu te zien is, moet je in de rechter listbox het Foxpro project-file selecteren. Dat is een file met de extensie “PJM”, maar daarover later meer. Druk op Ok, en waarschijnlijk krijg je nu de vraag of je door wilt gaan met uitchecken, aangezien het project-file reeds uitgechecked is. Beantwoord de vraag met “YES”. Als dit niet lukt, kan het zijn dat je de optie “Allow Multiple Checkout” niet aan hebt staan in Sourcesafe. Deze instelling kun je wijzigen in de admin-tool van Sourcesafe.
Ready to go
Als bovenstaande stappen goed zijn verlopen, ben je klaar om van start te gaan. In de Project-manager kun je duidelijk zien of een bestand door een teamgenoot is uitgechecked. Daarmee weet je dus dat hij/zij op dat moment de eigenaar is van het source-file en dat je zelf geen wijzigingen kunt aanbrengen (zie figuur 2).

Fig. 2: Sourcesafe geïntegreerd in Fox
De tekentjes die voor het source-file in de Project-manager staan, geven aan wat de Sourcesafe status is. Een slotje betekent dan niemand het file heeft uitgechecked en dat jij dat kunt doen. Een poppetje geeft aan dat een ander het file ‘in bezit’ heeft en tenslotte is een rood vinkje ervoor om aan te geven dat je zelf het file hebt uitgechecked, je teamleden moeten nu van dit file afblijven.
Er zijn meerdere manieren om een bestand uit- of in te checken of andere Sourcecontrol functies aan te roepen, maar kijk om te beginnen eens naar het context-menu dat verschijnt als je op de rechtermuisknop drukt voor een source-file in je project.
Het is in de Options van Foxpro in te stellen of je wilt dat een source-file meteen wordt uitgechecked op het moment dat je op modify drukt. Bekijk even wat je de prettigste manier van werken vindt.
Update Project List
Een belangrijk aandachtspunt is de update project list. Foxpro heeft er voor gekozen om niet het project file zelf in Sourcesafe op te nemen. Dat zou zeker bij team ontwikkeling erg lastig zijn, omdat je bij elke toevoeging van een file aan je project de PJX file moet uitchecken etc.
Daarvoor in de plaats maakt Foxpro een PJM file voor je aan, dit is een platte tekst file die de inhoud van je project vertegenwoordigt. Zodra je een bestand toevoegt aan je project, wordt naast het updaten van je PJX file ook het PJM file gewijzigd. Als je nu wilt dat een team lid jouw wijzigingen van het project doorkrijgt, moet je zelf eerst een “Update project list” doen. Deze optie vind je onder het project/sourcecontrol menu. Als je die optie kiest probeert Foxpro je PJM file in Sourcesafe te zetten. Als iemand anders die al eerder gewijzigd heeft, zul je een schermpje krijgen waarin je de beide versies moet samenvoegen. Het kan ook zijn dat dit schermpje niet wordt getoond, in dat geval was er geen samenvoeging nodig.
Gelijktijdig met de update project list wordt een “get latest version” van alle files gedaan.
Vervolgens kan je collega ook een update project list doen, wat als gevolg heeft dat jullie beider projecten weer gelijk zijn.
Beyond the basics
Sources vergelijken
Je kunt ook eens kijken naar hoe eenvoudig het is om verschillen in versies van een source-file te bekijken. Klik daarvoor met de rechtermuis knop op een source-file en kies differences. Nu kun je het verschil zien tussen je lokale versie en de laatste versie in Sourcesafe
Of nog mooier, selecteer eerst “show history” en bepaal dan welke twee versies in Sourcesafe je wilt vergelijken en druk op “diff”.
Hoewel class-libraries, forms, etc, binaire bestanden zijn, biedt Foxpro je toch de gelegenheid om deze te vergelijken. Er worden namelijk door Foxpro zgn. . VCA-, .SCA-bestanden, etc., gegenereerd die je terug kunt vinden op je harde schijf. Dit zijn tekstbestanden die een weergave zijn van je form, class, etc. Deze tekstbestanden kun je wel makkelijk vergelijken.
Label Files
Files of hele projecten kunnen worden voorzien van een label, een tekst die informatie geeft over de versie, b.v. in de vorm van een versienummer. Als je een project een label geeft, krijgen alle files in dat project hetzelfde label. Labels zijn bijvoorbeeld erg handig om te gebruiken wanneer je afgeronde versie van je project hebt. Zo kun je zoeken op deze labels en als het moet kun je teruggrijpen naar alle sources van een (vorige) versie. Dit is overigens een functie die je moet uirvoeren vanuit de Sourcesafe Explorer. Klik via de Sourcesafe Explorer met de rechtermuis knop op een project (een project is in VSS ongeveer hetzelfde als een directory) en kies voor “label”.

Fig. 3: De Label-functie
Share / Branch
Gebruik de Share-optie van Sourcesafe om een link tussen een source-file en een project te maken. Zo kun je het bestand in meerdere projecten gebruiken. Dit kan bijvoorbeeld handig zijn voor de classes van een framework dat je gebruikt, of voor een procedure-file dat je in meerdere projecten gebruikt. Als je via het ene project het file update, zijn meteen alle projecten met dit file geupdate. Natuurlijk moeten alle projecten eerst een “Get Latest Version” doen, voordat het bestand ook fysiek in het andere project is bijgewerkt.
Branchen gebruik je om een share weer ongedaan te maken. Bij een share blijven de bestanden gewoon in de projecten staan, alleen de link is weg. Dus de files werken weer onafhankelijk van elkaar.
De Share-optie kun je via Foxpro vinden (Project menu->Source control) en vanzelfsprekend ook via de Sourcesafe Explorer.
Renamen van Files
Een bestand hernoemen kun je natuurlijk buiten Foxpro en Sourcesafe om doen, maar dan ben je wel meteen de historie kwijt. Het is dus aan te raden om dit via Foxpro te doen, gewoon rechtermuisknop op het bestand en vervolgens komt het in orde.
Pin Files
Wanneer je een gedeelde (shared) source wilt aanpassen die getest en goed bevonden is, dan wil je niet dat de andere projecten waarin je dit file gebruikt, worden beïnvloed. In dat geval kun je kiezen voor de pin-optie. Zodra je de tevreden bent met de wijzigingen in het bestand, kun je deze unpinnen en de laatste versie uit Sourcesafe halen. De pin- en unpin-functie vind je via de “show history” optie.
Rollback
Als je wilt teruggaan naar een eerder ingecheckt file, kun je kiezen voor de Rollback mogelijkheid. Let wel op dat je de history vanaf het punt waar je de rollback doet, kwijt bent. Als je dat liever niet wil, kun je een andere work-around kiezen: “GET” de oudere versie waar naartoe je wilt teruggaan en doe een checkout van het file (let op: kies daarbij voor de ‘don’t get local copy’ optie!). Sourcesafe zet een “vinkje” voor het file zodat het gewoon is alsof je de file hebt uitgechecked; alleen wordt in dit geval je lokale file niet overschreven en laat dit lokale file nu net die vorige versie zijn die je zojuist hebt “ge-get”.
Nu hoef je alleen nog maar weer een checkin te doen en je bent weer terug naar de gewenste eerdere versie.
Objectmodel
Tot slot meld ik dat SourceSafe een object model heeft, waardoor je alle SourceSafe acties kunt besturen vanuit bijvoorbeeld Foxpro.
Conclusie
In dit artikel heb ik getracht je op het spoor te zetten hoe je Soucesafe kunt integreren in Foxpro. Ik ben me ervan bewust dat ik op sommige plaatsen meer details had kunnen geven over bepaalde functies, schermpjes, etc., maar ik wilde de nadruk leggen op het laten passeren van zo veel mogelijk opties. De exacte details kom je dan vanzelf tegen.
Succes!