23 Novembre 2017

Les bonnes pratiques pour appliquer un fichier patch dans Drupal

Commentaires

Pour corriger des bugs, améliorer la performance ou ajouter des fonctionnalités, le patch est très utile et dans certains cas indispensable. Cependant, modifier le code n’est pas anodin, il faut respecter certaines règles de base pour garantir un code propre et éviter toute mésaventure ...

Pour corriger des bugs, améliorer la performance ou ajouter des fonctionnalités, le patch est très utile et dans certains cas indispensable. Cependant, modifier le code n’est pas anodin, il faut respecter certaines règles de base pour garantir un code propre et éviter toute mésaventure imminente comme l’apparition de nouveaux bugs ou de dysfonctionnements qui feraient perdre un temps crucial en développement. Dans ce post, nous vous présentons quelques règles pratiques à suivre pour patcher proprement dans Drupal.

Rappel : qu’est ce qu’un fichier patch ?

Un fichier patch (ou fichier correctif) est un fichier texte ayant une extension .patch qui inclut un ensemble de code formaté extrait à l’aide de la commande git diff  par exemple. L’utilisation d’un fichier patch permet de modifier le code du core, d’un module ou d’un thème pour corriger des bugs, optimiser la performance, modifier ou ajouter de nouvelles fonctionnalités. Les patchs facilitent le développement car au lieu de fournir un fichier de remplacement constitué éventuellement de milliers de lignes de code, le fichier patch inclut uniquement les modifications apportées. En effet, le fichier patch fournit la liste des modifications à un fichier, qui peut être utilisé pour recréer ces modifications sur une autre copie de ce fichier. 

Règles de base

Il existe plusieurs règles simples de base pour faciliter le processus du patching, notamment :

  • 1. Ne pas faire des patchs sur le site de production : sauf si vous avez une sauvegarde complète du site en production, il est déconseillé d’appliquer un patch directement sur le site en production étant donné qu’un patch peut entraîner la perte de données ou l’instabilité du site. Il est recommandé de télécharger une sauvegarde du site en production, d’en faire une seconde copie et de tester la seconde sauvegarde pour s’assurer que tout fonctionne comme prévu. Cela permet de tester les résultats du patch puis d’importer les modifications sur le site en production.
  • 2. L’organisation des patchs : pour favoriser la visibilité des modifications, il est recommandé de séparer chaque type de modification dans son propre patch. Qu'il s'agisse de corrections de bugs, d'optimisations de performance ou par exemple de corrections de style de code, chacun doit être dans un patch spécifique.
  • 3. Caractère de fin de ligne et les séparateurs de répertoire : sur Windows par exemple, il convient d’utiliser les caractères de fin de ligne Unix (LF) et les séparateurs de répertoires (/).

La procédure pour appliquer un fichier patch

Il existe plusieurs manières d’appliquer un fichier patch, que ce soit manuellement ou de manière automatique. Avant cela, il est important d’identifier le répertoire dans lequel vous vous trouvez actuellement. Généralement les fichiers patchs sont créés par rapport au répertoire racine du projet. Il peut s’agir du répertoire racine de Drupal lui-même ou d’un répertoire d’un module contribué.

1. Disposer d’une copie du site en production  et vérifier le répertoire d’installation
Comme mentionné plus haut, vous devez vous assurer d’appliquer le patch sur une copie du site en production, il peut s’agir d’un site en local ou d’un site sur un serveur de développement du site en production concerné.
Vous devez vérifier le répertoire d’installation. Ainsi, si vous patchez un code Drupal, vous devez, naviguer vers le répertoire Drupal à l’aide de la commande cd de votre terminal. Pareil pour un module ou un thème, vous devez naviguer vers le répertoire concerné.

2. Télécharger le fichier Patch
Pour appliquer le patch, le fichier patch doit être présent dans le projet. Pour cela, il faut naviguer vers le répertoire et télécharger le fichier patch qui vous intéresse directement depuis le terminal en utilisant les commandes (par exemple de linux) curl ou wget :

- curl -O <https://www.drupal.org/XXXX.patch>;
- wget -O <https://www.drupal.org/XXXX.patch>.

 

Le fichier à patcher peut être dans un sous-répertoire, cependant il faut veiller à garder le patch à la racine du projet.

3. Appliquer le patch
Il y a plusieurs commandes pour appliquer un patch. En fonction de l’environnement, vous pouvez choisir une des commandes suivantes :

  • Si vous utilisez Git pour appliquer un patch : vous pouvez appliquer la commande git apply <option><path/file.path. Vous pouvez vous aider des différentes options de la commande suivant la situation : -v permet de signaler la progression du patch avec des informations supplémentaires, --index permet de suivre les fichiers modifiés, et enfin -3 permet de faire un retour en arrière dans le cas où un patch est mal appliqué ou ne fonctionne pas. Pour aller plus loin voici la liste des options de patch dans Git.
  • Si vous n’utilisez pas Git : vous pouvez utiliser la commande patch -p1 < path/file.patch. Vous disposez d’options de commande comme : -p qui permet d’indiquer combien de répertoires revenir pour appliquer le patch et -p0 dans le cas où le patch ne fonctionne pas.
  • Si votre fichier patch se trouve dans le même répertoire que le fichier à patcher : il suffit d’appliquer la commande patch < fichier.patch.

La procédure pour inverser un patch

Un besoin d’inverser un patch appliqué peut se présenter :

  • Après avoir effectué des tests sur un patch particulier ;
  • Si le patch a introduit une cassure du code ;
  • Lors de la mise à jour vers une version, du même patch.

Il est possible d’inverser l’application des patchs en utilisant la même commande qui a servi à patcher une base de code, avec un argumentaire supplémentaire. Par exemple :

  • Depuis Git, pour inverser un patch il faut utiliser la commande git apply -R path/file.patch.
  • Depuis un environnement autre que Git, il suffira d’utiliser par exemple la commande patch -p1 -R < path/file.patch (si vous avez utilisé -p1 pour patcher).
Post magnifiquement synthétisé par @Myriam avec l'aide des interventions de @Rida et @Joseph. Photo : @chdugue