patch (Unix)

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Μετάβαση σε: πλοήγηση, αναζήτηση
Απόσπασμα χρήσης του patch.

Το patch είναι πρόγραμμα του Unix που ενημερώνει αρχεία κειμένου σύμφωνα με οδηγίες που δίνονται σε ένα άλλο αρχείο (το αρχείο patch, αγγλ. patch file ή patch). Το αρχείο patch είναι επίσης αρχείο κειμένου που περιέχει μια λίστα διαφορών και προκύπτει από την εκτέλεση του προγράμματος diff με παραμέτρους το αρχικό και το ενημερωμένο αρχείο.

Ιστορία[Επεξεργασία | επεξεργασία κώδικα]

Το αρχικό πρόγραμμα patch γράφτηκε από τον Larry Wall (ο οποίος στην συνέχεια δημιούργησε την γλώσσα προγραμματισμού Perl) και κυκλοφόρησε στην ομάδα συζητήσεων mod.sources[1] (που αργότερα έγινε 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.

Δείτε επίσης[Επεξεργασία | επεξεργασία κώδικα]

Αναφορές[Επεξεργασία | επεξεργασία κώδικα]

Εξωτερικοί σύνδεσμοι[Επεξεργασία | επεξεργασία κώδικα]

Στο λήμμα αυτό έχει ενσωματωθεί κείμενο από το λήμμα Patch (Unix) της Αγγλικής Βικιπαίδειας, η οποία διανέμεται υπό την GNU FDL και την CC-BY-SA 3.0. (ιστορικό/συντάκτες).