10 juin 2007

Svn diff avec vimdiff

Category: UncategorizedRenaud @ 14h40

vimdiffSubversion, le logiciel de gestion de version, permet facilement de regarder les différences entre un fichier dans la working copy, c’est à dire en local et potentiellement modifiée par nos soins et son homologue dans le repository, c’est à dire sur le serveur et potentiellement modifié par une autre personne.

La commande suivante permet d’afficher les différences entre le fichier local monfichier.php et la révision en cours dans le repository de ce même fichier:

svn diff monfichier.php

Bien entendu, pour un petit fichier ou lorsqu’il y a peu de différence, le résultat est tout a fait lisible. Quelques lignes avec des « + » ou des « - » et on comprends bien ce qu’il y a de différent. En revanche, on ne sait pas trop le contexte de la modification et, surtout, lorsqu’il s’agit de gros fichiers ou lorsqu’il y a plusieurs différences, ça devient tout bonnement imbitable.

Heureusement, il est possible d’utiliser un programme tiers pour faire ce travail. Et vimdiff le fait très bien. Malheureusement svn diff envoi les paramètres dans un ordre que vimdiff ne comprends pas. Aussi, il nous faut passer par un petit script qui remet tout ça en ordre.

  1. Dans un fichier, où vous voulez, par exemple dans votre home si c’est uniquement pour vous, ou dans /usr/local/bin si c’est pour plusieurs personnes (dans le cadre d’un serveur de développement, par exemple), créez un fichier diffwithvim:
    
    #!/usr/bin/python
    import sys, os
    diffprogram = '/usr/bin/vimdiff'
    fn_old = sys.argv[6]
    fn_working_copy = sys.argv[7]
    # arrange the args in the order diffprogram expects them
    args = ['diffwithvim', '-d', fn_old, fn_working_copy]
    os.execv(diffprogram, args)
  2. Editez ~/.subversion/config
  3. Trouvez [helpers]
  4. Ajoutez la ligne suivante:
    
    diff-cmd = /usr/local/bin/diffwithvim

Maintenant, lorsque vous ferez un svn diff monfichier.php, vimdiff (qui n’est rien d’autre que vim) se lancera, coupé en 2 verticalement, vous pourrez voir les 2 versions de fichiers côte à côte et comprendre plus facilement les différences grâce aux couleurs de vimdiff.

Petite astuce: Pour quitter vimdiff, vous pouvez faire :q pour chacune des 2 versions de fichier ou bien :qa pour quitter les 2 en même temps.

Mots-clefs : , ,

13 Réponses à “Svn diff avec vimdiff”

  1. Asher256 a dit:

    Merci pour cette astuce !

    NB: ce n’est pas important, mais bon, je le précise quand même ^_^ tu as oublié d’ajouter un retour à la ligne entre python et import.

  2. Guy KPADJIK a dit:

    En effet, petit bug :)
    corrigé :)

  3. Encore un bug... a dit:

    Il fallait bien sûr lire « svn diff monfichier.php » et non « svn siff monfichier.php »

    Merci pour cette très utile astuce!

  4. Artis a dit:

    Tiens pas bête. Merci bien. ^^

  5. jbar a dit:

    pourquoi faire simple quand on peut faire compliquer ?
    – pour le point 1 : un simple script du genre
    $ cat ~/scripts/svnvimdiff

    #!/bin/bash
    vim -d « $6″ « $7″

    – ensuite sans toucher au fichier config de svn on peut appeler le script en faisant svn diff –diff-cmd ~/scripts/svnvimdiff. Personnellement je prefere mettre un colordiff -pruN dans le fichier config de svn.

    Enfin merci beaucoup pour l’astuce quand même (les paramètre à envoyer à vim…) , pour la suite une fois dans vim taper « :help diff » et faites vous des raccourcis pour diffput et diffget …

  6. Guy KPADJIK a dit:

    La version de jbar ne fonctionne pas du tout chez moi.

  7. jbar a dit:

    c’est le ~ qui ne marche pas à l’interieur de la commande svn : il vaut mieux le remplacer par $HOME :
    $ svn diff –diff-cmd « $HOME/scripts/svnvimdiff » monfichier
    (remarque le $HOME ne devrait aussi lui même pas marcher à l’intérieur du fichier de conf de subversion (à tester) : il vaudrait mieux le remplacer par un chemin complet si le script n’est pas dans le PATH ).

    ensuite dans le « script » pour faire plus joli un tout petit peu plus propre ou peut aussi faire tel quel :

    #!/bin/bash
    exec vim -d “$6″ “$7″

  8. Guy KPADJIK a dit:

    J’ai mis le path en entier et ca ne marchait pas non plus.

  9. jbar a dit:

    T’as pas oublié de faire un petit chmod +x sur le script ?

    Sinon je ne vois plus ce qui pourrait clocher… ( t’es pas sous windows quand même :-p ).

    En tout cas ca marche très bien pour moi.

    Ci-joint un extrait de mon fichier vimrc :


    syntax enable

    « les tabulations comme je les aime : equivalentes à 4 espaces
    set shiftwidth=4
    set softtabstop=4
    « ne pas utiliser le caractere special tab
    set expandtab

    « pour naviguer d’un buffer à l’autre
    nmap :w:bp
    nmap :w:bn
    nmap :bp!
    nmap :bn!

    « pour vimdiff
    map :diffget
    map
    :diffput

  10. jbar a dit:

    et zut j’ai oublié de proteger les \….

  11. jbar a dit:

    je vais y arriver … \\< ‘<’ < >

  12. jbar a dit:

    Donc mon extrait de fichier vimrc ( :| sed ‘ s/</\&lt;/g ; s/>/\&gt;/g ‘

    syntax enable

    « les tabulations comme je les aime : equivalentes à 4 espaces
    set shiftwidth=4
    set softtabstop=4
    « ne pas utiliser le caractere special tab
    set expandtab

    « pour naviguer dun buffer à lautre
    nmap <M-PageUp> :w<CR>:bp<CR>
    nmap <M-PageDown> :w<CR>:bn<CR>
    nmap <C-PageUp> :bp!<CR>
    nmap <C-PageDown> :bn!<CR>

    « pour vimdiff
    map <A-Left> :diffget<CR>
    map <A-Right> :diffput<CR>

  13. Guy KPADJIK a dit:

    Bon, finalement ca fonctionne… si ca se trouve, j’avais effectivement oublié de le mettre en exécutable…

    En revanche, j’ai du supprimer les guillemets autour de $6 et $7 et ca marche avec et sans exec

    du coup, ca donne:
    #!/bin/bash
    vim -d $6 $7

    pour ce qui est du mappage, je n’y arrive pas… mais je me demande si ca vient pas de putty, j’ai déjà des soucis avec le pavé numérique sur putty… ca m’étonnerait pas que les fleches posent soucis aussi.

    Merci beaucoup :)
    Je modifierais le billet plus tard.

Laisser une réponse