Versionamento e git hooks
In questa pagina vorrei riassumere il metodo che uso per autogenerare un file con i dati della versione corrente del software. Il sistema si appoggia al software di versionamento git ed a GNU make. Utilizzo questo metodo prevalentemente per i miei firmware C/C++ per microcontrollore, ma gli stessi concetti possono essere adattati per altri software o flussi di progetto.
Cosa sono i git hooks?
Si tratta di una serie di script che vengono automaticamente lanciati da git quando si verificano eventi particolari
(i.e. un commit, un merge…) 1.
Gli script sono memorizzati nella directory .git/hooks
, quindi sono personalizzabili per ciascun repository locale.
Script personalizzato
Non appena git prende atto di un cambio di stato nella directory attuale, tutto quel che deve fare è aggiornare il file
di versione.
Nel caso di un progetto C/C++ predispongo una regola version
nel makefile, che si occupa di formattare
adeguatamente le stringhe nel file version.git.h
.
|
|
Questo codice va inserito nei file post-checkout
, post-commit
e post-merge
all’interno della suddetta cartella .git/hooks
.
I nomi sono abbastanza autoesplicativi riguardo alla loro funzione.
Sembra non essere contemplata l’azione di pull: in realtà viene invocato lo script relativo al merge in caso di fast-forward o, ovviamente, di merge automatico.
In caso di conflitti l’hook viene richiamato al termine della risoluzione manuale (i.e. quando si fa il commit, ed alla fine sempre di un merge si tratta) 2.
|
|
Preparare il Makefile
Segue come ho deciso di implementare la regola relativa alla versione nei miei makefile.
Per tenere traccia delle commit più rilevanti solitamente applico dei tag nella forma v.m
, con v (version) ed m (major) interi positivi, che metto in tripletta con il numero di commit effettuate dall’ultimo tag (minor).
Si trovano divesi spunti interessanti sul web 3.
Attenzione: git describe --long --dirty --tags
fallisce se non è presente alcun tag nella storia del repository.
|
|
Si nota che le varie informazioni sono inserite come macro, non tipizzate. Per poterne fruire ho sempre a portata di mano le macro di stringification 4, come in questo esempio.
|
|
Altri casi d’uso
$\LaTeX$
Se si usa un makefile per compilare documenti $\LaTeX$5, è sufficiente modificare lievemente la regola di cui sopra. Una strategia è quella di aggiungere comandi personalizzati che richiamino i valori di interesse. La scelta dei nomi dei comandi è arbitraria.
|
|
Infine, includere il file nel documento principale con \input{version.git.tex}
per poterli richiamare dove serve.
Python
Qui un makefile non c’è, quindi bisogna spostare tutta la regola all’interno degli script di hook. Il concetto però è sempre lo stesso: lo script recupera da git le informazioni di versione e le gira in un file formattato in accordo al linguaggio usato. In definitiva… quel che segue. Occhio a lanciarlo con bash, perché non tutte le shell supportano l’IFS6.
|
|