Patch - Unix, Linux Command

patch - appliquer un fichier diff à un original

Patch [options] [originalfile [rustine]]

mais habituellement juste

Patch prend un fichier patch rustine contenant une liste de différences produit par le programme diff et applique ces différences à un ou plusieurs fichiers d'origine, produisant des versions corrigées. Normalement, les versions corrigées sont mises en place des originaux. Les sauvegardes peuvent être faites; voir l'option -b ou --backup. Les noms des fichiers à patcher sont généralement prises à partir du fichier de patch, mais s'il y a # 146; s un seul fichier à patcher il peut spécifié sur la ligne de commande comme originalfile.

Au démarrage, les tentatives de patch pour déterminer le type de la liste diff, sauf si la -c un (--context), -e (--ed), -n (--normal), ou -u (--unified) option. Contexte diffs (style ancien, nouveau style et unifiées) et diffs normaux sont appliqués par le programme patch lui-même, tandis que les diffs ées sont simplement nourris à l'édition (1) éditeur via un tuyau.

Patch essaie de sauter tous les déchets de premier plan, appliquer la diff, puis sauter tous les déchets de fuite. Ainsi, vous pouvez nourrir un article ou un message contenant une diff liste de patch. et cela devrait fonctionner. Si l'ensemble de diff est en retrait par une quantité cohérente, ou si un diff contextuel contient des lignes se terminant par CRLF ou est encapsulé une ou plusieurs fois par préfixer « - » pour les lignes commençant par « - » comme spécifié par Internet RFC 934, cela est pris en compte.

Si aucun origfile du fichier d'origine est spécifié sur la ligne de commande, pièce essaie de comprendre de la poubelle menant ce que le nom du fichier à modifier est, en utilisant les règles suivantes.

Tout d'abord, correctif prend une liste ordonnée de noms de fichiers de candidats comme suit:

Si l'en-tête est celle d'un diff contextuel, correctif prend les anciens et les nouveaux noms de fichiers dans l'en-tête. Un nom est ignoré si elle ne dispose pas de suffisamment de barres obliques pour satisfaire la -pnum ou --strip = option num. Le nom / dev / null est également ignoré.

S'il y a un indice: la ligne dans les principaux déchets et si soit les anciens et nouveaux noms sont absents ou si patch est conforme à POSIX. Patch prend le nom de l'indice: la ligne.

Aux fins des règles suivantes, les noms de fichiers candidats sont considérés comme dans l'ordre (ancien, nouveau, index), quel que soit l'ordre dans lequel ils apparaissent dans l'en-tête.

Ensuite Patch sélectionne un nom de fichier dans la liste des candidats comme suit:

Si certains des fichiers nommés existent, Patch sélectionne le premier nom si conforme à POSIX. et le meilleur nom autrement.

