# Appliquer un patch

## Procédure simplifiée (Grande majorité des cas)

{% hint style="success" %}
Le service support :

* à lié à sa réponse un fichier patch (extension  **`patch`** ou **`diff`** )&#x20;
* vous a donné un lien vers ce même type de fichier&#x20;
  * exemple **`https://xxx/bug-fix.diff`&#x20;**&#x20;&#x20;
  * ou bien encore  **`https://xxx/bug-fix.patch`**
    {% endhint %}

### Placer le patch au bon endroit

Selon ou se situe le bug rencontré, le **patch** peut-être à destination du **cœur** ou d'un **plugin**. Il est donc nécessaire de placer le patch au bon endroit avant de l'appliquer.

***

#### Le patch concerne le cœur de GLPI

* Un **fichier** vous a été fourni: Déplacez le fichier précédemment créé vers le dossier racine de GLPI.
* Un **lien** vous a été fourni: Se déplacer vers le dossier racine de glpi puis lancer la commande suivante afin de télécharger le patch:
  * wget **`https://xxx/bug-fix.diff`**
* Vérifier ensuite que le fichier est bien présent:

![Alt text](https://1227510999-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqmRzI15ndDbFHGd5BnM4%2Fuploads%2Fgit-blob-404ee8112b55c1ce4539e7093b73238c7629ee69%2Fpatch-6.png?alt=media)

***

#### Le patch concerne un Plugin

* Un **fichier** vous a été fourni: Déplacez le fichier précédemment créé vers le dossier du plugin.
* Un **lien** vous a été fourni: Se déplacer vers le dossier du plugin puis lancer la commande suivante afin de télécharger le patch:
  * wget **`https://xxx/bug-fix.diff`**
* Vérifier ensuite que le fichier est bien présent:

![Alt text](https://1227510999-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqmRzI15ndDbFHGd5BnM4%2Fuploads%2Fgit-blob-cf5428054b4c14236c683658516ee9d1a19c2f47%2Fpatch-7.png?alt=media)

***

### Tester le patch

Avant d'appliquer le patch, vous devez le tester avec cette commande et le paramètre --dry-run

```
grep -v "phpunit/" buf-fix.diff | patch -p1 --dry-run
```

{% hint style="info" %}
Votre système vous indique que la commande patch est inconnue ? [cliquer-ici](#verifier-que-le-binaire-patch-est-installe)
{% endhint %}

#### Le test échoue ❌

En cas d'erreur vous devriez avoir ceci

```
patching file inc/config.class.php
Hunk #1 FAILED at 400.
1 out of 1 hunk FAILED -- saving rejects to file inc/config.class.php.rej
```

Beaucoup de choses peuvent mener à l'échec :

* Votre version de GLPI est différente de la version utilisée pour faire le patch
* Le fichier qui doit être modifié par le patch a déjà été précédemment

{% hint style="danger" %}
**Arrêtez-vous** **ici et contactez le support et expliquez votre problème (n'hésitez pas à ajouter des captures d'écran, version GLPI, commande utilisée etc)**
{% endhint %}

#### Le test réussi ✅

En cas de succès vous devriez avoir ceci

```
patching file inc/config.class.php
```

ou ceci

```
patching file inc/config.class.php
Hunk #1 succeeded at 891 with fuzz 1 (offset 23 lines).
Hunk #2 succeeded at 1301 with fuzz 2 (offset 41 lines).
```

***

### Appliquer le patch

Le **test** est **réussi** ✅ ?  Vous pouvez maintenant appliquer réellement le patch avec cette commande

```
grep -v "phpunit/" buf-fix.diff | patch -p1
```

**Félicitations le patch est appliqué !**

***

## Cas particuliers (rares)

{% hint style="success" %}
Le service support :

* Vous demande de **revert** / **annuler** le patch
* Vous a fourni un numéro de **commit**
* Vous a fourni un lien vers une **PR**
  {% endhint %}

### Annuler un patch

Pour annuler un patch, entrez la commande :

```
patch -p1 < bug-fix.diff -R
```

### Vous avez un numéro de commit

Le service support vous donne ce numéro de commit ex : adc9876

* D'abord, vous devez récupérer les changements du commit
* Allez à **`https://github.com/glpi-project/glpi/commit/ + NUMERO_COMMIT`**

{% hint style="success" %}
**Exemple**

**`https://github.com/glpi-project/glpi/commit/adc9876`**

<img src="https://1227510999-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqmRzI15ndDbFHGd5BnM4%2Fuploads%2Fgit-blob-b864b9e3a01cd2b6d35cad43784fa337f734defc%2Fpatch-2.png?alt=media" alt="" data-size="original">
{% endhint %}

* Puis, transformez le commit en patch en ajoutant **`.diff`** à la fin de l'url.

Comme ceci **`https://github.com/glpi-project/glpi/commit/adc9876.diff`**

<div align="left"><img src="https://1227510999-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqmRzI15ndDbFHGd5BnM4%2Fuploads%2Fgit-blob-33b8ca31f5ef2057748bb246a5789361644e72d2%2Fpatch-3.png?alt=media" alt="Alt text"></div>

* Copiez l'URL du patch et exécutez un wget sur votre serveur GLPI `wget https://github.com/glpi-project/glpi/commit/adc9876.diff`

{% hint style="info" %}
**Info**

Si c'est un patch du cœur de GLPI, effectuez le `wget` directement à la racine de GLPI.&#x20;

Si c'est un patch de plugin, effectuez le `wget` directement dans le dossier du plugin concerné. \
\
Enfin, allez à la section [appliquer le patch](#appliquer-le-patch)
{% endhint %}

### Vous avez un numéro PR (Pull Request)

Le service support vous donne un numéro PR **4770**

* D'abord, vous devez récupérer la PR
* Allez à **`https://github.com/glpi-project/glpi/pull/ + NUMERO_PR`**

{% hint style="success" %}
**Exemple**

**`https://github.com/glpi-project/glpi/pull/4770`**

<img src="https://1227510999-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqmRzI15ndDbFHGd5BnM4%2Fuploads%2Fgit-blob-b6d0579c586952074ac59737b90ba12d69c588eb%2Fpatch-4.png?alt=media" alt="Alt text" data-size="original">
{% endhint %}

* D'abord, transformez la PR en patch en ajoutant **`.diff`** à la fin de l'url.

Comme ceci <https://github.com/glpi-project/glpi/pull/4770.diff>

![Alt text](https://1227510999-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqmRzI15ndDbFHGd5BnM4%2Fuploads%2Fgit-blob-46a18fc306195096e6f1cd4c38ee021922a5f7b2%2Fpatch-5.png?alt=media)

* Copiez l'URL du patch et exécutez un `wget` sur votre serveur GLPI `wget https://github.com/glpi-project/glpi/pull/4770.diff`

{% hint style="info" %}
**Info**

Si c'est un patch du cœur de GLPI, effectuez le `wget` directement à la racine de GLPI.&#x20;

Si c'est un patch de plugin, effectuez le `wget` directement dans le dossier du plugin concerné. \
\
Enfin, allez à la section [appliquer le patch](#appliquer-le-patch)
{% endhint %}

Enfin, allez à la section [appliquer le patch](#appliquer-le-patch)

***

### Vérifier que le binaire patch est installé

* Dans de rares cas, il se peut que votre installation de Linux ne soit pas pourvue de la commande patch. Pour savoir s'il est installé, trouvez simplement la version du binaire patch installé

```
patch -v
```

S'il est installé vous devriez avoir ceci

```
GNU patch 2.7.6
Copyright (C) 2003, 2009-2012 Free Software Foundation, Inc.
Copyright (C) 1988 Larry Wall

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Larry Wall and Paul Eggert
```

Sinon vous devriez avoir ceci

```
command not found: patch
```

* Installez-le avec cette commande

**Ubuntu/Debian**

```
apt-get install patch
```

**CentOS/RHEL**

```
yum install patch
```
