I was first introduced to darcs by Bruce D'Arcus and, to be honest, my first impression was "Yeah, yeah, you just like it cuz' it sounds like D'Arcus." Of course I was being sarcastic, but it still took me several months to finally be convinced to look into what he continued to rave about...
Guess what?
Bruce was right...
darcs Kicks Source Code Control A$$. As such, here is my top five(5) list as to the reasons why:
Reason #5 : It's built around the concept of Decentralization : Decentralization, a central(ironically) concept to Grid Computing, is something I personally believe to be a massive piece of our computing future. So why not start getting used to the idea by using the technologies available now that are built around these computing ideals instead of waiting until the future *IS* now and being forced to jump in head first just to get caught up.
Adding to this, any darcs repository can be a Master repository. So if I "get" (darcs is partially influenced by HTTP-based verbs [1]) a repository and "pull" down the patch updates from one repository I am not forever bound to that repository for any and all future updates. If a buddy and I want to work on a certain piece of a larger project over the weekend and we would rather get things working between the two of us first before updating the projects main repository, no problem. Just tell darcs to "pull" or "push" the patches from the a different location by appending it to the command line.
So instead of:
> darcs pull
You would type:
> darcs pull http://my.buddies.darcs/repo-location
or to push (via SSH, another reason Darcs Kicks Source Control A$$)
> darcs push http://my.buddies.darcs/repo-location
Of course, just because s/he "push"ed me changes doesn't mean I have to accept them. But I'll let you look into how and why this is important via the community wiki or manual, two well written and immensely helpful resources.
Reason #4 : It's simple. simple, Simple, SIMPLE! : Another way to say it might be darcs KISSes A$$, but ummm... maybe thats not quite the term David Roundy (darcs Inventor) would prefer people using. I won't go into the exact details as to what I mean as alluded to above, there is already fantastic documentation on the subject contained at the community wiki and in its manual. I highly recommend both as a good starting point for all things darcs.
Reason #3 : Numeral Versioning is GONE!. : Instead, versioning is based on the textual explanation as to whats different about it. In other words, when I create a new patch, instead of having the SCC engine take my text based explanation and attach it as a note, it uses what would be the note and makes that the focus. The internals of darcs will take care of knowing which patch was added and when, and you can certainly abstract that meta information if you so please, but what does a number tell me beyond "this one comes after that one?" At the command line (GUI Tools are beginning to be developed as well) darcs requires you to give each version a text-based description, and even allows for extended descriptions which it then attaches to the patch such that you can add an entire inventory of changes if there happens to be a significant number added since the last patch.
Now this doesn't mean because number-based versioning isn't a part of darcs that you can't version your releases. But I don't think I need to explain to anyone reading this blog why "released" software is different from "under-development" software. Obviously "Windows 'This patch contains the fixes to ... as well as all of these new features ...'" is not something the marketing department is going to be buying into anytime soon.[2] But as I mentioned there is a big difference between "released" software and "under-development" software. I can probably leave you to fill in the rest.
Reason #2 : Built in software delivery mechanism and email updates : When you first initialize a darcs repository it asks you for your email address. The purpose? Because of the decentralized nature of darcs, David Roundy built into darcs the ability for people to email patches to the person who created the repository (or at least to an email address set aside as the proper address for updates to be sent for this particular repository.)
In regards to software delivery mechanism, you just have to start using it and you will begin to see what I mean. Againg, its simple, Simple, SIMPLE!
SIMPLE!!!
Reason #1 : darcs is built using Haskell : As many people are beginning to understand because of the Linq and XLinq technologies recently announced by Microsoft (which have an extensive amount of Haskell influence, Erik Meijer, one of the central designers of Linq and XLinq is also one of Haskells language designers. Obviously this had an influence in Haskell finding its way into Linq and XLinq.) As Kurt recently stated in an IM conversation "Haskell is a helluva language!" Another good friend of mine, Dimitre Novatchev, stated a while back "I have Haskell and XSLT, why do I need anything else?" In case you don't already know, Dimitre's FXSL Functional Language Extensions for XSLT 1.0 and 2.0 are DEEPLY rooted in Haskell. Of course, any platform that has a Haskell compiler means that darcs will run on that platform. Last time I checked, that was a lot of platforms. ;)
I don't know about you, but when people like Dimitre, Erik Meijer, and Anders Hejlsberg spend as much time as they have building Haskell-like extensions into two of my top three favorite languages (Lisp, XSLT, C#, in that order :) I stop questioning and simply accept what they are telling me.
Now you might ask "If Dimitre, Erik, or Anders told you to go jump off a bridge, would you?" to which I would reply "Um, yeah..." with a "what are you, a fucking idiot"-based undertone to it.
'Nuff said.
---
[1] : A listing of darcs (1.0.3) verbs is as follows:
C:\Documents and Settings\M. David>darcs
darcs version 1.0.3 (release)
Usage: darcs COMMAND ...
Commands:
initialize Initialize a new source tree as a darcs repository.
get Create a local copy of another repository.
add Add one or more new files or directories.
remove Remove one or more files or directories from the repository.
mv Move/rename one or more files or directories.
whatsnew Display unrecorded changes in the working copy.
record Save changes in the working copy to the repository as a patch
unrecord Remove recorded patches without changing the working copy.
amend-record Replace a recorded patch with a better version.
revert Revert to the recorded version (safe the first time only).
unrevert Undo the last revert (may fail if changes after the revert).
pull Copy and apply patches from another repository to this one.
unpull Opposite of pull; unsafe if the patch is not in remote repo.
rollback Record an inverse patch without changing the working directory.
send Send by email a bundle of one or more patches.
apply Apply patches (from an email bundle) to the repository.
push Copy and apply patches from this repository to another one.
replace Replace a token with a new value for that token.
tag Tag the contents of the repository with a version name.
setpref Set a value for a preference (test, predist, ...).
diff Create a diff between two versions of the repository.
changes Gives a changelog style summary of the repo history.
annotate Display which patch last modified something.
optimize Optimize the repository.
check Check the repository for consistency.
resolve Mark any conflicts to the working copy for manual resolution.
dist Create a distribution tarball.
trackdown Locate the most recent version lacking an error.
repair Repair the corrupted repository.
Use 'darcs --extended-help' for more detailed help.
Use 'darcs COMMAND --help' for help on a single command.
Use 'darcs --version' to see the darcs version number.
Use 'darcs --exact-version' to get the exact version of this darcs instance.
---
[2] : Although, as Rory Blyth recently pointed out the following [seen at the PDC] “IT’S THE MOSTEST INNOVATIVEIST BIGGEREST EXPLODINGIST MAJOR COMPUTAR PROGRAMS ON THE PLANET THAT WILLS MAKE YOUR EYES POPS OUT OF YOUR HEAD AND GIVES YOU A TESTICULAR HERNIA WHEN YOU USE THE MOUSE TO MAKES THE FOLDARS OPEN BIG AND INNOVATIVELY(EST)!!!!” maybe the current Windows marketing department would at least be up to listening as to why this might be a better way to market software. Then again, if this is the kind of "versioning phrase" they would be willing to consider, then I think its best if you avoid explaining to them "well, yeah, we could do that if you really wanted to, but...". Trust me, no matter comes after the "but", once a marketing type hears "we could do that if you really wanted to" they're mind is already a million miles away and the "but" has absolutely no meaning at this stage, so don't waste your time. Better yet, never say "we could do that if you really wanted to" and instead "hmmm... thats an interesting idea... while I have my doubts, I guess if we pushed out the addition of [insert this particular marketing types favorite feature] for another couple of years we might be able to make it happen... but again, I have my doubts." Actually, you can probably just stop just after "pushed out the addition of [insert this particular marketing types favorite feature] for another couple of years" because, trust me, thats when they're going to get the "Ooohhh, no, we can't do that" look on their face and again, will stop listening to what comes after.
Just trying to help where I can ;)