Schrijf een bash shell script repogen dat kan gebruikt worden om git repositories aan te maken, waarbij op een geautomatiseerde manier reeds een aantal commits worden uitgevoerd. Aan het shell script moet een bestandsnaam als argument doorgegeven worden. Daarnaast moet het shell script ook de volgende drie opties ondersteunen:
optie -c <int: default 3>: aantal commits met willekeurige commit messages (naast de vaste initiële commit) die automatisch moeten uitgevoerd worden
optie -b <string>: naam van de branch waarin de commits met de willekeurige commit messages moeten uitgevoerd worden
optie -m: gebruik deze optie om finaal de branch waarin de commits met de willekeurige commit messages werden uitgevoerd te mergen met de master branch
Het shell script moet voor de verwerking van de opties de flexibiliteit aan de dag leggen die gebruikelijk is bij Unix commando's: volgorde van opties speelt geen rol, opties kunnen eventueel samengenomen worden, …. Op basis van de gegeven opties en argumenten moet het shell script dan de volgende stappen automatiseren:
maak een nieuwe git repository aan met de naam die als argument aan het shell script werd doorgegeven
voer een initiële commit uit (met commit message initial commit) in de master branch, waarbij een leeg bestand (0 bytes) README.md aan de repository wordt toegevoegd
voer $$c \in \mathbb{N}_0$$ commits (waarbij $$c$$ overeenkomt met het verplichte argument dat werd opgegeven bij de optie -c, standaard 3) uit in de branch waarvan de naam overeenkomt met het verplichte argument dat werd opgegeven bij de optie -b (standaard in de master branch); hierbij moet de $$i$$-de commit ($$i = 1, 2, \ldots$$)
een willekeurige commit message $$m_i$$ gebruiken die wordt gegenereerd aan de hand van de web service met URL http://whatthecommit.com/index.txt (opmerking: als deze web service een commit message teruggeeft die bestaat uit meerdere regels, dan moet enkel de eerste regel gebruikt worden)
een regel toevoegen aan het bestand README.md die bestaat uit het volgnummer $$i$$, een afsluitend rond haakje, een spatie en de commit message $$m_i$$
merge de branch waarin de commits in stap 3 uitgevoerd werden met de master branch, indien een specifieke branch werd opgegeven met de optie -b en de optie -m werd opgegeven
Geen enkele van de git commando's die gebruikt worden om het uitvoeren van bovenstaande stappen te automatiseren mag uitvoer genereren (noch op stdout noch op stderr). Het shell script moet zelf de volgende foutafhandeling voorzien:
indien het shell script niet de gepaste opties meekrijgt (enkel ondersteuning voor de opties -c, -b en -m), een optieletter meerdere keren wordt meegegeven, de verplichte argumenten bij de opties worden verkeerd gebruikt, of er wordt niet één enkel argument meegegeven aan het shell script, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) naar stderr uitgeschreven worden, en moet het shell script eindigen met exit status 1
indien aan het shell script een bestandsnaam wordt doorgegeven die reeds bestaat, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) naar stderr uitgeschreven worden, en moet het shell script eindigen met exit status 2
Indien er zich geen fouten voordoen, dan moet het shell script eindigen met exit status 0.
Onderstaande voorbeeldsessie geeft aan hoe het shell script repogen moet kunnen gebruikt worden.
$ repogen repo01 $ echo $? 0 $ cd repo01; git log --oneline --decorate --graph --all; cd .. * ffb8bf8 (HEAD -> master) fix bug, for realz * ce3695b fixed mistaken bug * ef1c981 For great justice. * 7ad18b4 initial commit $ cat repo01/README.md 1) For great justice. 2) fixed mistaken bug 3) fix bug, for realz $ repogen -c5 repo02 $ cd repo02; git log --oneline --decorate --graph --all; cd .. * 1b5a2bc (HEAD -> master) added some filthy stuff * 80ea21f this is how we generate our shit. * 451835f This is supposed to crash * e16e601 omgsosorry * 9fd5801 pay no attention to the man behind the curtain * 3f52902 initial commit $ repogen -b develop repo03 $ cd repo03; git log --oneline --decorate --graph --all; cd .. * 78ad351 (HEAD -> develop) changes * 2658c9a By works, I meant 'doesnt work'. Works now.. * f844fa4 harharhar * 309726e (master) initial commit $ repogen -b develop -m repo04 $ cd repo04; git log --oneline --decorate --graph --all; cd .. * 68638ea (HEAD -> master, develop) Trust me, I'm an engineer!... What the f*ck did just happened here? * c17b2b4 this doesn't really make things faster, but I tried * 83a42cf For great justice. * 0a30c4d initial commit $ repogen Syntaxis: repogen [-b <string>] [-c <integer>] [-m] dirname $ echo $? 1 $ repogen repo01 repogen: bestandsnaam bestaat reeds $ echo $? 2