Figura: 1 / 26 12 maggio 2010
Cos è? è un sistema di controllo delle versioni (version control system). è un software open-source per ambienti Unix, Windows, OS-X. è lo strumento ideale per gestire il software sviluppato collegialmente. 2 / 26
Progetti che hanno usato Mozilla OpenOffice MoinMoin OpenJDK NetBeans 3 / 26
Features di Aggiornare il proprio software all ultima versione rilasciata dai collaboratori. Rilasciare la propria versione del software sotto forma di patch. Analizzare nel dettaglio la cronologia delle versioni, confrontando le modifiche effettuate, modulo per modulo. Ripristinare una versione precedente. Includere od escludere singoli moduli o cartelle dai meccanismi di aggiornamento e sincronizzazione. Lavorare in parallelo sullo stesso software, per poi convogliare le modifiche con una efficace gestione dei conflitti tra versioni. 4 / 26
Lo sviluppo collegiale del software prima dei version control systems Figura: Un tentativo poco efficiente di conservare le vecchie versioni. 5 / 26
L ambiente di lavoro Esistono interfacce utente per l utilizzo di : TortoiseHg (Windows), Murky e Mac (OS-X). Tuttavia, la maggior parte degli utenti usa direttamente da shell. 6 / 26
L ambiente di lavoro Ogni comando da shell comincia con hg. Informazioni sul comando: hg help [nome del comando] Disporre l help su più pagine: hg help [nome del comando] more 7 / 26
Creare un file di configurazione Il file di configurazione contiene la vostra firma personale, all interno del gruppo di lavoro. Si tratta di un file di testo ad estensione.hgrc, dove trascrivere (di default) il vostro nome e la mail. Quando rilasciate una versione od effettuate altre azioni, i dati nel file di configurazione compariranno alla voce user. Figura: 8 / 26
Creare il repository Il repository è l interfaccia tra il vostro ambiente di sviluppo personale e la versione globale del software (central repositoty), condivisa dagli altri collaboratori. Figura: 9 / 26
Creare il repository Nel concreto il repository consiste di una cartella nascosta, di nome.hg, nella quale verranno immagazzinate in automatico le informazioni di version control. Inizializzate il repository nel path desiderato (solitamente la radice della cartella di lavoro) con il comando init. Figura: 10 / 26
Aggiungere i moduli Il repository viene inizializzato come una cartella vuota. Il passo successivo è determinare quali moduli abbiamo intenzione di includere nel progetto condiviso. I moduli e le cartelle si aggiungono al progetto con add e si tolgono con forget. Possiamo visualizzare la situazione con il comando status. Le iniziali davanti ai moduli indicano i cambiamenti fatti: (A) - aggiunto; (R) - rimosso; (M) - modificato. Figura: 11 / 26
Aggiungere i moduli Esclusione di un modulo dal repository. Visualizzazione dello stato del repository. Figura: 12 / 26
Aggiungere i moduli I moduli inclusi nel repository saranno i soli che verranno posti in relazione con il lavoro di altri utenti. Quando importiamo una nuova versione del progetto, i moduli del nostro repository saranno gli unici ad essere aggiornati. Quando rilasciamo la nostra versione del software, i moduli del nostro repository vanno a costituire l aggiornamento per gli altri utenti. 13 / 26
Aggiungere i moduli Possiamo aggiungere o rimuovere moduli dal repository in qualsiasi momento. Precisiamo che si tratta di aggiunte e rimozioni virtuali. Ciò che si aggiunge o rimuove sono infatti i collegamenti ai moduli realmente presenti nella nostra cartella di lavoro. I comandi add e forget non cancellano fisicamente né spostano i moduli coinvolti. 14 / 26
Creare la prima versione Ipotizziamo ora di avere fatto alcune modifiche ai moduli del repository. Se rilasciassimo la nostra versione del software in questo momento, tali modifiche non sarebbero prese in considerazione. Per rendere le nostre modifiche effettive, è necessario eseguire un commit. 15 / 26
Figura: 16 / 26 Creare la prima versione Il comando commit fa diventare lo stato attuale del nostro software una nuova versione. All esecuzione del commit è buona norma specificare un messaggio che sintetizzi le innovazioni di questa versione del software - opzione -m. Con hg log possiamo visualizzare le versioni del software che sono state rilasciate. Tra queste ci sarà anche il risultato del nostro commit, con il nostro messaggio ed alla voce user i nostri dati personali.
Esportare la nuova versione - export Rese effettive le modifiche, è possibile raccoglierle in una patch ad uso dei nostri collaboratori. Il comando export ha un parametro -o che prende come primo argomento il nome che vogliamo dare alla patch (%h.patch perchè l hash diventi il nome della patch), come secondo argomento il numero della versione che vogliamo esportare. tip è il nickname dell ultima versione disponibile (the tip of the iceberg). Figura: 17 / 26
Esportare la nuova versione - archive export è ideale per uno scambio tra due sole persone, delle quali il destinatario già possiede la penultima versione del software, che necessita solo di essere aggiornato con le ultime modifiche. Con il comando archive è invece possibile esportare una qualsiasi versione nella sua interezza. I parametri -r e -t richiedono rispettivamente il numero di versione che vogliamo esportare ed il tipo di archivio di output (ad esempio tar o zip). Figura: 18 / 26
Importare la nuova versione Il comando import applica le modifiche contenute in una data patch alla nostra versione del software. Figura: 19 / 26
- diff hg diff: visualizza le modifiche apportate ad un certo modulo, rispetto all ultima versione sulla quale è stato eseguito un commit. Le righe aggiunte hanno un segno + davanti, quelle eliminate un segno -. 20 / 26
- diff Nell esempio, la modifica riguarda il nome della prima funzione, che era q ed ora è f. Come si può vedere nell esempio, un nuovo commit rende effettive le modifiche, dunque un ulteriore comando diff darà responso negativo: l ultima versione è diventata la versione modificata. Figura: 21 / 26
- cat hg cat: stampa a terminale il contenuto di un file (di default, si tratta dell ultima versione disponbile). Figura: 22 / 26
- cat Specificando il parametro opzionale -r viene visualizzata una certa versione del modulo. Figura: 23 / 26
- revert hg revert : ripristina l ultima versione rilasciata (parametro -r per specificare una diversa versione) di una certa cartella/modulo ( all per tutti i moduli del repository), cancellando le modifiche che abbiamo fatto nel frattempo. Nell esempio revert riporta indietro il modulo programma1.py alla versione che abbiamo visualizzato con cat, annullando le modifiche (non rese effettive con un commit) che avevamo fatto nel frattempo. Figura: 24 / 26
- identify; rollback hg identify : notifica quale è l hash della versione attuale del software (confrontare con hg log). hg rollback : ripristina la versione precedente (parametro -r per specificare una diversa versione) a quella attuale. Figura: 25 / 26
Links Sito ufficiale di - http://mercurial.selenic.com/ per esempi (libro in inglese) https://docs.google.com/viewer?url=http://jemander.se/byexample Tutorial di Joel Spolsky (in inglese) - http://hginit.com Tutorial (in italiano) - http://mercurial.selenic.com/wiki/italiantutorial 26 / 26