patch | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
NOM | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
SYNOPSIS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
mais habituellement simplement
DESCRIPTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Au démarrage, patch essaie de déterminer le type du listing de diff, à moins qu'il ne soit contraint par une option -c (--context), -e (--ed), -n (--normal) ou -u (--unified). Les diffs contextuels (ancien style, nouveau style et unifié) et les diffs normaux sont appliqués par le programme patch lui-même, alors que les diffs ed sont simplement fournis à l'éditeur ed(1) via un tube.
patch essaie de sauter par dessus les déchets de tête, appliquer le diff, et ensuite passer les déchets de fin. Par conséquent, vous pourriez pouvoir alimenter facilement patch en lui injectant un article ou un message contenant un listing diff. Si le diff entier est fortement indenté, ou si un diff contextuel contient des lignes se terminant par CRLF ou est encapsulé une ou plusieurs fois en préfixant les lignes débutant par "-" par "- " comme spécifié par le RFC Internet 934, cela est pris en considération.
Avec les diffs contextuels, et dans une moindre mesure avec les diffs normaux, patch peut détecter si les numéros de lignes mentionnés dans le patch sont incorrects, et essayer de trouver l'endroit correct où appliquer chaque composant du patch (hunk). En première approximation, il prend le numéro de ligne mentionné par le composant, plus ou moins le décalage utilisé lors de l'application du composant précédent. Si ce n'est pas l'endroit correct, patch recherche en avant et en arrière un groupe de lignes correspondant au contexte donné par le composant. D'abord, patch recherche un endroit où toutes les lignes du contexte correspondent. S'il ne trouve pas de tel emplacement, et si c'est un diff contextuel, et que le facteur de bruit (fuzz factor) maximum vaut 1 ou plus, alors une autre analyse a lieu ; celle-ci ignore la première et la dernière ligne de contexte. Si cela échoue, et que le facteur de bruit maximum est supérieur ou égal à 2, les deux premières et les deux dernières lignes de contexte sont ignorées, et une autre analyse est faite (le facteur de bruit maximum par défaut est 2). Si patch ne peut trouver d'endroit où installer ce composant du patch, il place le composant dans un fichier de rejet, qui est normalement le nom du fichier de sortie plus un suffixe .rej, ou # si .rej générerait un nom de fichier trop long (si même la concaténation du seul caractère # rend le nom de fichier trop long, alors # remplace le dernier caractère du nom de fichier). (Le composant rejeté apparaît dans la forme diff contextuelle ordinaire quelle que soit la forme du patch d'entrée. Si l'entrée est un diff normal, beaucoup de contextes sont tout simplement vides.) Les numéros de ligne des composants dans le fichier de rejet peuvent être différents de ceux du fichier patch : ils reflètent l'endroit approximatif des composants ayant échoué dans le nouveau fichier plutôt que dans l'ancien.
Après chaque tentative d'application de composant, patch vous indique si le composant a échoué et, si c'est le cas, à quelle ligne (du nouveau fichier) le composant aurait dû être placé. Si le composant est installé à une ligne différente du numéro de ligne spécifié dans le diff, le décalage utilisé est indiqué. Un seul grand décalage peut indiquer qu'un composant a été installé au mauvais endroit. On vous signale également si un facteur de bruit a été utilisé pour trouver la correspondance, auquel cas vous devriez également être légèrement suspicieux. Si l'option --verbose est donnée, les composants correspondant exactement sont également mentionnés.
Si aucun fichier-original n'est spécifié sur la ligne de commandes, patch essaie de déterminer à partir des déchets de tête le nom du fichier à éditer, en utilisant les règles suivantes :
D'abord, patch construit une liste ordonnée de noms de fichiers candidats comme suit :
Ensuite, patch sélectionne un nom de fichier à partir de la liste de candidats comme suit :
Pour déterminer le meilleur nom d'une liste non vide de noms de fichiers, patch considère d'abord tous les noms ayant le composant de nom de chemin le plus court ; parmi ceux-ci, il prend ensuite ceux de nom de base le plus court ; parmi les rescapés, il prend ensuite tous les noms les plus courts ; finalement, il utilise le premier nom restant.
En outre, si les déchets de tête contiennent une ligne Prereq:, patch extrait le premier mot de la ligne de prérequis (normalement un numéro de version) et examine le fichier original pour voir si ce mot peut être trouvé. Si ce n'est pas le cas, patch demande une confirmation avant de procéder.
Le résultat de tout ceci est que vous devriez pouvoir faire, alors que vous vous trouvez dans une interface de news (NdT : nouvelles Usenet), quelque chose du genre :
| patch -d /usr/src/local/blurfl
et patcher un fichier du répertoire blurfl directement à partir de l'article contenant le patch.
Si le fichier patch contient plus d'un patch, patch essaie d'appliquer chacun d'entre eux comme s'ils provenaient de fichiers patchs différents. Cela signifie, entre autres choses, que l'on suppose que le nom du fichier à patcher doit être déterminé pour chaque listing de diff, et que les déchets précédant chaque listing de diff contiennent des choses intéressantes telles que les noms de fichiers et le niveau de révision, comme mentionné précédemment.
OPTIONS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
/u/howard/src/blurfl/blurfl.c
spécifier -p0 donne le nom de fichier entier non modifié, -p1 donne
u/howard/src/blurfl/blurfl.c
sans le slash de tête, -p4 donne
blurfl/blurfl.c
et ne pas spécifier de -p du tout vous donne blurfl.c. Ce que vous obtenez finalement est recherché soit dans le répertoire courant, soit dans le répertoire spécifié par l'option -d.
Vous pouvez spécifier la valeur par défaut de l'option --quoting-style avec la variable d'environnement QUOTING_STYLE. Si cette variable d'environnement n'est pas définie, la valeur par défaut est shell.
Si le premier composant d'un patch échoue, patch le renverse pour voir s'il peut être appliqué de cette façon. Si c'est le cas, il vous demande si vous voulez que l'option -R soit utilisée. Si vous ne le souhaitez pas, le patch continue à être appliqué normalement. (Note : cette méthode ne peut détecter un patch reversé si c'est un diff normal et que la première commande est une concaténation (elle aurait du être un effacement) puisque la concaténation réussit toujours, étant donné qu'un contexte nul convient partout. Heureusement, la plupart des patchs ajoutent ou modifient des lignes plutôt que d'en supprimer, de sorte que la plupart des diffs normaux renversés commencent par un effacement, qui échoue, ce qui déclenche l'heuristique.)
La valeur de méthode est identique à celle de la variable « version-control » de GNU Emacs : patch reconnaît également des synonymes plus descriptifs. Les valeurs valides pour méthode sont (les abréviations uniques sont acceptées) :
Avec les sauvegardes numérotées ou simples, si le nom du fichier de sauvegarde est trop long, le suffixe de sauvegarde ~ est utilisé à la place ; si même la concaténation d'un ~ rendrait le nom trop long, alors ~ remplace le dernier caractère du nom de fichier.
Les options -Z ou --set-utc, et -T ou --set-time empêchent normalement de fixer une date d'un fichier si la date originale du fichier ne correspond pas à celle donnée dans l'en-tête du patch, ou si son contenu ne correspond pas exactement au patch. Néanmoins, si l'option -f ou --force est spécifiée, la date du fichier est tout de même fixée.
À cause des limitations du format de sortie de diff, ces options ne peuvent mettre à jour les dates des fichiers dont le contenu n'a pas changé. De plus, si vous utilisez ces options, vous devriez supprimer (p.ex. avec make clean) tous les fichiers qui dépendent des fichiers patchés, afin que des invocations ultérieures de make ne soient pas dupées par les dates des fichiers patchés.
ENVIRONNEMENT | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
FICHIERS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
VOIR AUSSI | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Marshall T. Rose and Einar A. Stefferud, Proposed Standard for Message Encapsulation, RFC Internet 934 <URL:ftp://ftp.isi.edu/in-notes/rfc934.txt> (1985-01).
NOTES DESTINÉES AUX ÉMETTEURS DE PATCHS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Créez votre patch de façon systématique. Une bonne méthode est la commande diff -Naur ancien/nouveau où ancien et nouveau identifient l'ancien et le nouveau répertoire respectivement. Les noms ancien et nouveau ne devraient pas contenir de slashs. Les en-têtes de la commande diff devraient posséder des dates et des heures dans le Temps Universel en utilisant le format Unix traditionnel, afin que les destinataires du patch puissent utiliser l'option -Z ou --set-utc. Voici une commande d'exemple, qui utilise la syntaxe du shell Bourne :
LC_ALL=C TZ=UTC0 diff -Naur gcc-2.7 gcc-2.8
Indiquez à vos destinataires la façon d'appliquer le patch en leur disant dans quel répertoire ils doivent se rendre, et quelles options de patch utiliser. La chaîne d'options -Np1 est recommandée. Testez votre procédure en faisant semblant d'être un destinataire et en appliquant votre patch sur une copie des fichiers originaux.
Vous pouvez épargner un tas de cheveux blancs aux utilisateurs de votre patch en conservant un fichier patchlevel.h qui est patché pour incrémenter le niveau de patchs en tant que permier diff du fichier patch que vous envoyez. Si vous placez une ligne Prereq: dans le patch, il ne vous laissera pas les appliquer dans le désordre sans avertissement.
Vous pouvez créer un fichier en envoyant un diff qui compare /dev/null ou un fichier vide daté de l'Epoch (01/01/1970 00:00:00 UTC) avec le fichier que vous voulez créer. Cela ne fonctionne que si le fichier que vous voulez créer n'existe pas déjà dans le répertoire cible. Inversement, vous pouvez supprimer un fichier en envoyant un diff contextuel qui compare le fichier à effacer avec un fichier vide daté de l'Epoch. Le fichier sera supprimé à moins que patch ne se conforme à POSIX et que l'option -E ou --remove-empty-files n'est pas donnée. Une manière commode de générer des patchs qui créent ou suppriment des fichiers est d'utiliser l'option -N ou --new-file du diff GNU.
Si le destinataire est censé utiliser l'option -p N, n'envoyez pas de sortie ressemblant à ceci :
diff -Naur v2.0.29/prog/README prog/README
--- v2.0.29/prog/README Mon Mar 10 15:13:12 1997
+++ prog/README Mon Mar 17 14:58:22 1997
car les deux noms de fichiers ont un nombre différent de slashs, et différentes versions de patch interprètent les noms de fichiers différemment. Pour éviter une confusion, envoyez plutôt une sortie qui ressemble à ceci :
diff -Naur v2.0.29/prog/README v2.0.30/prog/README
--- v2.0.29/prog/README Mon Mar 10 15:13:12 1997
+++ v2.0.30/prog/README Mon Mar 17 14:58:22 1997
Évitez d'envoyer des patchs qui comparent des noms de fichiers de sauvegarde comme README.orig, car cela pourrait embrouiller patch qui patcherait alors un fichier de sauvegarde au lieu du fichier réel. Au lieu de cela, envoyez des patchs qui comparent les mêmes noms de base de fichiers dans des répertoires différents, comme p.ex. old/README et new/README.
Prenez bien soin de ne pas envoyer de patchs renversés, car les gens pourraient se demander s'ils n'ont pas déjà appliqué le patch.
Évitez si possible que votre patch modifie des fichiers dérivés (p.ex. le fichier configure quand il y a une ligne configure: configure.in dans votre makefile), car le destinataire devrait de toute façon avoir la possibilité de régénérer les fichiers dérivés. Si vous devez envoyez des diffs de fichiers dérivés, générez-les en utilisant le temps UTC, faites en sorte que les destinataires appliquent le patch avec l'option -Z ou --set-utc, et faites-leur supprimer les fichiers non patchés qui dépendent des fichiers patchés (p.ex. avec make clean).
Bien que vous puissiez vous en sortir en plaçant 582 listings de diff dans un fichier, il peut être plus judicieux de grouper les patchs apparentés dans des fichiers séparés au cas où quelque chose tourne mal.
DIAGNOSTICS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Si l'option --verbose est donnée, le message Hmm... indique qu'il reste du texte non traité dans le fichier patch et que patch essaie de deviner s'il contient un patch et, le cas échéant, de quel type il s'agit.
Le code de retour de patch est 0 si tous les composants ont été appliqués avec succès, 1 si certains d'entre eux n'ont pas pu être appliqués, et 2 en cas de problème plus sérieux. Lors de l'application d'un groupe de patchs dans une boucle, il vous incombe de vérifier ce code de retour afin de ne pas appliquer ultérieurement un patch sur un fichier partiellement patché.
AVERTISSEMENTS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
patch ne peut dire si les numéros de ligne sont désactivés dans un script ed, et ne peut détecter les mauvais numéros de lignes dans un diff normal que lorsqu'il détecte un changement ou un effacement. Un diff contextuel utilisant un facteur de bruit de 3 peut avoir le même problème. En attendant qu'une interface interactive appropriée soit ajoutée, vous devriez probablement utiliser un diff contextuel dans ces cas pour voir si les changements ont du sens. Bien sûr, une compilation sans erreur est un bon indicateur que le patch a fonctionné, mais pas toujours.
patch produit habituellement les résultats escomptés, même quand il doit deviner beaucoup de choses. Néanmoins, des résultats corrects ne sont garantis que lorsque le patch est appliqué sur exactement la même version du fichier que celle à partir de laquelle le patch a été généré.
COMPATIBILITÉ | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
De plus, le patch traditionnel comptait simplement les slashs lors de l'enlèvement des préfixes de chemin ; patch compte maintenant les composants du nom de chemin, c.-à-d. qu'une séquence d'un ou de plusieurs slashs adjacents compte désormais pour un seul slash. Pour une portabilité maximale, évitez d'envoyer des patchs contenant // dans les noms de fichiers.
Inversement, dans le patch POSIX, les sauvegardes n'étaient jamais créées, même en cas de discordance. Dans le patch GNU, ce comportement est activé par l'option --no-backup-if-mismatch, ou en se conformant à POSIX avec l'option --posix, ou encore en définissant la variable d'environnement POSIXLY_CORRECT.
L'option -b suffixe du patch traditionnel est équivalente aux options -b -z suffixe du patch GNU.
-c -d rép -D define -e -l -n -N -o fichier-sortie -pnombre -R -r fichier-rejet
BOGUES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
patch pourrait être plus intelligent en ce qui concerne les correspondances partielles, les décalages excessifs et l'inversion de code, mais cela requerrait une passe supplémentaire.
Si le code a été dupliqué (par exemple avec #ifdef ANCIENCODE ... #else ... #endif), patch est incapable de patcher les deux versions et, si jamais il fonctionne, patchera probablement le mauvais, et vous dira qu'il a réussi à démarrer.
Si vous appliquez un patch que vous avez déjà appliqué, patch pense que c'est un patch renversé et offre la possibilité de dés-appliquer le patch. Cela pourrait être interprété comme une fonctionnalité.
COPYRIGHT | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
L'autorisation est donnée de créer et de distribuer des copies textuelles de ce manuel, à condition que la notice de copyright et la notice de permission soient préservées dans toutes les copies.
L'autorisation est donnée de copier et distribuer des versions modifiées de ce manuel sous les conditions de copie textuelle, à condition que l'entièreté du travail dérivé résultant soit distribuée sous les termes d'une autorisation identique à celle-ci.
L'autorisation est donnée de copier et distribuer des traductions de ce manuel dans n'importe quelle autre langue, sous les conditions ci-dessus pour les versions modifiées, sauf que cette notice de permission peut être incluse dans des traductions approuvées par les détenteurs du copyright au lieu de l'anglais originel.
AUTEURS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
TRADUCTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Sommaire | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
Table des mots clés | Début | Suivant | Sommaire | Préc.page.lue | Accueil |