Changes between Initial Version and Version 1 of Documentatie/Ontwikkelaar/Omgeving/Tools


Ignore:
Timestamp:
01/15/12 15:16:04 (14 years ago)
Author:
adriaan
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Documentatie/Ontwikkelaar/Omgeving/Tools

    v1 v1  
     1= Source Control Tools = 
     2 
     3OpenAC wordt ontwikkeld en onderhouden in een [http://subversion.apache.org/ Subversion] repository. 
     4Subversion is de standaard manier om met die repository om te gaan, maar het is ook mogelijk om 
     5met andere versiebeheer programma's aan OpenAC te werken. 
     6 
     7== Subversion == 
     8 
     9'''TODO:''' 
     10Subversion configuratie en best practices. 
     11 
     12== Mercurial == 
     13 
     14[http://mercurial.selenic.com/ Mercurial] is een zogeheten ''gedistribueerd'' versiebeheersysteem. Dat betekent 
     15dat de gehele source en geschiedenis lokaal wordt opgeslagen en lokaal wordt bewerkt. Elke gebruiker heeft 
     16zijn of haar eigen kopie van de hele geschiedenis, en het is aan de gebruikers om vervolgens hun lokale wijzigingen 
     17met elkaar te delen. 
     18 
     19Het voordeel van zo'n gedistribueerd systeem is dat ontwikkeling -- commits, probeersels, branches en soms ook 
     20reverts -- losgekoppeld zijn van het publiceren of delen van die stappen. Experimenten kunnen worden uitgevoerd  
     21zonder een centrale repository te "vervuilen." Daarnaast heeft iedere gebruiker een volledige geschiedenis van 
     22het project en is het dus mogelijk om grotendeels "offline" te werken -- een voordeel op reis of in de trein. 
     23 
     24Mercurial kan heel goed met Subversion repositories overweg als je een plugin installeert. Hierdoor kan je 
     25een branch van de Subversion repository als Mercurial repository importeren en bewerken, en doet {{hg push}} 
     26hetzelfde als {{svn commit}} voor alle nieuwe changesets in je lokale repository. De combinatie van mq en 
     27hgsubversion maakt het makkelijk om stapsgewijs te ontwikkelen en die geschiedenis te bewaren ook in de  
     28centrale Subversion repository terwijl je ook makkelijk dingen kunt terugdraaien als het nodig is. 
     29Je kan ook eigen patches -- bijvoorbeeld extra debugging dingen -- gemakkelijk prive houden terwijl je je 
     30gewone werk naar de centrale server publiceert. 
     31 
     32=== Installatie === 
     33 
     34Je hebt allereerst Mercurial zelf nodig, en de [http://mercurial.selenic.com/wiki/HgSubversion hgsubversion] extensie 
     35moet je apart installeren. Dat gaat het makkelijkst als je Mercurial al hebt. Ga naar je home directory, en 
     36clone dan de repo: 
     37   {{{ 
     38hg clone https://bitbucket.org/durin42/hgsubversion 
     39   }}} 
     40Daarna kan je -- als je de configuratie hieronder ongewijzigd wilt gebruiken -- de map {{{hgsubversion/hgsubversion}}} 
     41hernoemen naar {{{.hgsubversion}}} en daarna de clone weer weggooien. 
     42   {{{ 
     43mv hgsubversion/hgsubversion ~/.hgsubversion 
     44rm -rf hgsubversion 
     45   }}} 
     46 
     47Maak daarna de configuratie-files aan zoals hieronder omschreven bij [#hg.configuratie Configuratie]. 
     48 
     49=== Configuratie ===#hg.configuratie 
     50 
     51Er zijn twee extensies ''nodig'' om met Mercurial aan OpenAC te werken (''hgsubversion'' en ''rebase''), en twee ''aanbevolen'' (dat zijn ''graphlog'' en ''mq''). 
     52Daarnaast is het handig om Mercurial zo te configureren dat je een zinvolle username doorgeeft, 
     53de artefacten van Python ontwikkeling negeert, en logs produceert die een beetje overeenstemmen 
     54met Subversion zodat je makkelijk mee kunt praten over "revisie r1". 
     55 
     56Vanaf Mercurial v1.7 zijn ''rebase'', ''graphlog'' en ''mq'' allemaal onderdeel van de standaard Mercurial 
     57configuratie. De extensie [http://mercurial.selenic.com/wiki/HgSubversion hgsubversion] moet apart worden geinstalleerd. 
     58 
     59Subversion-achtige logs krijg je met een ''log template''. Maak een file {{{.hgstyle.svn}}} aan 
     60met de volgende inhoud; hiermee verwijs je naar een specifieke template file die in dezelfde directory staat. 
     61   {{{ 
     62changeset = .hgstyle.svn.template 
     63file = "     {file}\n" 
     64   }}} 
     65Maak ook een file {{{.hgstyle.svn.template}}} met de template zelf. 
     66   {{{ 
     67changeset:   r{svnrev} {rev}:{node} 
     68user:        {author} 
     69date:        {date|isodate} 
     70files:  {files|stringify|tabindent} 
     71        {desc|fill68|tabindent} 
     72 
     73   }}} 
     74Let op spaties in dit template. Hiermee wordt een mengeling van de Subversion en Mercurial logs afgedrukt. 
     75Bij elke changeset krijg je de Subversion revision te zien (als het bestaat) zoals r1. Daarnaast de Mercurial 
     76changeset aanduiding met nummer en hash. Alle gewijzigde files worden afgedrukt als ware het de uitvoer van 
     77{{{svn log -v}}}, en de commit message wordt volledig afgedrukt, uitgelijnd naar 68 kolommen. 
     78 
     79Python ontwikkeling zet een boel compiled Python objects in de repository, en ontwikkeling met Mercurial 
     80kan veel patch artefacten opleveren, met {{{.orig}}} files en backups. Maak een bestand {{{.hgignore.python}}} 
     81met de volgende inhoud: 
     82   {{{ 
     83syntax: glob 
     84*.pyc 
     85*.pyo 
     86*.py~ 
     87*.py.orig 
     88*.py.rej 
     89*.py.bak 
     90   }}} 
     91 
     92Tot slot, moet je in de {{{.hg}}} directory van je clone repository een {{{hgrc}}} zetten die de nodige  
     93extensies aanzet en verwijst naar de ignore en templates files. Voeg dit '''toe''' aan de  
     94{{{hgrc}}} die er al staat, want er staat al (minstens) een {{{[path]}}} om de pull- en push-bestemming in te stellen. 
     95   {{{ 
     96[extensions] 
     97hgext.graphlog = 
     98mq = 
     99hgsubversion = ~/.hgsubversion 
     100rebase = 
     101 
     102[ui] 
     103username = Adriaan de Groot <a.degroot@fenac.nl> 
     104ignore.python = ~/.hgignore.python 
     105style = ~/.hgstyle.svn 
     106   }}} 
     107 
     108=== Clone === 
     109 
     110Als Mercurial eenmaal correct is geinstalleerd en geconfigureerd, kan je met 
     111{{{hg help svn}}} controleren of ''hgsubversion'' wel goed werkt. Daarna kan 
     112je de OpenAC repository clonen. Merk op dat je maar '''een branch''' tegelijk 
     113kunt clonen. Dat komt omdat de layout van de Subversion repository van OpenAC 
     114afwijkt van wat hgsubversion normaal aankan. Een branch is prima, dus je kan 
     115die releases clonen die je nodig hebt -- voorlopig is dat alleen v2.0: 
     116   {{{ 
     117hg clone svn+https://svn.openac.fenac.nl/release/v2.000 v2.000 
     118   }}} 
     119Dit kan '''lang duren''' terwijl Mercurial elke revisie van die branch (momenteel zo'n 800) 
     120ophaalt en vertaalt naar een lokale Mercurial changeset. Als het proces wordt afgebroken, 
     121dan kan het later hervat worden door in de {{{v2.000}}} directory een {{{hg pull}}} te doen. 
     122 
     123=== Workflow === 
     124 
     125Bij Mercurial zijn veel verschillende workflows mogelijk. Omdat changesets uiteindelijk in  
     126Subversion terecht moeten komen zijn '''branches en merges niet toegestaan''' op het moment dat je  
     127naar Subversion pusht. Uiteraard kan je lokale clones maken voor branchy development 
     128en dan relevante branches met cherry-picking weer in je Subversion clone laten verschijnen 
     129zonder branches of merges. 
     130 
     131Typische workflow ziet er zo uit (met ''mq''): 
     132 
     133 - Werk de clone bij vanaf de Subversion repository. 
     134     {{{ 
     135hg pull 
     136     }}} 
     137 - Besluit om aan feature ''X'' te gaan werken, of pak ticket ''N'' aan. Begin een serie 
     138   patches om dat te doen. 
     139     {{{ 
     140hg qnew -m "Begin feature X" feature-X 
     141     }}} 
     142 - Breng veranderingen aan, besluit dat dit een redelijke stap vooruit is. 
     143     {{{ 
     144hg qref 
     145     }}} 
     146 - Ondertussen kan je nieuwe commits uit de centrale repository overhalen met {{{hg pull}}}. Die komen 
     147   niet in dezelfde branch als de patches waar je nu mee bezig bent, dus die hebben geen effect tenzij je 
     148   een rebase doet van je patches. Maar je kan wel zien wat er verder gebeurt en ook diffs bekijken of 
     149   eventjes bijwerken om te kijken wat voor effect je veranderingen hebben. 
     150 - Als je een nieuwe patch aan wilt maken, bijvoorbeeld omdat je een afzonderlijke stap in de 
     151   ontwikkeling van je feature wilt zetten of omdat je tussendoor een bug wilt fixen, gebruik je  
     152   {{{hg qnew}}} met een nieuwe patch-naam. 
     153 - Na verloop van tijd denk je "dit kan naar de repository". Dan haal je eventjes al je patches weg, 
     154   werk je helemaal bij vanaf subversion, zet je de patches terug (hier kunnen conflicten optreden, maar 
     155   je hebt de individuele patches om mee te werken en kan met de hand mergen), en push je de 
     156   patches naar de repo. 
     157     {{{ 
     158hg qpop -a 
     159hg pull -u 
     160hg qpush -a 
     161hg qfin -a 
     162hg push 
     163     }}} 
     164 - Met de tools van ''mq'' kan je je patches zo ordenen dat je evt. ook zinvolle sub-branches of delen  
     165   van je werk kunt pushen. Hierdoor kan je bijvoorbeeld bug-fixes die je halverwege het ontwikkelen  
     166   doet, naar voren halen in je lokale geschiedenis en dan pushen zonder dat je feature werk beinvloed wordt. 
     167 
     168== Git == 
     169 
     170'''TODO:''' 
     171Geen van ons heeft git echt uitgeprobeerd.