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