Utilisation des patch dans SVN
Avec SVN, pour reporter les modifications d'une branche vers une autre. Il existe plusieurs méthodes :
- La commande merge fournie avec SVN (Méthode recommandée): Cette méthode ne s'applique que si les fichiers modifiés sont connecté au référentiel SVN, mais ce moyen est le plus simple.
- Méthode utilisant l'IDE eclipse : Elle présente des avantage pour la représentation de changes. Contrairement à ce que l'on pourrait croire, il s'agit rarement de la méthode la plus simple, en effet le fourmillement d'options sur une GUI entraine une certaine confusion.
- Méthode basée sur les fichiers de patch : cette méthode utilise le standard udiff et peux s'appliquer sur des fichiers n'étant pas connectés au référentiel de source. Cette méthode n'est pas automatique mais elle est souple.
Pour illustrer un report nous allons utiliser l'exemple d'un report d'une correction de bug sur la branche en maintenance (lot 1) vers la branche en cours de développement (lot 2), la branche lot 2 est en cours de développement, c'est donc le tronc.
De The French Hack |
Cette opération s'effectue en 5 temps :
- Récuppération du numéro de révision
- Checkout de la branche sur laquelle le report est effectué
- Report des modifications et fusion
- Résolution des conflits
- Commit
Méthode en ligne de commande utilisant subversion (Méthode recommandée)
La première opération consiste à repèrer dans l'historique la version à partir de laquelle nous souhaitons effectuer le report. Nous pouvons nous baser sur les dates de modifications, les commentaires, les dates de création de branches... tou ce qu'on veut !
bash> svn log -r{20100401}:HEAD http://svnserver/my-product/developpement/branches/my-module-dao-lot1Récuppération du numéro de révision
Problème des droits acces
------------------------------------------------------------------------
r3389 | zegugusse | 2010-04-28 12:15:38 +0200 (mer, 28 avr 2010) | 1 line
Le montant des couts pour que les valeurs jusqu'a 9 999 999 999 puissent etre stockées et non arrondies
------------------------------------------------------------------------
r3390 | zegugusse | 2010-04-29 09:25:29 +0200 (jeu, 29 avr 2010) | 1 line
Problème des droits
------------------------------------------------------------------------
r3394 | zegugusse | 2010-05-04 09:12:01 +0200 (mar, 04 mai 2010) | 2 lines
------------------------------------------------------------------------
r3394 | ungusse | 2010-05-04 09:12:01 +0200 (mar, 04 mai 2010) | 2 lines
Création des branches lot2
------------------------------------------------------------------------
r3397 | ungusse | 2010-05-04 09:12:33 +0200 (mar, 04 mai 2010) | 1 line
------------------------------------------------------------------------
r3528 | ungusse | 2010-05-26 12:09:30 +0200 (mer, 26 mai 2010) | 2 lines
Ajout des codes d'erreur
------------------------------------------------------------------------
r3574 | lotrgusse | 2010-06-01 15:25:34 +0200 (mar, 01 jun 2010) | 1 line
Ajout du libellé long . Change D76.
------------------------------------------------------------------------
r3577 | zegugusse | 2010-06-01 16:09:25 +0200 (mar, 01 jun 2010) | 1 line
Defect Client D58
------------------------------------------------------------------------
r3579 | lotrgusse | 2010-06-01 17:35:41 +0200 (mar, 01 jun 2010) | 1 line
Modification du comportement de l'écran de sélection des cibles.
------------------------------------------------------------------------
r3583 | zegugusse | 2010-06-02 12:22:50 +0200 (mer, 02 jun 2010) | 1 line
Defect Client D58
------------------------------------------------------------------------
Checkout de la branche sur laquelle le report est effectué
svn co http://svnserver/my-product/developpement/branches/my-module-branch my-module-dao-trunk-workcopy
Report des modifications et fusion
Maintenant, nous allons reporter les changements intervenu sur la branche my-module-branch entre les versions 1000 et la HEAD
svn merge -r1000:HEAD http://svnserver/my-product/developpement/branches/my-module-dao-lot1 my-module-dao-trunk-workcopy
- Le premier paramètre (http://svnserver/my-product/developpement/branches/my-module-dao-lot1) indique la branche d'ou est effectué le rapport
- Le second paramètre (my-module-trunk-workcopy) est le chemin du repertoire sur lequel le report est appliqué
Voici le résultat :
[hudson@vm01 ~]$ svn merge -r2650:HEAD http://svnserver/my-product/developpement/branches/my-module-dao-lot1 my-module-dao-trunk/
U my-module-dao-trunk-workcopy/src/sql/data/load-ref-dev.bat
U my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/service/common/impl/UtilisateurServiceImpl.java
C my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/dao/BuildingSecondaireDAO.java
U my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/business/projet/impl/ProjetBusinessImpl.java
G my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/business/objectif/impl/ObjectifBusinessImpl.java
C my-module-dao-trunk-workcopy/pom.xml
- U indique que nous avons procédé à un update
- G indique que nous avons procédé à une fusion sans conflit
- C indique un conflit
Ensuite nous pouvons observer le resultat à l'aide de la commande : svn st
[hudson@vm01 ~]$ svn st my-module-dao-trunk-workcopy
? my-module-dao-trunk-workcopy/pom.xml.fusion-gauche.r2650
? my-module-dao-trunk-workcopy/pom.xml.courant
? my-module-dao-trunk-workcopy/pom.xml.fusion-droit.r2862
M my-module-dao-trunk-workcopy/src/sql/data/load-ref-dev.bat
M my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/service/common/impl/UtilisateurServiceImpl.java
? my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/dao/BuildingSecondaireDAO.java.courant
? my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/dao/BuildingSecondaireDAO.java.fusion-droit.r2862
? my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/dao/BuildingSecondaireDAO.java.fusion-gauche.r2650
C my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/dao/BuildingSecondaireDAO.java
M my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/business/projet/impl/ProjetBusinessImpl.java
M my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/business/objectif/impl/ObjectifBusinessImpl.java
C my-module-dao-trunk-workcopy/pom.xml
- M indique que le fichier est modifié (Un check in est nécéssaire)
- C indique un conflit (Il est nécessaire résoudre)
Résolution des conflits
Avec un éditeur résoudre les conflit dans my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/dao/BuildingSecondaireDAO.java puis indiquer que le conflit est résolu
vi my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/dao/BuildingSecondaireDAO.java
svn resolved my-module-dao-trunk-workcopy/src/main/java/com/mycompany/jt/dao/BuildingSecondaireDAO.java
Commit
Pour finaliser, il faut commiter nos modifications
svn ci my-module-dao-trunk-workcopy/
Méthode se basant sur les fichiers de patch
Sous UNIX, une ligne de commande génère ces fichiers de patch :
svn diff http://svnserver.mycomp/my-product/developpement/trunk/my-project -rN:M
N est la version d'origine M est la version cible.
Pour appliquer ces patchs, se plaçer à la racine du projet à patcher, utiliser la commande :
patch -p0 >mypatchfile
où p est la profondeur
Méthode sur eclipse
Contrairement à ce que l'on pourrait croire, l'utilisation d'eclipse peut être plus difficile que celle de la ligne de commande.
Se placer sur la branche sur laquelle on souhaite effectuer les reports.- Choisir l'ensemble des révisions à reporter. Autrement, l'option starts from copy reporte l'ensemble des modification depuis la création de la branche (ce qui peut n'être pas adéquat dans le cas où la branche à subi plusieurs recopies)
- Preview permet de voir quelle sont les révision concernées :