Patch (Unix)

Ιστορία

Το αρχικό πρόγραμμα patch γράφτηκε από τον Larry Wall (ο οποίος στην συνέχεια δημιούργησε την γλώσσα προγραμματισμού Perl) και κυκλοφόρησε στην ομάδα συζητήσεων mod.sources (που αργότερα έγινε comp.sources.unix) στον Μάιο του 1985. Μια νεότερη έκδοση του προγράμματος είναι διαθέσιμη από το εγχείρημα GNU και συντηρείται από το Ίδρυμα Ελεύθερου Λογισμικού.

Χρήση

Σαν εργαλείο που αναπτύχθηκε από προγραμματιστή για άλλους προγραμματιστές, το patch συχνά χρησιμοποιείται για να ενημερώνει κώδικα σε μια νέα έκδοση. Για αυτόν το λόγο, συχνά θεωρείται σαν εργαλείο πηγαίου κώδικα, ενώ στην πραγματικότητα μπορεί να χρησιμοποιηθεί με οποιοδήποτε κείμενο. 
Τα patches που περιγράφονται δεν πρέπει να συγχέονται με τα δυαδικά patches (binary patches) - αν και παρόμοια, τα δεύτερα ενημερώνουν προγράμματα και όχι αρχεία κειμένου.

Χρήση στην ανάπτυξη λογισμικού

Τα αρχεία διαφορών (diff files) που αποτελούν την είσοδο του εργαλείου patch είναι απλά αρχεία κειμένου, που μπορούν να διαβαστούν, να εξεταστούν και να τροποποιηθούν από άλλους ανθρώπους, πριν αυτά να χρησιμοποιηθούν.
Εκτός από το πρόγραμμα "diff", αρχεία διαφορών μπορούν να παραχθούν από αρκετά άλλα προγράμματα, όπως το Subversion, το CVS, το RCS, το Mercurial και το Git. Αποτελούν σημαντικό μέρος πολλών συστημάτων διαχείρισης πηγαίου κώδικα, όπως του CVS.

Προχωρημένες διαφορές

Όταν χρησιμοποιούνται οι προχωρημένες διαφορές (advanced diffs), τα patches μπορούν να εφαρμοστούν ακόμα και σε αλλαγμένα αρχεία, αν οι αλλαγές αυτές δεν συγκρούονται με το patch. Αυτό γίνεται χρησιμοποιώντας διαφορές συμφραζόμενων (context diffs) και ενιαίες διαφορές (unified diffs ή unidiffs), οι οποίες περιέχουν κάθε αλλαγή μέσα στα συμφραζόμενά της, που είναι το κείμενο ακριβώς πριν και ακριβώς μετά από το μέρος που αλλάζει. Η εντολή patch μπορεί τότε να χρησιμοποιήσει τα συμφραζόμενα για να βρει την περιοχή που θα τροποποιηθεί, ακόμα και αν αυτή έχει μετακινηθεί λόγω αλλαγών αλλού στο αρχείο, χρησιμοποιώντας τους αριθμούς γραμμής του αρχείου διαφορών σαν αρχή. Λόγω αυτής τους της ιδιότητας, οι διαφορές συμφραζομένων και οι ενιαίες διαφορές συνήθως προτιμώνται από πολλά εγχειρήματα λογισμικού.
Τα παραπάνω χαρακτηριστικά κάνουν τις εντολές diff και patch πολύ δημοφιλείς όταν πρόκειται για ανταλλαγές αλλαγών ελεύθερου λογισμικού. Ένας οποιοσδήποτε χρήστης μπορεί να κατεβάσει τον διαθέσιμο πηγαίο κώδικα, να κάνει αλλαγές και να τις στείλει σε μορφή αρχείου αλλαγών τύπου diff στην ομάδα ανάπτυξης. Χρησιμοποιώντας τα αρχεία αλλαγών, μια ομάδα ανάπτυξης μπορεί να επιθεωρήσει τις αλλαγές πριν να τις εφαρμόσει, ή να τις εφαρμόσει σε νεότερο κώδικα από αυτόν που είχε πρόσβαση ο εξωτερικός προγραμματιστής.

Παραδείγματα χρήσης

Η δημιουργία ενός patch γίνεται με την εξής εντολή στη γραμμή εντολών του κελύφους:
 $ diff -u παιλόΑρχείο νέοΑρχείο > mods.diff  # -u σημαίνει ότι το diff παράγει ενιαία μορφή διαφορών
Για την εφαρμογή ενός patch μπορεί να χρησιμοποιηθεί η εξής εντολή:
 $ patch < mods.diff
Αυτή η εντολή λέει στο εργαλείο patch να εφαρμόσει τις αλλαγές στα αρχεία που περιγράφονται στο mods.diff. Αν πρόκειται να τροποποιηθούν και αρχεία σε υποφακέλους, τότε χρειάζεται η παράμετρος  -pαριθμός, όπου ο αριθμός είναι 1 αν ο φάκελος βάσης του δέντρου του πηγαίου κώδικα περιλαμβάνεται στις διαφορές, αλλιώς είναι 0.
Τα patches μπορούν να αντιστραφούν με την επιλογή '-R':
 $ patch -R < mods.diff
Αν το αρχείο δεν είναι η ίδια έκδοση με αυτήν που διάβασε αρχικά το εργαλείο diff, οι αλλαγές δε θα μπορέσουν να εφαρμοστούν όπως θα έπρεπε. Για παράδειγμα, αν προστεθούν κάποιες γραμμές κειμένου στην αρχή, οι αριθμοί γραμμών που θα αναγράφονται στις αλλαγές θα είναι πια λάθος. Σε αυτήν την περίπτωση, πρέπει να χρησιμοποιούνται τα συμφραζόμενα για την σωστή εφαρμογή των αλλαγών (βλ. παραπάνω).

Μεταφορές του patch

Αν και αρχικά γράφτηκε για το Unix και τα όμοια με αυτό λειτουργικά συστήματα, η εντολή patch έχει μεταφερθεί στα Windows και σε άλλες πλατφόρμες. Οι μεταφορές της patch για Windows είναι διαθέσιμες από τα εγχειρήματα GnuWin32 και UnxUtils.