(D)VCS
Pourquoi utiliser un outil?
Quel outil utiliser?
Comment l'utiliser?
CVS, SVN, Git, Mercurial (HG), Bazaar (BZR), Darcs, Autres...
Brian: Ouais mais bon, ok, ouais d'accord, mais bon, pourquoi?
JR (le boss): Brian, il faut que quand le client se logue, il voie trois popup de pub!
Brian: Ca va me prendre une semaine, ça impacte pas mal de fichiers
Une semaine plus tard, le lendemain de la démonstration de la "feature" au boss
JR: Brian, ouais en fait, ma femme m'a dit que c'était trop pénible, enlève les popups!
Brian: pas de problème, ça va me prendre deux jours pour retrouver et annuler toutes les modifs, et tester pour être sûr de n'avoir rien cassé
JR: Deux jours pour annuler? Tu n'avais pas fait de sauvegarde? attends je te montre un truc:
Pour reprendre le blog de Roland, le CPOLD à d’innombrables qualités:
Voici en quoi consiste la mise en place du CPOLD:
$ cp fichier.py fichier.py.old
Et voici un exemple de mise en oeuvre du CPOLD:
foo_dev foo.py foo.py.old foo.py.old.2009_03_29 foo.py.marche_pas foo.py.todelete foo.py.OLD.2006_05_12 foo.py.bak foo.py.fonctionalite_bar foo.py.bug foo.py.save.20081210 foo.py.check foo.py.test foo_prod foo.py foo_savedev.tgz foo_save20090329_v2_0.tgz foo_save20080412_v1_2.tgz foo_save20060509_v1_0.tgz
Brian: Patron? J'ai un petit soucis, il semblerait que le disque dur de mon ordinateur vienne de lâcher...
JR: Et? en quoi ça me concerne? Prends en un nouveau dans la réserve, et retourne bosser.
Brian: Ah, euh, ok, je vais récuperer les sources du projet sur le serveur de production, par contre il va me falloir quelques jours pour rattraper le boulot perdu depuis la dernière release...
JR: Tu n'avais pas de sauvegardes? Attends, je te montre un truc:
Brian n'est pas bête, il va uploader régulièrement (toutes les heures? deux fois par jour?) ses modifications sur un serveur distant (CF l'exemple du CPOLD).
JR: Brian, ma femme vient de trouver un gros bug, je veux savoir depuis quand il existe, et surtout, à cause de qui! Dépèche-toi de trouver si tu veux pas que je te montre un truc
Brian à besoin de savoir qui fait quoi dans le code, vu qu'il travaille avec le neuveu du boss dont la spécialité est le "code spaghetti". Du coup, Brian a mis en place une méthode éprouvée:
... def bar(thing): # Added the 10th of june, 2006 -- Steven """This function is very usefull!""" # Brian: refactored 20080410 for release 1.2 #if thing == "bar": ### Steven: 11/06/07 fixed typo # (was 'thing = "bar"') # return True; return (thing == "bar") ...
Brian (immense cri de désespoir): Mais comment m'en sortir sans que JR me montre un truc ?
Il en va de la responsabilité de chaque développeur de fournir un message explicatif à chaque commit.
Celà aide grandement, entre autres, pour retrouver la source d'un bug, comprendre le contexte d'une modification...
MAUVAIS:
Modif du fichier foo.py
BON:
Feature 'popups': dynamically load popups' urls from the database
Chaque dévelopeur va commit ses changements sur le serveur.
Les VCS ne gardent trace que des changements. Donc si un dévelopeur modifie une ligne dans un fichier, c'est ce changement qui sera envoyé sur le serveur, et non la totalité du projet:
Evolution assez récente des VCS, qui sont basés sur une architecture décentralisée.
Chaque développeur possède sa propre copie des fichiers du projet, ce qui en fait d'autant plus de sauvegardes.
Les DVCS ont pour but principal, en plus des buts propres à tout VCS, de faciliter le fork.
Tout est basé sur cette notion de fork, chaque changement étant un fork potentiel: tout est donc fait pour faciliter le merge.
$ hg init
$ hg status $ hg st
$ hg add monfichier.py monautrefichier.py
Très régulièrement, en soignant les messages
$ hg commit monfichier.py monautrefichier.py $ hg commit
Ou
$ hg commit -A $ hg commit -m "Mon super message de commit" $ hg ci
$ hg push
Si on veut travailler sur un projet existant, pas besoin d'initialiser un nouveau projet
$ hg clone http://bitbucket.org/magopian/pyconfr
Puis, pour récuperer les derniers changements
$ hg pull $ hg pull -u
Pour appliquer les changements sur le projet initial, plusieurs solutions:
Ne vous embetez pas à installer/configurer/maintenir/payer un serveur distant!
http://betterexplained.com/articles/a-visual-guide-to-version-control/
http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/