Το **darcs** είναι ένα σύστημα κατανεμημένου ελέγχου εκδόσεων που δημιουργήθηκε από τον David Roundy και σχεδιάστηκε για να αντικαταστήσει τα κεντρικά συστήματα ελέγχου πηγαίου κώδικα όπως το CVS και το Subversion. Δύο ιδιαίτερα χαρακτηριστικά της σχεδίασής του το διαχωρίζουν από το CVS. Κάθε αντίγραφο του δέντρου πηγαίου κώδικα λειτουργεί σαν πλήρες αποθετήριο (repository), επιτρέποντας τη συντήρηση διαφορετικών εκδόσεων σε διαφορετικές τοποθεσίες. Τα patches είναι καθολικά στο repository και μπορούν υπό προϋποθέσεις να αναδιαταχτούν, σύμφωνα με τη "θεωρία των patches" του εγχειρήματος.

Το όνομα είναι αναδρομικό αρκτικόλεξο της αγγλικής φράσης **Darcs Advanced Revision Control System**, αλλά συνήθως γράφεται με πεζά γράμματα (**darcs**), αν δεν βρίσκεται στην αρχή πρότασης.

Στη βασική του χρήση, ένας χρήστης μπορεί να πάρει (*get*) ένα αντίγραφο ενός repository, να κάνει κάποιες αλλαγές, να καταγράψει (*record*) τις αλλαγές αυτές, να τραβήξει (*pull*) αλλαγές από άλλα repositories, και στο τέλος να σπρώξει (*push*) ή να στείλει (*send*) αλλαγές σε άλλα repositories. Για να αρχίσει ένα νέο repository, ο χρήστης μπορεί να αρχικοποιήσει (*init*) έναν οποιοδήποτε φάκελο. 

Τα άλλα repositories μπορούν να είναι τοπικοί φάκελοι, ή να είναι προσβάσιμα μέσω των πρωτοκόλλων SSH ή HTTP. Οι αλλαγές μπορούν να υποβληθούν μέσω ηλεκτρονικού ταχυδρομείου σε περιπτώσεις που ο χρήστης δεν έχει δικαίωμα εγγραφής σε ένα άλλο repository.

Το darcs είναι γραμμένο στη γλώσσα συναρτησιακού προγραμματισμού Haskell - ανάμεσα σε άλλα εργαλεία χρησιμοποιεί το QuickCheck.

Οι πιο πολλές εντολές του darcs είναι διαδραστικές, π.χ. επιτρέπουν στο χρήστη να υποβάλλει αλλαγές ή να τραβήξει συγκεκριμένα αρχεία επιλεκτικά. Αυτό το χαρακτηριστικό έχει σχεδιαστεί ώστε να ενθαρρύνει περισσότερη λεπτομέρεια στη δημιουργία patches. Λόγω αυτής της διαδραστικότητας, το darcs έχει λιγότερες ξεχωριστές εντολές σε σχέση με άλλα αντίστοιχα συστήματα ελέγχου εκδόσεων.

Μοντέλο
-------

Σε αντίθεση με άλλα συστήματα ελέγχου εκδόσεων, που επιτρέπουν στο χρήστη να βλέπει την ιστορία του δέντρου του πηγαίου κώδικα σαν μια σειρά από στιγμιότυπα προς τα πίσω στο χρόνο, ένα δέντρο πηγαίου κώδικα κατά το darcs μοντελοποιείται σαν ένα σύνολο από patches, το καθένα από τα οποία δεν έχει υποχρεωτικά κάποια σειρά σε σχέση με τα άλλα, δηλαδή το σύνολο των patches είναι μερικώς διατεταγμένο. Μια συγκεκριμένη έκδοση του δέντρου πηγαίου κώδικα αντιστοιχεί σε ένα συγκεκριμένο σύνολο από patches. Αυτό το σύνολο ίσως να έχει υπάρξει στο παρελθόν αλλά αυτό δεν είναι αναγκαίο, δηλαδή μια έκδοση του δέντρου δεν είναι υποχρεωτικό να είναι ένα προηγούμενο στιγμιότυπό του στον χρόνο.

Προβλήματα
----------

Έχει ασκηθεί κριτική στο darcs για προβλήματα απόδοσης. Το χειρότερο από αυτά τα προβλήματα αφορούσε τον αλγόριθμο συγχώνευσης (merge) του Darcs 1.x, ο οποίος, στη χειρότερη περίπτωση, μπορεί να χρειαζόταν εκθετικό χρόνο για να χειριστεί κάποιες συγκρούσεις (conflicts). Αν και το θέμα δε διορθώθηκε πλήρως στο Darcs 2, έχουν ελαχιστοποιηθεί αυτές οι εκθετικές περιπτώσεις. Δυστυχώς παραμένουν κάποια σφάλματα στη συγχώνευση αναδρομικών συγκρούσεων με αποτέλεσμα την αποτυχία της λειτουργίας της συγχώνευσης (π.χ. ).

Ιστορία
-------

