scripts voor repository management
Mijn manier van werken
Net als iedereen duid ik de zaken waar ik aan werk ook wel aan als "project".
Om zoveel mogelijk te profiteren van mijn dagelijkse ervaringen met de zaken die ik gemaakt heb laat ik de scripts / symlinks die ze starten wijzen naar de versie waar ik ook op ontwikkel. Dat geeft me onmiddellijke feedback over de dingen die ik aanpas. Ik noem dit wel mijn "working" omgeving.
Als ik tevreden ben - en dat omvat ook het uitgevoerd hebben van unittests - zet ik het spul over naar een repository waar ik in principe nooit aanpassingen in doe, zodat ik ook een stabiele versie op mijn systeem heb staan. Ik noem dit mijn "central" omgeving.
Van hier uit kan ik het spul tenslotte overzetten naar GitHub zodat ik ook een versie buiten mijn laptop heb opgeslagen, voor het geval dat. De benaming voor deze omgeving is "remote".
Periodiek alles in één keer controleren heeft mijn voorkeur omdat het me toch even de gelegenheid geeft om te bedenken of ik dingen die ik nog niet gecommit heb al wel wil committen of toch maar liever terugdraai en anders aanpak.
Wijzigingen controleren en doorzetten
Bij veel commando's kun je met optie -n een of meer namen van repositories meegeven. Indien meer, dan worden ze gescheiden door komma's zonder spaties erachter. Als je dit weglaat worden alle (actieve) repositories gebruikt om iets mee te doen.
Om in de gaten te houden hoe het staat met de wijzigingen die ik her en der aanbreng voer ik van tijd tot tijd de volgende functie uit:
binfab repo.check-local
Omdat ik die zo regelmatig uitvoer heb ik de aanroep verpakt in het iets makkelijker aan te roepen "repocheck". Deze taak loopt als mijn repositories langs om er git status in uit te voeren en bij te houden of er ongecommitte dan wel nog niet gepushede wijzigingen zijn geweest.
Het geeft als output een opsomming, bijvoorbeeld

