[Haskell-cafe] darcs upgrade HOWTO (was: poll: how can we help you contribute to darcs?)

zooko zooko at zooko.com
Thu Aug 21 12:59:29 EDT 2008

On Aug 5, 2008, at 0:26 AM, Ketil Malde wrote:

> The consequences of moving to the darcs-2 format are a bit unclear to
> me. For instance, I'd like to keep my main (export) repo in darcs-1
> format, in order to make it as accessible as possible (Ubuntu still
> ships with darcs-1.0.9, and that's a fairly cutting edge
> distribution.)  Can I convert my working repos to darcs-2?  Should I?
> How about darcs-hashed?  In short, I'd like to see examples of
> recommended migration strategies, and associated benefits.

Here's what I recommend, and what I've been doing for months, both  
with the large Tahoe code base -- http://allmydata.org/trac/tahoe and  
with numerous smaller codebases -- http://allmydata.org/trac .

1.  Upgrade any executables you have to the latest stable version of  
darcs immediately.  The new executables are fully backwards  
compatible -- you will not have any compatibility problems as a  
result of upgrading.  They are also much less buggy and faster than  
older darcs executables.

(There are at least two known issues with the darcs-2.0.2 executable  
which cause performance problems -- one is a issue with ghc v6.8.2  
and the other is an issue with the latest version of libcurl --  
v7.18.2.  Hopefully the darcs core team will release darcs-2.0.3 soon  
to fix these two issues, but even if darcs-2.0.2 is still the current  
version, I recommend it over any previous version.)

If your use of darcs is currently satisfying (fast enough, no bugs  
getting in your way), then stop at this step.  You are now using the  
latest stable darcs executable while using old-fashioned darcs-v1  
repositories.  Other people who are using older versions of darcs can  
continue to share patches with your repositories just like always.

2.  If there are problems with this situation of using darcs-2  
executables and darcs-1-format repositories, then report it to the  
darcs-users mailing list, and then make a new hashed-format  
repository in parallel with your existing darcs-1-format repository,  
like this:

darcs get --hashed ${repo} ${repo}-hashedformat

Now people who have new darcs-v2 can push and pull to the - 
hashedformat repository and people who have darcs-v1 can continue to  
push and pull to the original repository.  You can transfer patches  
between those repositories with normal darcs push and pull.  For  
those projects of mine which have a high rate of patches I have gone  
ahead and added post-apply hooks to automatically do a "push --all"  
to the other one, like this:

echo "apply posthook darcs push --all --repodir=/home/source/darcs/ 
tahoe/${repo}-hashedformat /home/source/darcs/tahoe/${repo}" >> $ 
echo "apply run-posthook" >> ${repo}-hashedformat/_darcs/prefs/defaults

echo "apply posthook darcs push --all --repodir=/home/source/darcs/ 
tahoe/${repo} /home/source/darcs/tahoe/${repo}-hashedformat" >> $ 
echo "apply run-posthook" >> ${repo}/_darcs/prefs/defaults

(Note that this is mutually recursive, but it terminates because the  
post-apply hook doesn't trigger in the case that zero patches were  

If your use of darcs is currently satisfying then stop at this step.   
You are now using the latest stable darcs executable, and maintaining  
two darcs repositories -- an old-fashioned darcs-1-format repository  
for your darcs-1-executable-using friends and a hashed-format  
repository for your darcs-2-executable using friends.  Your post- 
apply hooks cause these two repositories to get automatically synced  
with each other.

3.  If there are problems with this situation of using darcs-2  
executables and a pair of repos -- one of which is darcs-1-format  
repo for the use of darcs-1-executable-using users and the other of  
which is a hashed-format repo for the use of darcs-2-executable-using  
users -- then report it to the darcs-users mailing list and await  
further instructions.

Note that these instructions do not involve any use of darcs-2-format  
repositories.  Those are only for projects which (a) have no darcs-1- 
executable-using users, and (b) have no extant branches stored in  
darcs-1-format or hashed-format repositories.  Personally step 2 has  
satisfied all my needs so I use the step 2 strategy for all my  
publicly shared repositories, although I do tend to create new  
private repositories with darcs-2-format.

If someone wants to adapt this message to the darcs wiki I would be  



http://allmydata.org -- Tahoe, the Least-Authority Filesystem
http://allmydata.com -- back up all your files for $5/month

More information about the Haskell-Cafe mailing list