I’ve been using darcs recently for some Haskell-related revision control tasks, as it’s the revision control tool of choice for the Haskell community (no surprise; it’s the most widely used Haskell program in existence). However, I can’t say I’ve been all that happy with darcs during my first few days of use. It has some behaviours that I think of as ill-considered, and not oriented towards making new users comfortable quickly. By default, “darcs record” (the equivalent of “commit” in other tools–why the different command name?) prompts me for every single hunk, to see if I really want to commit that hunk. The"-all" option records all hunks, but why is this not the default? It’s all very well that I can pick and choose hunks, but why isn’t by far the most frequent use case embodied in the default behaviour of the command? When I run “darcs record” without “-all”, darcs presents me with a prompt that is impressive in its opacity.

Shall I record this change? (1/?) [ynWsfqadjkc], or ? for help: I’ve rendered in bold the scary bit. I know that a prompt string like this is asking me to choose one of several single-character options. Normally, that’s fine; but in this case, yow! I have almost half the alphabet to choose from! Am I supposed to remember what the alphabet soup that isn’t “y” or “n” is for? And if I’m not expected to remember them, then why am I being prompted with them? Are they all equally important? And there’s still one more, truly obnoxious, piece of behaviour here. Unlike every other command line tool I’ve used in, well, as long as I can remember, darcs puts my terminal window into “cbreak” mode. What this means is that it responds immediately to a single keystroke, instead of waiting for me to hit the “return” key. Since every other tool that I use expects a keystroke followed by “return” when it prompts me in this way, that is how my muscle memory is trained: I type a key, I hit “return”. The result is that darcs treats what I intended to be one response as _two_–as responses to requests for handling two different hunks. The first hunk is handled however I specified, and darcs interprets the second as"do whatever the default action is on this hunk". Ugh. There’s one final thing about darcs record. When I’m done foontling about with hunks, it asks me “What is the patch name?” Being an open source hacker, I associate “patch name” with “the name of a patch file”, but once again I must translate peculiar darcs idiom into familiar revision control language: darcs really wants a one-line description of my change, not a file name. So that’s the “record” command (I have similar gripes with several other darcs commands, but let’s keep this thing short). These aren’t fatal problems (for the fatal problem with darcs, see question 1 in the darcs FAQ), but I find these behaviours to be weird and annoying at least; in the case of the terminal-diddling business, downright bad. Long-time darcs users have no doubt trained themselves to not notice this stuff; I suppose I’ll get there eventually.