SVN (WebCie)

From A-Eskwiki
Revision as of 18:01, 5 January 2017 by Timb (Talk | contribs)

Jump to: navigation, search

SVN (Subversion) is het magische systeem waarmee we controle houden op wat er gebeurt met alle WebCie-code. Ieder WebCie-lid heeft een kopie (een checkout) van het volledige systeem staan op zijn eigen account (in de map ~/wwwdebug). Deze code bepaalt wat jij te zien krijgt in je browser als je naar je persoonlijke debugpagina gaat (lijkt op http://blabla.debug.a-eskwadraat.nl). Als je wijzigingen in deze code aanbrengt, veranderen dus alleen de pagina's op jouw persoonlijke debug-omgeving. Dat noemen we een sandbox, het zorgt er voor dat je rustig je code kan ontwikkelen zonder dat de rest van de WWW daar last van heeft. Bovendien is jouw debugpagina alleen benaderbaar door WebCie-leden, dus als je per ongeluk lekkende SQL-queries schrijft is dat geen ramp.

Op deze pagina staat basale info om aan de slag te gaan met SVN.

svn up

Met svn up zorg je ervoor dat je locale versie geupdate wordt met alle wijzigingen die de rest van de WebCie heeft aangebracht. Doe dit dus altijd voordat je begint met hekken, anders wijzig je misschien dingen die al door anderen gewijzigd zijn en bestaat de kans op collisions!

Typische output van een svn update:

[otto@nikola]~/wwwdebug$ svn up
U    www/WhosWho4/Controllers/Activiteiten.php
U    www/WhosWho4/Activiteit.view.php
U    www/WhosWho4/Deelnemer.cls.php
U    www/WhosWho4/Lid.view.php

Fetching external item into 'libdb'
External at revision 75.


Fetching external item into 'gettext/voc'
External at revision 153.

At revision 12329.

svn st

Met svn st vraag je de huidige status op van jouw lokale kopie.

[otto@nikola]~/wwwdebug$ svn st
X       libdb
    S   gettext
X       gettext/voc
    S   www
M       www/WhosWho4/Activiteit.view.php
M       www/javascript/Activiteit/Wijzig.js
    S   lib
    S   scripts
M       scripts/script-init.php
    S   docs

Performing status on external item at 'libdb'

Performing status on external item at 'gettext/voc'

Je ziet een lijstje met wijzigingen. Je kan de items met een X of een S ervoor negeren, evenals scripts/script-init.php.

We concluderen dat de bestanden www/WhosWho4/Activiteit.view.php en www/javascript/Activiteit/Wijzig.js gewijzigd zijn.

svn diff

Met svn diff bekijk je alle wijzigingen die er zijn tussen jouw lokale kopie en de huidige revisie. Gebruik svn diff bestand1 bestand2 ... om de wijzigingen van een of meer bestanden te bekijken.

Met plusjes en minnetjes wordt er weergegeven welke regels weggehaald zijn en welke er bij zijn gekomen.

svn ci

Als je tevreden bent met de wijzigingen die svn diff je voorgeschoteld hebt, kan je je werk committen met svn ci. Ook hier kan je weer losse bestanden mee pakken door die erachter te zetten zoals bij diff. Je komt dan in nano terecht, en er staat welke bestanden je op het punt staat te committen.

Schrijf een duidelijke omschrijving van wat jouw commit bewerkstelligd, anders wordt de rest van de WebCie boos! Vervolgens ram je op Ctrl-X en Y, en hopla jouw wijzigingen worden opgenomen in het centrale systeem. Als jouw collega's svn uppen krijgen ze dus jouw code!

Overig

  1. svn add bestand - gebruik dit als je een volledig nieuw bestand hebt gemaakt. Nu wordt deze ook meegenomen bij je svn status, diffs en commits!
  2. svn revert bestand - als je een chaos van een bestand hebt gemaakt, reset je hem hiermee weer naar de versie zoals die centraal geadministreerd stond.

Collisions

Als je dit ziet, ben je de sjaak:

[otto@nikola]~/wwwdebug$ svn up
U    www/WhosWho4/Controllers/Activiteiten.php
U    www/WhosWho4/Activiteit.view.php
U    www/WhosWho4/Deelnemer.cls.php
U    www/WhosWho4/Lid.view.php
U    www/WhosWho4/Contact.cls.php
Conflict discovered in 'www/WhosWho4/Persoon.view.php'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

Je hebt dan wijzigingen aangebracht in een bestand dat inmiddels door iemand anders is gewijzigd en gecommit, en deze wijziging botst met die van jouw. Wederom een reden om vaak svn up te doen!

Neem de tijd om even te kijken wat het probleem is (de commit van je collega staat in je mail), je kan expliciet het probleem zien door df (diff full) te typen.

Dan concludeer je meestal dat je collega gelijk heeft, en jouw wijziging genegeerd moet worden. Kies daarvoor tf (theirs-full). Je bestand wordt dan volledig geoverride, wat meestal de bedoeling is.

Schakel indien nodig een ervarener WebCie-er in.

Om iets live te zetten

Ten eerste: denk goed na of je dit echt wel wilt doen. Er kunnen nog wel eens gebruikers gaan klagen.

Ga naar de live vm met ssh vm-www en log in als WebCie met s webcie. De site staat in /srv/http/www/www, en je kunt gewoon een svn up doen om de live site up-to-date te maken met de SVN repo.

Geen wachtwoorden!

Uit een mail van een zekere Pepijn "neger" Overbeeke:

Goed nieuws! Minder wachtwoorden! Het is me eindelijk gelukt om authenticatie van de svn-repo te koppellen aan het systeem dus we hebben geen aparte wachtwoorden voor de svn meer nodig. Het is zelfs zo dat als je in de werkkamer bent ingelogd dat je dan helemaal geen wachtwoord meer nodig hebt om bij de svn te komen (dit betekent niet dat iedereen er zomaar bij kan). Dat komt vanwege kerberos tickets enzo. Overigens is de default fallback als je geen kerberosticket hebt je systeemaccount met systeemwachtwoord, maar met een kerberosticket is de svn wel een heel stuk sneller. Je kan altijd een nieuwe ticket krijgen door in de terminal 'kinit *account*' te doen (met natuurlijk als account je eigen accountnaam). Anyway, mochten er problemen mee zijn, laat het dan vooral aan me weten.

Hoe verhuis ik SVN naar Git?

In december 2016 heeft de WebCie besloten om over te stappen naar Git. Omdat dit nogal een klus is en meerdere dagen duurde, leek het me handig om voor mezelf ook meteen bij te houden wat er voor stappen nodig waren. Zie ook StackOverflow en iemands website.

Maak in je homedir een mapje waar alle tsjak in terechtkomt.

mkdir ~/svn2git

Eerst zoeken we alle committers uit zodat we die naar git kunnen vertalen.

cd ~/wwwdebug
git svn rebase
git shortlog -sn > ~/svn2git/committers.txt
cd ~/svn2git

(alternatief als je nog geen gitsvn-checkout hebt, maar werkt niet want er staan HEEL ERG VEEL dingen in SVN:

svn log --quiet https://svn.a-eskwadraat.nl/svn/www/ | grep '^r' | awk '{print $3}' | sort -u > committers.txt

Vertaal nu gebruikersnamen naar naam + emailadres (het formaat is gebruikersnaam = Naam <emailadres&rt;. Gebruik bijvoorbeeld dit vim-macro: |df→yiw$a = ^[pa <^[pa@a-eskwadraat.nl>^[j (waarbij staat voor tab en ^[ voor escape)

vim authors.txt

We gaan nu een schone kopie van de repo maken om daar verscheidene vertalingen op toe te passen. Dit duurt ongelofelijk lang want er staan HEEL ERG VEEL dingen in SVN:

git svn clone https://svn.a-eskwadraat.nl/svn/www/ --no-metadata -A authors.txt -t tags -b branches -T trunk wwwdebug >>fetch_log 2>>error_log

(Merk op dat we elke branch uitchecken en het op zijn minst lineair is in het totaal aantal wijzigingen in elke commit op elke branch, wat ook wel O(griezelig groot) heet.)

Je kan nu misschien de volgende errors krijgen (hiervoor hebben we de bestanden fetch_log en error_log want een paar duizend commits keer een paar duizend files scrolt meteen uit je terminalbuffer):

  • ontbrekende author: voeg die toe in authors.txt en git svn fetch >>fetch_log 2>>error_log verder
  • ontbrekende bestanden (absent_file en/of object not found in commit): Volgens het internet: doe git svn reset -r... tot de laatste commit die wel klopte en git svn fetch >>fetch_log 2>>error_log verder. Dit bleek niet te werken bij het fetchen van r15195 naar trunk, dus toen ben ik maar een bestaande git-svn checkout gaan bewerken.

Vraag een sysopper of die heel lief voor je wil zijn en de commithooks uit de svn-repository in ~/svn2git/hooks wil zetten. Liefst ook het script dat de WebCie een mail stuurt als een nieuwe commit is gepusht, op dit moment te vinden in /usr/share/subversion/hook-scripts/mailer/mailer.py

Tot hier ben ik tot nu toe gekomen

Nu gaan we nog wat restjes ledendata weghalen, want blijkbaar was het een ding vroeger om ledendata in je repo te zetten... Zie ook StackOverflow.

git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch www/whoswho_cprogs.old/' --prune-empty --tag-name-filter cat -- --all

(Check of het ook weg is in de obsolete branch, of mieter gewoon die hele branch weg!)

Zoek uit hoe je git commithooks installeert en krijg dat ook voor elkaar.