Er wordt ook een bestand weggeschreven met wat meer details (feitelijk de output van "git log" en "git status"); dit kan bekeken worden met het commando
binfab repo.check-local-changes
Het wordt geopend in een tekst editor.
Ik heb een soortgelijke functie gemaakt voor het volgende stadium:
binfab repo.check-remote
die het bovenstaande doet voor mijn "centrale" repositories. Git legt gelukking van allerlei vast tijdens het pushen zodat ik niet allerlei informatie van Github hoef te halen. Toen ik dat nog niet wist (maar dat was ook in mijn Mercurial tijd) had ik daar zelf een mechanisme voor gemaakt met zogeheten "tip-files" die tijden het pushen naar remote werden bijgewerkt.
Check-local is doorgaans een soort verkenning waarna ik de ongecommitte zaken repo voor repo langsloop om te zien of ik hier wat aan in te halen heb; als ik hiermee klaar ben kan ik de wijzigingen doorzetten, bijvoorbeeld met
binfab repo.push-local [--exclude=<reponames>] [--include=<reponames>]
dit doet hetzelfde als "check-local" maar migreert tevens de gecommitte wijzigingen naar de volgende ("central") omgeving.
Omdat ik soms niet alles wil doorzetten kun je hierbij opgeven welke repo's je wel / alleen maar wilt migreren dan wel welke je niet wilt doen.
En ook deze heeft een variant die op de "central" omgeving werkt:
binfab repo.push-remote [--exclude=<reponames>] [--include=<reponames>]
Ik had ook ooit een variant "pushthru" gemaakt die push_local en push_remote achter elkaar deed maar ik bedacht dat die niet per se in deze collectie hoeft te bestaan; ze zitten wel samen in een script genaamd repopush dat ik uitvoer als ik tevreden ben over de stand van zaken na repocheck.
Ook ooit had ik een functie gemaakt om een gecondenseerd project historie bestand te maken, omdat ik iets met versies of tags wou doen:
binfab repo.overview --name=<reponame> [--outtype=<output-type>]
Een heleboel code voor geschreven wat uiteindelijk gecondenseerd kon worden door een variant van git log en eigenlijk overbodog omdat ik niks meer doe met versies.
Ontwikkel activiteiten
Om een aantal tools die ik vaak gebruik aan te kunnen roepen voor een gegeven repository heb ik wat functies gemaakt die controleren of ze dat kunnen doen en het dan uitvoeren. Hier heb ik vervolgens goed gebruik van gemaakt in mijn scripts voor session management.
Zo kan ik project notities bijhouden met
binfab repo.dtree --name=<reponame>
Een (groter dan standaard) terminal openen in de root directory van een gegeven project kan ik met
binfab repo.prshell --name=<reponame>
Eén of meer bestanden behorend bij een gegeven project openen met VI kan met
binfab repo.predit -p <project> <source> [-t]
Als <source> kan ik een bestandsnaam (pad ten opzichte van de project root bijvoorbeeld "src/main.py") opgeven maar ook een naam die bekend is in een van de project configuratiebestanden - in .sessionrc staat "progs" bijvoorbeeld voor alle programmabestanden van het project en in .rurc geven "main" en "qtgui" etc vaak specifieke modules aan. De toevoeging -t maakt het mogelijk om de bijbehorende unittests module op te zoeken.
Hetzelfde trucje heb ik ook toegepast voor mijn zoekprogramma (FileFindR); dat kan ik oproepen met
binfab repo.prfind -p <project> <source> [-t]
Om dingen te doen met het readme bestand van een project heb ik
binfab repo.preadme --name=<reponame>
om het te openen in een text editor, en
binfab repo.rreadme --name=<reponame>
om het te openen in een rst viewer.
Uitlijsten van de branches van één of meer projecten kan met
binfab repo.list-branches [<project-name-list>]
Dit is niet veel meer dan een wrapper rond git branch meen ik.
Voor alle projecten tesamen heb ik nog
binfab repo.mee-bezig
voor een soort overzichtsverzameling, bijvoorbeeld om in de gaten te houden voor welke projecten ik nog geen of niet genoeg unittests heb gemaakt
Daarnaast heb ik een paar taakjes voor het zoeken in alle projecten:
binfab repo.search-all --find=<search-term> [--rebuild] om te zoeken in alle getrackede project modules (kan ook met pfind -as <zoekterm>)
binfab repo.search-p --find=<search-term> [--rebuild] om te zoeken in alleen programma modules (kan ook met pfind -ps <zoekterm>)
binfab repo.search-t --find=<search-term> [--rebuild] om te zoeken in alleen test modules (kan ook met pfind -ts <zoekterm>) hetzelfde als search-all maar alleen in directories met testmodules
Unittesten
Ik had al een scriptje om unittests met een testcoverage overzicht uit te voeren. De volgende functie baseert zich op de .rurc configuratie in een project om te bepalen welke tests je wilt uitvoeren:
binfab repo.runtests --name=<reponame> [<test>]
Verder heb ik nog wat functies om statistieken op te hoesten:
- binfab repo.find-failing-tests
voer unitttests uit voor alle of gespecificeerde repo's en laat de tests zien die failen
- binfab repo.find-test-errors
voer unitttests uit voor alle of gespecificeerde repo's en laat de tests zien die fout gaan
- binfab repo.find-test-stats
voer unitttests uit voor alle of gespecificeerde repo's en laat de testcoverage zien
Overig
Tenslotte nog wat functies die met visualisatie van repo's te maken hebben:
- binfab repo.qgit --name=<reponame>
Open een Git gui voor een project. Misschien is dit een alternatief voor check-repo, moet ik nog eens rustig naar kijken.
- binfab repo.add2gitweb [--names=<reponames>] [--frozen]
taak om een repository op te voeren in de configuratie zodat deze bekeken kan worden met gitweb