Open Source im professionellen Einsatz

Auf Bewährtes zurückgreifen

Findet das Helferlein allerdings nichts Passendes, springt dummerweise auch der Default-Mechanismus nicht mehr an. Das ist unschön, falls der User »git add« tippt und darauf hofft, dass die Shell naheliegende Dateien vorschlägt, was sie aber nicht tut, da »github-helper« (Listing 3) für diesen Fall nichts parat hat. Dies behebt die Option »-o default«, die auf den Ergänzungsmechanismus der Shell zurückgreift, falls der Helfer nichts anbietet. Das Kommando

complete -C github-helper -o default git

in der Datei ».bashrc« behebt das Problem. Wer zudem möchte, dass die Bash eventuell per [3] definierte Ergänzungen vorher berücksichtigt, fügt noch »-o bash­default« hinzu. Ruft der User das Programm mit vollem Pfad, also mit »/usr/bin/git« auf, sucht die Shell zunächst nach einem Complete-Eintrag für den vollen Pfad und fällt, falls keiner zu finden ist, auf den Programmnamen zurück, also auf »git«. Der oben generierte Eintrag funktioniert also in beiden Fällen.

Ruft ein unwissender User das Skript ohne die gesetzte Environment-Variable »COMP_LINE« auf, bricht es ab, indem es mit dem CPAN-Modul Pod::Usage und dessen Funktion »pod2usage()« seine unten anhängende POD-Dokumentation ausgibt. Zeile 19 bricht den bisher eingegebenen Kommandozeilenstring in maximal drei Teile, die durch Leerzeichen voneinander getrennt sind.

Falls das Git-Subkommando nicht »clone« ist (sondern zum Beispiel »git add«), beendet sich das Skript ohne jegliche Ausgabe in Zeile 26, um dem Complete-Mechanismus mitzuteilen, dass es nichts beizutragen hat und statt seiner etwaige anderweitig definierte Complete-Funktionen zum Zuge kommen sollen. Zeile 29 prüft, ob der User sich tatsächlich beim Tippen des Arguments an einer Position nach dem Wort »clone « (mit Leerzeichen) befindet oder ob der Cursor nicht etwa direkt hinter »clone« (ohne Leerzeichen) steht.

Damit die Shell nach »git clone « (mit abschließendem Leerzeichen) - ohne mit dem Github-Server Kontakt aufzunehmen - auf einen [Tab]-Druck hin sofort »git@github.com/mschilli« schreibt, greift das Skript in Zeile 38 zu einem Trick: Es gibt zwei Pseudo-Repositories

git@github.com/mschilli/1
git@github.com/mschilli/2

aus und die Shell führt sofort eine Teilergänzung bis zum größten gemeinsamen Nenner durch, wie in der zweiten Zeile von Abbildung 3 zu sehen. Folgen weitere zwei Tabs, ist der User tatsächlich an den Remote-Repos auf dem Server interessiert und Zeile 44 ruft »remote_repos()« auf.

Abbildung 3: Hier ergänzt das Helferskript die Namen von Git-Repositories.

Abbildung 3: Hier ergänzt das Helferskript die Namen von Git-Repositories.

Nachfrage beim Web-API von Github

Um die einem bestimmten Github-User gehörenden Repositories aufzuspüren, setzt das Skript in der Funktion »remote_repos()« ab Zeile 56 einen Request an das Web-API des Github-Servers ab. Dies geht ganz ohne Anmeldung und mit einer sehr intuitiven Schnittstelle, die wahlweise XML- oder JSON-Daten zurückschickt.

Mit dem CPAN-Modul XML::Simple und seiner exportierten Funktion »XMLin()« nimmt »github-helper« den zurückkommenden XML-Strom entgegen und wandelt ihn in eine Perl-Datenstruktur um. Unter »repositories->repository« findet sich darin ein Hash, dessen Keys aus den Namen der Repositories des Users bestehen. Perls »keys()«-Funktion liefert sie als Liste zurück und die For-Schleife ab Zeile 73 stopft sie in ein Array »@repos«, das die Funktion am Ende ans aufrufende Programm zurückgibt.

Das dritte Kommando in Abbildung 3 zeigt, wie beim Tippen des Clone-Befehls durch einen Doppeldruck auf die [Tab]-Taste plötzlich alle verfügbaren Repositorypfade zur Auswahl stehen. Gibt der User, wie in der letzten Zeile sichtbar, zwei weitere Buchstaben ein, die die Selektion eindeutig machen, komplettiert die Shell auf einen einfachen [Tab]-Druck hin das Ergebnis, der User braucht nur noch [Enter] zu drücken.

Das If-Statement ab Zeile 49 in Listing 3 prüft für jedes gefundene Repository, ob es bis zur Länge des bislang eingegebenen Strings mit der User-Eingabe übereinstimmt. Trifft dies zu, so druckt das »print()«-Kommando in Zeile 51 den vollen Repository-String gefolgt von einem Newline-Zeichen auf der Standardausgabe des Skripts aus, wo ihn an- schließend der Komplettiermechanismus aufschnappt.

Glücklicherweise enthalten Repositorynamen keine speziellen Zeichen, die die Shell irritieren könnten. Andernfalls müsste eine Escapefunktion alle Ergebnisse vor der Ausgabe Shell-sicher machen. Enthält ein Treffer zum Beispiel ein Leer- oder ein Dollarzeichen, sollte das Helferskript » « oder »$« zurückliefern, damit die Shell das Zeichen nicht interpretiert und den Ergänzungsmechanismus durcheinanderbringt.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook