(D)VCS

Pourquoi utiliser un outil?

Quel outil utiliser?

Comment l'utiliser?

Quelques questions

Qui sait ce qu'est un (D)VCS?

Qui en a déjà utilisé?

Qui en utilise au quotidien?

Quel (D)VCS?

CVS, SVN, Git, Mercurial (HG), Bazaar (BZR), Darcs, Autres...

Y a-t-il un "Brian" dans la salle?

POURQUOI

Brian: Ouais mais bon, ok, ouais d'accord, mais bon, pourquoi?

#1: Le boss indécis

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

#1: Le boss indécis

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!

#1: Le boss indécis

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:

Je te montre un truc

anpe

La fausse bonne idée: le CPOLD

Pour reprendre le blog de Roland, le CPOLD à d’innombrables qualités:

La fausse bonne idée: le CPOLD

Voici en quoi consiste la mise en place du CPOLD:

$ cp fichier.py fichier.py.old

La fausse bonne idée: le CPOLD

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

#2: Le crash disque

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.

#2: Le crash disque

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:

Je te montre un truc

anpe

Solution?

La sauvegarde sur un serveur distant

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).

Solution?

Problèmes:

  1. Duplication inutile du code
  2. Durée de l'upload pour de gros projets

#3: Le code spaghetti

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:

Solution?

Les commentaires dans le code

...
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")
...

Solution?

Problèmes:

  1. Le code devient très vite illisible
  2. Très ardu de suivre les modifications successives en reconstituant l'historique
  3. 7 lignes pour un code qui ne devrait en prendre que 3

COMMENT

Brian (immense cri de désespoir): Mais comment m'en sortir sans que JR me montre un truc ?

images/pourquoi.jpg

Les VCS

Garder trace de l'évolution d'un projet

  1. QUI: l'auteur du changement
  2. QUAND: la date de ce changement
  3. QUOI: chaque ligne changée, de chaque fichier impacté
  4. POURQUOI: le message de "commit" explicatif renseigné par l'auteur
  5. VERSION: un "tag" optionnel (changeset) pour indiquer une release

Les VCS

Il est possible, entre autres, de:

  • lister les fichiers modifiés par un auteur
  • lister les changements apportés à un fichier
  • lister les modifications apportées depuis une date donnée
  • récuperer les fichiers du projet pour une version donnée
  • brancher un projet (sandboxing) puis merger

Les VCS

Les messages de commit

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...

Les VCS

Les messages de commit

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

Garder trace des changements

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:

  • économie de bande passante
  • économie de temps
  • économie d'espace de stockage

Les DVCS

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

Avantages des DVCS:

  • commit locaux
  • plus rapide
  • un serveur central optionnel, ET des sauvegardes sur chaque pc
  • facilité pour l'open-source
  • merge facile

Les DVCS

Le développement en équipe

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.

MERCURIAL

MERCURIAL

Initialiser un nouveau projet

$ hg init

MERCURIAL

Surveiller les changements

$ hg status
$ hg st

MERCURIAL

Ajouter des fichiers au repository

$ hg add monfichier.py monautrefichier.py

MERCURIAL

Commit les changements

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

MERCURIAL

Sauvegarder/uploader sur le serveur distant

$ hg push

MERCURIAL

Cloner/forker un projet

Si on veut travailler sur un projet existant, pas besoin d'initialiser un nouveau projet

$ hg clone http://bitbucket.org/magopian/pyconfr

MERCURIAL

Puis, pour récuperer les derniers changements

$ hg pull
$ hg pull -u

MERCURIAL

Pour appliquer les changements sur le projet initial, plusieurs solutions:

Bitbucket

Ne vous embetez pas à installer/configurer/maintenir/payer un serveur distant!

Liens / Des questions?