O foarte scurtă introducere în lumea cârligelor git

Sau a hooks.

Cu cât lucrez mai mult cu unele unelte, cu atât parcă vreau să optimizez sau să automatizez anumite operațiuni. Una din aceste operațiuni este închiderea bug-urilor. Da, știu că tu nu scrii cod cu bug-uri, dar acest articol nu este pentru tine!

Ai nevoie de un issue tracker ce pune la dispoziție un API care permite… well, închiderea bug-urilor. Eu folosesc – așa cum am zis și aicigitlab. Între timp, aplicația a evoluat foarte mult, transformându-se încet, încet dintr-un tool ce îți permite să faci un user și un repository cu câteva click-uri într-un adevărat project manager. Folosesc Gitlab pentru:

  1. Hosting Git;
  2. Deploy la cod pe serverele clienților;
  3. Issue tracker;
  4. Scris documentație – este foarte cool să faci o pagină nouă iar când clientul nu înțelege ceva, să-i dai pur și simplu un link;
  5. Mai nou, pentru code review.

De asemenea, clientul are tot timpul acces la surse, vede ce s-a schimbat, cât cod s-a scris și evităm situații stupide de genul „ia ultima versiune de pe ftp”.

Așa, revenind la cârlige. Cam toate VCS dispun de aceste hooks, ce acționează în diverse stadii ale activității tale. De exemplu, ai hooks pentru update, commit, pre-commit, update șamd. Acestea pot fi configurate să facă orice. De la nimic absolut – implicit – până la rulat teste automate și… închis bug-uri!

Acum nu știu cum ești tu, dar eu, atunci când am un issue tracker pentru un proiect, urăsc să scriu încă o dată descrierea problemei. Prin urmare, dacă am un bug ce sună cam așa:

Issue #239 - Imaginile sunt aliniate gresit în pagina _asta_ pe IE5.5

Mesajul de commit nu va fi:

am aliniat imaginile în pagina _asta_ pe IE5.5

ci doar

close #239

Dacă este nevoie de detalii suplimentare, le adaug pe un rând nou.

Eh, toată treaba asta m-a făcut să mă gândesc la următoarea chestie: ce-ar fi dacă s-ar și închide bug-uri când există astfel de „cuvinte cheie” în mesajul de commit? Prin urmare, am pus cap la cap următoarea poveste:

#!/bin/sh

PRIVATE_TOKEN=`git config --get issue_tracker.token`
ISSUE_TRACKER=`git config --get issue_tracker.url`

URL=`git config --get remote.origin.url`
PROJECT=`basename ${URL} .git | cut -d':' -f2`

bugfix=$(git log -1 HEAD --pretty=format:%s | grep -i -e "[(close)] #[0-9]\+" | cut -d'#' -f2)

if [ "${bugfix}" != "" ] && [ ${bugfix} > 0 ]
  then
    curl -# -X PUT -d "closed=1" ${GITLAB_URL}api/v2/projects/${PROJECT}/issues/${bugfix}/?private_token=${PRIVATE_TOKEN} -o /dev/null
fi

Șmecheria asta se pune:

  1. Fie în fișierul .git/hooks/post-commit din proiectul curent,
  2. Fie în fișierul GIT_INSTALL_DIR/share/git-core/templates/hooks/post-commit pentru a putea fi folosit de fiecare dată. (evident, schimbi GIT_INSTALL_DIR cu locația corespunzătoare. Dacă alegi această cale, nu uita să copiezi fișierul post-commit în directorul .git/hooks din proiectul curent!

După ce faci asta, mai ai de parcurs doi pași:

git config --global issue_tracker.token "MwyX2D8fZw7awhVtTVNj"
git config --global issue_tracker.url "http://issue-tracker.domain.com"

Asta va asigura autentificarea automată la orice proiect, fără să-ți fie teamă că ți se fură token-ul.

Un proiect cu un issue tracker diferit?

Așa cum am zis, folosesc gitlab (pe un vps de la mxhost). Am convins un client să folosească și el gitlab. Pe server propriu, evident. Problema care apare acum este că fiecare server are un alt token. Nu trebuie decât să actualizezi informațiile de mai sus, dar doar pentru proiectul curent:

git config issue_tracker.token "uhabWwVX7my$3W"
git config issue_tracker.url "http://another-issue-tracker.domain.com"

Cum funcționează?

Este important ca mesajul de commit să conțină pe prima linie un text ce urmează pattern-ul: close #XXX, unde XXX este un număr.

Nu folosesc gitlab!

Atunci ești pe cont propriu! Caută în documentația bug tracker-ului tău și actualizează scriptul de mai sus. Dacă găsești soluții pentru alte bug trackere, nu ezita să lași un comentariu!

Ți-a plăcut articolul? Lasă un comentariu!

You can insert code snippets using BBcode:
[js].[/js] [html].[/html] [php].[/php] [css].[/css]
You can also use some HTML tags:
<blockquote>.</blockquote> <code>.</code> <a href="">.</a> <strong>.</strong> <em>.</em>