Si patch ne tient pas compte RCS. ClearCase et CSSC (voir l'option -gnum ou --get = num), et aucun fichier nommé existe, mais un RCS. maître ClearCase ou SCCS se trouve, Patch sélectionne le premier fichier nommé avec un RCS. maître ClearCase ou SCCS.

Si aucun fichier nommé existe, pas RCS. ClearCase ou maître CSSC a été trouvé, certains noms sont donnés, patch n'est pas conforme à POSIX. et le patch semble créer un fichier, correctif sélectionne le meilleur nom nécessitant la création des répertoires plus petit nombre.

Si aucun nom de fichier résulte des heuristiques ci-dessus, on vous demande le nom du fichier de patch, et le patch sélectionne ce nom.

Pour déterminer le meilleur d'une liste non vide de noms de fichiers, correctif prend d'abord tous les noms avec le plus petit nombre de composants nom de chemin; de ceux-ci, il prend alors tous les noms avec les plus brefs basename; de ceux-ci, il prend alors tous les noms les plus courts; enfin, il prend le premier nom restant.

Le résultat de tout cela est que vous devriez être en mesure de dire, alors que dans une interface de nouvelles, quelque chose comme ce qui suit:

| patcher -d / usr / src / local / blurfl

et patcher un fichier dans le répertoire blurfl directement à partir de l'article contenant le patch.

Si le fichier patch contient plus d'un patch, correctif tente d'appliquer chacun d'eux comme s'ils venaient de fichiers de patch séparés. Cela signifie, entre autres choses, que l'on suppose que le nom du fichier à correctif doit être déterminé pour chaque liste de diff, et que les déchets avant chaque liste diff contient des choses intéressantes telles que les noms de fichiers et le niveau de révision, comme mentionné précédemment.

-E ou --remove-vide-fichiers

Supprimer les fichiers de sortie qui sont vides après que les correctifs ont été appliqués. Normalement, cette option est inutile, car patch peut examiner les horodateurs sur l'en-tête pour déterminer si un fichier doit exister après patcher. Cependant, si l'entrée est pas un diff contextuel ou si patch est conforme à POSIX. patch ne supprime pas les fichiers patchés vides à moins que cette option est donnée. Lorsque correctif supprime un fichier, il tente également de supprimer tous les répertoires ancêtres vides.

Cette option correctif # 146; s actions lorsqu'un fichier est sous contrôle RCS ou SCCS, et n'existe pas ou est en lecture seule et correspond à la version par défaut, ou lorsqu'un fichier est sous contrôle ClearCase et n'existe pas. Si nombre est positif, correctif obtient (ou vérifie) le fichier du système de contrôle de révision; si zéro, pièce ignore RCS. ClearCase et CSSC et ne soit pas le fichier; et si elle est négative, pièce demande à l'utilisateur si vous souhaitez obtenir le fichier. La valeur par défaut de cette option est donnée par la valeur de la variable d'environnement PATCH_GET si elle est définie; sinon, la valeur par défaut est zéro si patch est conforme à POSIX. sinon négatif.

Bande le préfixe le plus petit contenant Leading num barres obliques de chaque nom de fichier trouvé dans le fichier de patch. Une séquence d'une ou plusieurs barres adjacentes est prise en compte comme une seule barre oblique. Ce contrôle la façon dont les noms de fichiers trouvés dans le fichier patch sont traitées, dans le cas où vous conservez vos fichiers dans un répertoire différent de celui de la personne qui a envoyé le patch. Par exemple, en supposant que le nom du fichier dans le fichier patch était

la mise en -p0 donne le nom de fichier entier non modifié, -p1 donne

sans le slash, -p4 donne

et ne pas spécifier -p tout vous donne juste blurfl.c. Tout ce que vous retrouvez avec est recherché soit dans le répertoire courant, ou le répertoire spécifié par l'option -d.

Conformer plus strictement la norme POSIX, comme suit.

Prenez le premier fichier existant dans la liste (anciens, nouveaux, index) lorsque pressentant les noms de fichiers en-têtes de diff.

Ne pas supprimer les fichiers qui sont vides après avoir patché.

Il y a plusieurs choses que vous devriez garder à l'esprit si vous allez envoyer des patches.

Créez votre patch systématiquement. Une bonne méthode est la commande diff -Naurold nouveau où anciens et nouveaux identifier les anciens et les nouveaux répertoires. Les noms anciens et nouveaux ne doivent pas contenir de barres obliques. La commande diff # 146; des en-têtes doivent avoir des dates et des heures en temps universel en utilisant le format Unix traditionnel, afin que les bénéficiaires de patch peuvent utiliser le -Z ou --set-utc option. Voici un exemple de commande, en utilisant la syntaxe Bourne shell:

LC_ALL = C TZ = UTC0 diff -Naur gcc gcc-2,8-2,7

Faites savoir à vos destinataires comment appliquer le patch en leur disant quel répertoire cd, et les options de raccordement à utiliser. La chaîne d'option -Np1 est recommandée. Testez votre procédure en prétendant être un destinataire et l'application de votre patch pour une copie des fichiers originaux.

Vous pouvez sauver les gens beaucoup de chagrin en gardant un fichier patchlevel.h qui est patché pour augmenter le niveau de patch la première diff dans le fichier de patch que vous envoyez. Si vous mettez une Préalable: ligne avec le patch, il a gagné # 146; t les laisser appliquer des correctifs sur ordre sans un avertissement.

Si le destinataire est censé utiliser l'option pn, ne pas envoyer la sortie qui ressemble à ceci:

parce que les deux noms de fichiers ont un nombre différent de barres obliques et les différentes versions de correctif interpréter les noms de fichiers différemment. Pour éviter toute confusion, envoyer la sortie qui ressemble à ceci:

Évitez d'envoyer des patchs qui comparent les noms de fichiers de sauvegarde comme README.orig. car cela pourrait confondre patch dans patcher un fichier de sauvegarde au lieu du fichier réel. Au lieu de cela, envoyer des patches qui comparent les mêmes noms de fichiers de base dans des répertoires différents, par exemple ancien / nouveau README et / README.

Prenez soin de ne pas envoyer des patches renversées, car il rend les gens se demandent si elles appliquent déjà le patch.

Essayez de ne pas avoir votre patch modifier des fichiers dérivés (par exemple, le configure de fichiers où il y a une ligne de configure: configure.in dans votre makefile), étant donné que le destinataire doit pouvoir régénérer les fichiers dérivés de toute façon. Si vous devez envoyer des fichiers diffs dérivés, générer les diffs en utilisant l'UTC. ont les destinataires appliquent le patch avec l'option -Z ou --set-utc, et de les supprimer tous les fichiers non corrigés qui dépendent des fichiers corrigés (par exemple avec make clean).

Diagnostics indiquent généralement que correctif # 146 couldn; t Parse votre fichier de patch.

Si l'option --verbose est donnée, le message Hmm. indique qu'il ya du texte non traité dans le fichier patch et ce patch tente de deviner s'il y a un patch dans ce texte et, si oui, quel type de pièce est.

pièce # 146; état de la sortie de 0 si tous les gros morceaux sont appliqués avec succès, 1 si certains Hunks ne peuvent pas être appliquées et 2 s'il y a des problèmes plus graves. Lors de l'application d'un ensemble de patchs dans une boucle il vous appartient de vérifier ce statut de sortie de sorte que vous don # 146; t appliquer un patch plus tard dans un fichier partiellement patché.

Contexte diffs ne peut pas représenter de manière fiable la création ou la suppression de fichiers vides, des répertoires vides, ou des fichiers spéciaux tels que des liens symboliques. Ils ne peuvent pas représenter les modifications du fichier de métadonnées comme la propriété, les autorisations, ou si un fichier est un lien vers un autre. Si de tels changements sont également nécessaires, des instructions séparées (par exemple un script shell) pour les atteindre doivent accompagner le patch.

correctif produit généralement des résultats corrects, même quand il doit faire beaucoup de deviner. Cependant, les résultats sont garantis pour être correcte que lorsque le patch est appliqué exactement la même version du fichier que le patch a été généré à partir.

La norme POSIX spécifie le comportement qui diffère de correctif # 146; le comportement traditionnel. Vous devez être conscient de ces différences si vous devez interagir avec les versions de patch 2.1 et antérieures, qui ne sont pas conformes à Posix.

Dans le patch traditionnel. l'option -p # 146; opérande de était facultative, et -p nu était équivalent à -p0. L'option -p nécessite maintenant un opérande et -p 0 est maintenant équivalent à -p0. Pour une compatibilité maximale, les options d'utilisation comme -p0 et -p1.

En outre, timbre traditionnel simplement compté les barres obliques en dénudant les préfixes de chemin; Patch compte maintenant composants d'un chemin. Autrement dit, une séquence d'une ou plusieurs barres obliques adjacentes compte maintenant comme une seule barre oblique. Pour une portabilité maximale, éviter d'envoyer des patches contenant // dans les noms de fichiers.

Dans le patch traditionnel. Les sauvegardes ont été activées par défaut. Ce comportement est maintenant activé avec l'option -b ou --backup.

A l'inverse, dans le patch POSIX. Les sauvegardes ne sont jamais faites, même quand il y a un décalage. Dans GNU patch. ce comportement est activé avec l'option --no-sauvegarde si non-concordance, ou en se conformant à POSIX avec l'option --posix ou en définissant la variable d'environnement POSIXLY_CORRECT.

L'option -bsuffix de correctif traditionnel équivaut aux options -b -zsuffix de GNU patch.

Patch traditionnel utilisé une méthode compliquée (et incomplètement documentée) à Intuit le nom du fichier à patcher de l'en-tête de patch. Cette méthode ne se conformait pas à POSIX. et avait quelques gotchas. Maintenant correctif utilise une autre méthode tout aussi compliquée (mais mieux documenté) qui est en option -conforming POSIX; nous espérons qu'il a moins gotchas. Les deux méthodes sont compatibles si les noms de fichiers dans l'en-tête de diff contexte et l'indice: la ligne sont tous identiques après préfixe décapage. Votre patch est normalement compatible si chaque en-tête # 146; les noms de fichiers de tous contiennent le même nombre de barres obliques.

Lorsque correctif traditionnel a demandé à l'utilisateur une question, il a envoyé la question à l'erreur standard et a cherché une réponse du premier fichier dans la liste suivante qui était un terminal: erreur standard, sortie standard, / dev / TTY. et l'entrée standard. Maintenant correctif envoie des questions à la sortie standard et obtient des réponses de / dev / TTY. La valeur par défaut pour certaines réponses ont été modifiées de sorte que correctif va jamais dans une boucle infinie lors de l'utilisation des réponses par défaut.

Patch traditionnelle est sorti avec une valeur d'état qui a compté le nombre de mauvais Hunks, ou avec le statut 1 s'il y avait des problèmes réels. Maintenant sorties patch avec état 1 si certains Hunks a échoué, ou avec 2 s'il y avait des problèmes réels.

Limitez-vous aux options suivantes lors de l'envoi d'instructions destinées à être exécutées par toute personne exécutant GNU patch. timbre traditionnel. ou d'un patch conforme à POSIX. Les espaces sont importants dans la liste suivante et opérandes sont nécessaires.

Si le code a été dupliqué (par exemple avec #ifdef OLDCODE. #else. Endif), patch est incapable de patcher les deux versions, et, si cela fonctionne du tout, va probablement patcher le mauvais, et vous dire qu'il a réussi à démarrage.

Si vous appliquez un patch # 146; avez déjà appliqué, Patch pense qu'il est un patch interverties et offre non appliquer le patch. Cela pourrait être interprété comme une caractéristique.

Il est permis de copier et distribuer des versions modifiées de ce manuel dans les conditions de copie textuelle, à condition que l'ensemble du travail dérivé résultant est distribué selon les termes d'un avis d'autorisation identique à celui-ci.

Larry Wall a écrit la version originale du patch. Paul Eggert enlevé Patch # 146; de limites arbitraires; Ajout du support pour les fichiers binaires, la mise en temps de fichiers et la suppression de fichiers; et a rendu plus conforme Posix. Parmi les autres contributeurs Wayne Davison, qui a ajouté le soutien unidiff, et David MacKenzie, qui a ajouté la configuration et le support de sauvegarde.

Articles Liés