Το darcs ήταν εξέλιξη της προσπάθειας του David Roundy να σχεδιάσει μια νέα μορφή patch για το GNU arch τον Ιούνιο του 2002. Αυτές οι συζητήσεις δεν κατέληξαν σε κώδικα που να δόθηκε στο arch, αλλά τον οδήγησαν στη θεωρία των patches. Αφού είχε γράψει την αρχική έκδοση του darcs σε C++, η έκδοση σε Haskell γράφτηκε το φθινόπωρο του 2002 και κυκλοφόρησε στο κοινό τον Απρίλιο του 2003.

Σχετικά
-------

Ένα σχετικό εγχείρημα που ονομάζεται Camp ("Commute and merge patches") προσπαθεί να αναπτύξει την άλγεβρα των Patches του darcs με πιο τυπικό τρόπο, περιλαμβάνοντας την απόδειξη της ορθότητας κάποιων χαρακτηριστικών με τη χρήση Coq. Το Camp μένει κοντά στο εγχείρημα darcs και οι δημιουργοί του περιμένουν ότι τα δυο εγχειρήματα θα ενωθούν πάλι όταν ωριμάσει το Camp.

Παραπομπές
----------

1. ↑  Error: Unable to display the reference properly. See the documentation for details.
2. ↑  Error: Unable to display the reference properly. See the documentation for details.
3. ↑  «Commit in which David changes the acronym's meaning». Αρχειοθετήθηκε από το πρωτότυπο στις 13 Ιουλίου 2012. Ανακτήθηκε στις 14 Αυγούστου 2010.
4. ↑  "One of the problems I had with the initial C++ darcs was that I had no unit testing code. Within two weeks of the first darcs record, I started using QuickCheck to test the patch functions, and the same day I fixed a bug that was discovered by QuickCheck. QuickCheck makes it very easy to define properties that functions must have, which are then tested with randomly generated data." From page 2 of David Roundy 2005.
5. ↑  Simon Marlow, Re: current status of darcs, darcs-users discussion group, March 7, 2007
6. ↑  Robert Fendt, DVCS Round-Up: One System to Rule Them All?--Part 1 Αρχειοθετήθηκε 2009-02-28 στο Wayback Machine. Linux Foundation Developer Network, January 9, 2009
7. ↑  ConflictsFAQ, Darcs Wiki
8. ↑  Issue 1520 Irrefutable pattern failed for pattern Data.Maybe.Just a2, Darcs Bug Tracker

Δείτε επίσης
------------

* diff / patch, για απευθείας χειρισμό patches μεταξύ αρχείων πηγαίου κώδικα

Περαιτέρω διάβασμα
------------------

* Roundy, David (2005). «Darcs: distributed version management in Haskell». *Proceedings of the 2005 ACM SIGPLAN workshop on Haskell Tallinn, Estonia*, pp. 1–4. ISBN 1-59593-071-X.

Εξωτερικοί σύνδεσμοι
--------------------

|  |  |
| --- | --- |
| Commons logoCommons logo | Τα Wikimedia Commons έχουν πολυμέσα σχετικά με το θέμα   **Darcs** |

* Σελίδα του Darcs Αρχειοθετήθηκε 2017-12-27 στο Wayback Machine. (Αγγλικά)
* Εγχειρίδιο του Darcs Αρχειοθετήθηκε 2010-06-11 στο Wayback Machine. (Αγγλικά)
* Συνέντευξη με τον δημιουργό του darcs πάνω στην προέλευση του λογισμικού και στις ιδέες του (Αγγλικά)

  


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| π • σ • ε
Λογισμικό ελέγχου εκδόσεων |
| --- |
|  |
| 
Τα έτη, όπου υπάρχουν, δείχνουν πότε κυκλοφόρησε η πρώτη σταθερή έκδοση. Συστήματα των οποίων η ονομασία είναι σε *πλάγια γράμματα* δε συντηρούνται πια ή πρόκειται να τερματιστεί ο κύκλος ζωής τους. |
|  |
| Client-server | 

|  |  |
| --- | --- |
| Ελεύθερο / ανοικτό λογισμικό | 
* SCCS (1972)
* RCS (1982)
* CVS (1990)
* CVSNT (1998)
* Subversion (2000)
 |
|  |
| Κλειστό λογισμικό | 
* CCC/Harvest (1970s)
* ClearCase (1992)
* *Visual SourceSafe* (1994)
* Perforce (1995)
* Team Foundation Server (2005)
 |

 |  |
|  |
| Κατανεμημένος έλεγχος εκδόσεων | 

|  |  |
| --- | --- |
| Ελεύθερο / ανοικτό λογισμικό | 
* *GNU arch* (2001)
* Darcs (2002)
* DCVS (2002)
* *SVK* (2003)
* Monotone (2003)
* *Codeville* (2005)
* Git (2005)
* Mercurial (2005)
* Bazaar (2005)
* Fossil (2007)
 |
|  |
| Κλειστό λογισμικό | 
* *TeamWare* (δεκαετία 1990;)
* Code Co-op (1997)
* BitKeeper (1998)
* Plastic SCM (2006)
 |

 |
|  |
| Αρχές | 
* Branch
* Commit
* Delta compression
* diff
* Merge
* Tag
* Trunk
 |
|  |
| 
* Κατάλογος λογισμικού ελέγχου εκδόσεων
* Σύγκριση λογισμικού ελέγχου εκδόσεων
 |

 |