Follow upstream changes -- rest
[git-darcs-import.git] / src / best_practices.tex
blobedfa6fde786978b96c02c013d6b1ecba9c523982
1 % This file (unlike the rest of darcs) is in the public domain.
4 \chapter{Best practices}
6 \section{Introduction}
8 This chapter is intended to review various scenarios and describe in each
9 case effective ways of using darcs. There is no one ``best practice'', and
10 darcs is a sufficiently low-level tool that there are many high-level ways
11 one can use it, which can be confusing to new users. The plan (and hope)
12 is that various users will contribute here describing how they use darcs in
13 different environments. However, this is not a wiki, and contributions
14 will be edited and reviewed for consistency and wisdom.
17 \section{Creating patches}
19 This section will lay down the concepts around patch creation.
20 The aim is to develop a way of thinking
21 that corresponds well to how darcs is behaving
22 --- even in complicated situations.
24 In a single darcs repository you can think of two ``versions'' of the source tree.
25 They are called the \emph{working} and \emph{pristine} trees.
26 \emph{Working} is your normal source tree, with or without darcs alongside.
27 The only thing that makes it part of a darcs repository
28 is the \verb!_darcs! directory in its root.
29 \emph{Pristine} is the recorded state of the source tree.
30 The pristine tree is constructed from groups of changes,
31 called {\em patches\/} (some other version control systems use the
32 term {\em changeset\/} instead of {\em patch\/}).\footnote{If
33 you look inside \_darcs you will find files or directories named
34 {\tt patches} and {\tt inventories}, which store all the patches
35 ever recorded. If the repository holds a cached pristine tree, it
36 is stored in a directory called {\tt pristine} or {\tt current\/};
37 otherwise, the fact that there is no pristine tree is marked
38 by the presence of a file called {\tt pristine.none} or {\tt
39 current.none}.}
40 Darcs will create and store these patches
41 based on the changes you make in \emph{working}.
44 \subsection{Changes}
45 If \emph{working} and \emph{pristine} are the same,
46 there are ``no changes'' in the repository.
47 Changes can be introduced (or removed) by editing the files in \emph{working}.
48 They can also be caused by darcs commands,
49 which can modify \emph{both} \emph{working} and \emph{pristine}.
50 It is important to understand for each darcs command
51 how it modifies \emph{working}, \emph{pristine} or both of them.
53 \verb!whatsnew! (as well as \verb!diff!) can show
54 the difference between \emph{working} and \emph{pristine} to you.
55 It will be shown as a difference in \emph{working}.
56 In advanced cases it need \emph{not} be \emph{working} that has changed;
57 it can just as well have been \emph{pristine}, or both.
58 The important thing is the difference and what darcs can do with it.
60 \subsection{Keeping or discarding changes}
61 If you have a difference in \emph{working}, you do two things
62 with it: \verb!record! it to keep it, or \verb!revert! it to lose the changes.%
63 \footnote{%
64 Revert can undo precious work in a blink.
65 To protect you from great grief,
66 the discarded changes are saved temporarily
67 so the latest revert can be undone with unrevert.}
69 If you have a difference between \emph{working} and \emph{pristine}%
70 ---for example after editing some files in \emph{working}---%
71 \verb!whatsnew! will show some ``unrecorded changes''.
72 To save these changes, use \verb!record!.
73 It will create a new patch in \emph{pristine} with the same changes,
74 so \emph{working} and \emph{pristine} are no longer different.
75 To instead undo the changes in \emph{working}, use \verb!revert!.
76 It will modify the files in \emph{working} to be the same as in \emph{pristine}
77 (where the changes do not exist).
80 \subsection{Unrecording changes}
81 \verb!unrecord! is a command meant to be run only in private
82 repositories. Its intended purpose is to allow developers the flexibility
83 to undo patches that haven't been distributed yet.
85 However, darcs does not prevent you from unrecording a patch that
86 has been copied to another repository. Be aware of this danger!
88 If you \verb!unrecord! a patch, that patch will be deleted from \emph{pristine}.
89 This will cause \emph{working} to be different from \emph{pristine},
90 and \verb!whatsnew! to report unrecorded changes.
91 The difference will be the same as just before that patch was \verb!record!ed.
92 Think about it.
93 \verb!record! examines what's different with \emph{working}
94 and constructs a patch with the same changes in \emph{pristine}
95 so they are no longer different.
96 \verb!unrecord! deletes this patch;
97 the changes in \emph{pristine} disappear and the difference is back.
99 If the recorded changes included an error,
100 the resulting flawed patch can be unrecorded.
101 When the changes have been fixed,
102 they can be recorded again as a new---hopefully flawless---patch.
104 If the whole change was wrong it can be discarded from \emph{working} too,
105 with \verb!revert!.
106 \verb!revert! will update \emph{working} to the state of \emph{pristine},
107 in which the changes do no longer exist after the patch was deleted.
109 Keep in mind that the patches are your history,
110 so deleting them with \verb!unrecord! makes it impossible to track
111 what changes you \emph{really} made.
112 Redoing the patches is how you ``cover the tracks''.
113 On the other hand,
114 it can be a very convenient way to manage and organize changes
115 while you try them out in your private repository.
116 When all is ready for shipping,
117 the changes can be reorganized in what seems as useful and impressive patches.
118 Use it with care.
120 All patches are global,
121 so don't \emph{ever} replace an already ``shipped'' patch in this way!
122 If an erroneous patch is deleted and replaced with a better one,
123 you have to replace it in \emph{all} repositories that have a copy of it.
124 This may not be feasible, unless it's all private repositories.
125 If other developers have already made patches or tags in their repositories
126 that depend on the old patch, things will get complicated.
129 \subsection{Special patches and pending}
131 The patches described in the previous sections have mostly been hunks.
132 A \emph{hunk} is one of darcs' primitive patch types,
133 and it is used to remove old lines and/or insert new lines.
134 There are other types of primitive patches,
135 such as \emph{adddir} and \emph{addfile}
136 which add new directories and files,
137 and \emph{replace}
138 which does a search-and-replace on tokens in files.
140 Hunks are always calculated in place with a diff algorithm
141 just before \verb!whatsnew! or \verb!record!.
142 But other types of primitive patches need to be explicitly created
143 with a darcs command.
144 They are kept in \emph{pending}%
145 \footnote{In the file {\tt\_darcs/patches/pending}.}
146 until they are either recorded or reverted.
148 \emph{Pending} can be thought of as a special extension of \emph{working}.
149 When you issue, e.g., a darcs \verb!replace! command,
150 the replace is performed on the files in \emph{working}
151 and at the same time a replace patch is put in \emph{pending}.
152 Patches in \emph{pending} describe special changes made in \emph{working}.
153 The diff algorithm will fictively apply these changes to \emph{pristine}
154 before it compares it to \emph{working},
155 so all lines in \emph{working} that are changed by a \verb!replace! command
156 will also be changed in \emph{pending}$+$\emph{pristine}
157 when the hunks are calculated.
158 That's why no hunks with the replaced lines will be shown by \verb!whatsnew!;
159 it only shows the replace patch in \emph{pending} responsible for the change.
161 If a special patch is recorded, it will simply be moved to \emph{pristine}.
162 If it is instead reverted, it will be deleted from \emph{pending}
163 and the accompanying change will be removed from \emph{working}.
165 Note that reverting a patch in pending is \emph{not} the same as
166 simply removing it from pending.
167 It actually applies the inverse of the change to \emph{working}.
168 Most notable is that reverting an addfile patch
169 will delete the file in \emph{working} (the inverse of adding it).
170 So if you add the wrong file to darcs by mistake,
171 \emph{don't} \verb!revert! the addfile.
172 Instead use \verb!remove!, which cancels out the addfile in pending.
175 \section{Using patches} % still basics
177 This section will lay down the concepts around patch distribution and branches.
178 The aim is to develop a way of thinking
179 that corresponds well to how darcs is behaving
180 --- even in complicated situations.
182 A repository is a collection of patches.
183 Patches have no defined order,
184 but patches can have dependencies on other patches.
185 Patches can be added to a repository in any order
186 as long as all patches depended upon are there.
187 Patches can be removed from a repository in any order,
188 as long as no remaining patches depend on them.
190 Repositories can be cloned to create branches.
191 Patches created in different branches may conflict.
192 A conflict is a valid state of a repository.
193 A conflict makes the working tree ambiguous until the conflict is resolved.
196 \subsection{Dependencies}
198 There are two kinds of dependencies:
199 implicit dependencies and explicit dependencies.
201 Implicit dependencies is the far most common kind.
202 These are calculated automatically by darcs.
203 If a patch removes a file or a line of code,
204 it will have to depend on the patch that added that file or line of code.\footnote{%
205 Actually it doesn't have to---in theory---,
206 but in practice it's hard to create ``negative'' files or lines in the working tree.
207 See the chapter about Theory of patches for other constraints.}
208 If a patch adds a line of code,
209 it will usually have to depend on the patch or patches that added the adjacent lines.
211 Explicit dependencies can be created if you give the \verb|--ask-deps| option to \verb|darcs record|.
212 This is good for assuring that logical dependencies hold between patches.
213 It can also be used to group patches---%
214 a patch with explicit dependencies doesn't need to change anything---%
215 and pulling the patch also pulls all patches it was made to depend on.
218 \subsection{Branches: just normal repositories}
220 Darcs does not have branches---it doesn't need to.
221 Every repository can be used as a branch.
222 This means that any two repositories are ``branches'' in darcs,
223 but it is not of much use unless they have a large portion of patches in common.
224 If they are different projects they will have nothing in common,
225 but darcs may still very well be able to merge them,
226 although the result probably is nonsense.
227 Therefore the word ``branch'' isn't a technical term in darcs;
228 it's just the way we think of one repository in relation to another.
230 Branches are \emph{very} useful in darcs.
231 They are in fact \emph{necessary} if you want to do more than only simple work.
232 When you \verb|get| someone's repository from the Internet,
233 you are actually creating a branch of it.
234 It may first seem inefficient (or if you come from CVS---frightening),
235 not to say plain awkward.
236 But darcs is designed this way, and it has means to make it efficient.
237 The answer to many questions about how to do a thing with darcs is: ``use a branch''.
238 It is a simple and elegant solution with great power and flexibility,
239 which contributes to darcs' uncomplicated user interface.
241 You create new branches (i.e., clone repositories)
242 with the \verb|get| and \verb|put| commands.
245 \subsection{Moving patches around---no versions}
247 Patches are global, and a copy of a patch either is or is not present in a branch.
248 This way you can rig a branch almost any way you like,
249 as long as dependencies are fulfilled---%
250 darcs \emph{won't} let you break dependencies.
251 If you suspect a certain feature from some time ago introduced a bug,
252 you can remove the patch/patches that adds the feature,
253 and try without it.\footnote{%
254 darcs even has a special command, {\tt trackdown}
255 that automatically removes patches
256 until a specified test no longer fails.}
258 Patches are added to a repository with \verb|pull|
259 and removed from the repositories with \verb|obliterate|.
260 Don't confuse these two commands with \verb|record| and \verb|unrecord|,
261 which constructs and deconstructs patches.
263 It is important not to lose patches when (re)moving them around.
264 \verb|pull| needs a source repository to copy the patch from,
265 whereas \verb|obliterate| just erases the patch.
266 Beware that if you obliterate \emph{all} copies of a patch
267 it is completely lost---forever.
268 Therefore you should work with branches when you obliterate patches.
269 The \verb|obliterate| command can wisely be disabled in a dedicated main repository
270 by adding \verb|obliterate disable| to the repository's defaults file.
272 For convenience, there is a \verb|push| command.
273 It works like \verb|pull| but in the other direction.
274 It also differs from \verb|pull| in an important way:
275 it starts a second instance of darcs to apply the patch in the target repository,
276 even if it's on the same computer.
277 It can cause surprises if you have a ``wrong'' darcs in your PATH.
280 \subsection{Tags---versions}
282 While \verb|pull| and \verb|obliterate| can be used to
283 construct different ``versions'' in a repository,
284 it is often desirable to name specific configurations of patches
285 so they can be identified and retrieved easily later.
286 This is how darcs implements what is usually known as versions.
287 The command for this is \verb|tag|,
288 and it records a tag in the current repository.
290 A tag is just a patch, but it only contains explicit dependencies.
291 It will depend on all the patches in the current repository.\footnote{%
292 It will omit patches already depended upon by other patches,
293 since they will be indirectly depended upon anyway.}
294 Darcs can recognize if a patch is as a tag;
295 tags are sometimes treated specially by darcs commands.
297 While traditional revision control systems tag versions in the time line history,
298 darcs lets you tag any configuration of patches at any time,
299 and pass the tags around between branches.
301 With the option \verb|--tag| to \verb|get| you can easily get
302 a named version in the repository
303 as a new branch.
306 \subsection{Conflicts}
308 This part of darcs becomes a bit complicated,
309 and the description given here is slightly simplified.
311 Conflicting patches are created when
312 you record changes to the same line in two different repositories.
313 Same line does \emph{not} mean the same line number and file name,
314 but the same line added by a common depended-upon patch.
316 If you are using a darcs-2 repository (Section \ref{initialize}),
317 darcs does \emph{not} consider two patches making the \emph{same} change to be a
318 conflict, much in the same fashion as other version control systems.
319 (The caveat here is two non-identical patches with some identical
320 changes may conflict. For the most part, darcs should just do what you
321 expect).
323 A conflict \emph{happens} when two conflicting patches meet in the same repository.
324 This is no problem for darcs; it can happily pull together just any patches.
325 But it is a problem for the files in \emph{working} (and \emph{pristine}).
326 The conflict can be thought of as
327 two patches telling darcs different things about what a file should look like.
329 Darcs escapes this problem
330 by ignoring those parts\footnote{%
331 The primitive patches making up the total patch.}
332 of the patches that conflict.
333 They are ignored in \emph{both} patches.
334 If patch~A changes the line ``FIXME'' to ``FIXED'',
335 and patch~B changes the same line to ``DONE'',
336 the two patches together will produce the line ``FIXME''.
337 Darcs doesn't care which one you pulled into the repository first,
338 you still get the same result when the conflicting patches meet.
339 All other changes made by A and B are performed as normal.
341 Darcs can mark a conflict for you in \emph{working}.
342 This is done with \verb|mark-conflicts|.
343 Conflicts are marked such that both conflicting changes
344 are inserted with special delimiter lines around them.
345 Then you can merge the two changes by hand,
346 and remove the delimiters.
348 When you pull patches,
349 darcs automatically performs a \verb|mark-conflicts| for you if a conflict happens.
350 You can remove the markup with \verb|revert|,
351 Remember that the result will be the lines from
352 the previous version common to both conflicting patches.
353 The conflict marking can be redone again with \verb|mark-conflicts|.
355 A special case is when a pulled patch conflicts with unrecorded changes in the repository.
356 The conflict will be automatically marked as usual,
357 but since the markup is \emph{also} an unrecorded change,
358 it will get mixed in with your unrecorded changes.
359 There is no guarantee you can revert \emph{only} the markup after this,
360 and \verb|resolve| will not be able to redo this markup later if you remove it.
361 It is good practice to record important changes before pulling.
363 \verb|mark-conflicts| can't mark complicated conflicts.
364 In that case you'll have to use \verb|darcs diff| and other commands
365 to understand what the conflict is all about.
366 If for example two conflicting patches create the same file,
367 \verb|mark-conflicts| will pick just one of them,
368 and no delimiters are inserted.
369 So watch out if darcs tells you about a conflict.
371 \verb|mark-conflicts| can also be used to check for unresolved conflicts.
372 If there are none, darcs replies ``No conflicts to resolve''.
373 While \verb|pull| reports when a conflict happens,
374 \verb|obliterate| and \verb|get| don't.
377 \subsection{Resolving conflicts}
379 A conflict is resolved
380 (not marked, as with the command \verb|mark-conflicts|)
381 as soon as some new patch depends on the conflicting patches.
382 This will usually be the resolve patch you record after manually putting together the pieces
383 from the conflict markup produced by \verb|mark-conflicts| (or \verb|pull|).
384 But it can just as well be a tag.
385 So don't forget to fix conflicts before you accidently ``resolve'' them by recording other patches.
387 If the conflict is with one of your not-yet-published patches,
388 you may choose to amend that patch rather than creating a resolve patch.
390 If you want to back out and wait with the conflict,
391 you can \verb|obliterate| the conflicting patch you just pulled.
392 Before you can do that you have to \verb|revert| the conflict markups
393 that \verb|pull| inserted when the conflict happened.
395 \section{Use a Global Cache}
397 When working with darcs 2 it is recommended to use a global cache, as this
398 is one of the biggest performance enhancing tools of darcs 2. The global
399 cache acts as a giant patch pool where darcs first looks for a patch when
400 grabbing new patches. This saves time by not downloading the same patch
401 twice from a remote server. It also saves space by storing the patch only
402 once, if you ensure your cache and your repositories are on the same
403 hardlink-supporting filesystem.
405 Darcs now enables a global patch cache under your home directory by default.
406 Older darcs 2.x versions required this manual step:
408 \begin{verbatim}
409 $ mkdir -p $HOME/.darcs/cache
410 $ echo cache:$HOME/.darcs/cache > $HOME/.darcs/sources
411 \end{verbatim}
413 In Windows, using \verb|cmd.exe| (Command Prompt under Accessories):
415 \begin{verbatim}
416 > md %UserProfile%\.darcs\cache
417 > echo cache:%UserProfile%\Application Data\darcs\cache > %UserProfile%\Application Data\darcs\sources
418 \end{verbatim}
420 There are some other advanced things you can do in \verb!_darcs/prefs/sources!,
421 such as create per-repository caches, read-only caches and even set a
422 primary source repository above any used in a \verb|darcs get| or
423 \verb|darcs pull| command.
425 \section{Distributed development with one primary developer}
426 \label{darcs-development-practices}
428 This is how darcs itself is developed. There are many contributors to
429 darcs, but every contribution is reviewed and manually applied by myself.
430 For this sort of a situation, \verb|darcs send| is ideal, since the barrier for
431 contributions is very low, which helps encourage contributors.
433 One could simply set the \verb!_darcs/prefs/email! value to the project
434 mailing list, but I also use darcs send to send my changes to the main
435 server, so instead the email address is set to
436 ``\verb!Davids Darcs Repo <droundy@abridgegame.org>!''. My
437 \verb-.procmailrc-
438 file on the server has the following rule:
439 \begin{verbatim}
441 * ^TODavids Darcs Repo
442 |(umask 022; darcs apply --reply darcs-devel@abridgegame.org \
443 --repodir /path/to/repo --verify /path/to/allowed_keys)
444 \end{verbatim}
445 This causes darcs apply to be run on any email sent to ``Davids Darcs
446 Repo''.
447 \verb'apply' actually applies them only if they are signed by an
448 authorized key. Currently, the only authorized key is mine, but of course
449 this could be extended easily enough.
451 The central darcs repository contains the following values in its
452 \verb!_darcs/prefs/defaults!:
453 \begin{verbatim}
454 apply test
455 apply verbose
456 apply happy-forwarding
457 \end{verbatim}
458 The first line tells apply to always run the test suite. The test suite is
459 in fact the main reason I use send rather than push, since it allows me to
460 easily continue working (or put my computer to sleep) while the tests are
461 being run on the main server. The second line is just there to improve the
462 email response that I get when a patch has either been applied or failed
463 the tests. The third line makes darcs not complain about unsigned patches,
464 but just to forward them to \verb!darcs-devel!.
466 On my development computer, I have in my \verb!.muttrc! the following
467 alias, which allows me to easily apply patches that I get via email
468 directly to my darcs working directory:
469 \begin{verbatim}
470 macro pager A "<pipe-entry>(umask 022; darcs apply --no-test -v \
471 --repodir ~/darcs)"
472 \end{verbatim}
475 \section{Development by a small group of developers in one office}
476 \label{dft-development-practices}
478 This section describes the development method used for the density
479 functional theory code DFT++, which is available at
480 \verb!http://dft.physics.cornell.edu/dft!.
482 We have a number of workstations which all mount the same \verb!/home! via NFS.
483 We created a special ``dft'' user, with the central repository living in that
484 user's home directory. The ssh public keys of authorized persons are added to
485 the ``dft'' user's \verb!.ssh/allowed_keys!, and we commit patches to this
486 repository using
487 \verb'darcs push'. As in Section~\ref{darcs-development-practices},
488 we have the central repository set to run the test suite before the push goes
489 through.
491 Note that no one ever runs as the dft user.
493 A subtlety that we ran into showed up in the running of the test suite.
494 Since our test suite includes the running of MPI programs, it must be run
495 in a directory that is mounted across our cluster. To achieve this, we set
496 the \verb!$DARCS_TMPDIR! % following is added to make emacs color right:$
497 environment variable to \verb!~/tmp!.
499 Note that even though there are only four active developers at the moment,
500 the distributed nature of darcs still plays a large role. Each developer
501 works on a feature until it is stable, a process that often takes quite a
502 few patches, and only once it is stable does he
503 \verb'push' to the central repository.
505 \section{Personal development}
507 It's easy to have several personal development trees using darcs, even
508 when working on a team or with shared code. The number and method of
509 using each personal tree is limited only by such grand limitations as:
510 your disk space, your imagination, available time, etc.
512 For example, if the central darcs repository for your development team
513 is $R_{c}$, you can create a local working directory for feature
514 $f_1$. This local working directory contains a full copy of $R_c$
515 (as of the time of the ``darcs get'' operation) and can be denoted
516 $R_1$. In the midst of working on feature $f_1$, you realize it
517 requires the development of a separate feature $f_2$. Rather than
518 intermingling $f_1$ and $f_2$ in the same working tree, you can create
519 a new working tree for working on $f_2$, where that working tree
520 contains the repository $R_2$.
522 While working on $f_2$, other developers may have made other changes;
523 these changes can be retrieved on a per-patch selection basis by
524 periodic ``darcs pull'' operations.
526 When your work on $f_2$ is completed, you can publish it for the use
527 of other developers by a ``darcs push'' (or ``darcs send'') from $R_2$
528 to $R_c$. Independently of the publishing of $f_2$, you can merge
529 your $f_2$ work into your $f_1$ working tree by a ``darcs pull $R_2$''
530 in the $R_1$ development tree (or ``darcs push'' from $R_2$ to $R_1$).
532 When your work on $f_1$ is completed, you publish it as well by a
533 ``darcs push'' from $R_1$ to $R_c$.
535 Your local feature development efforts for $f_1$ or $f_2$ can each
536 consist of multiple patches. When pushing or pulling to other trees,
537 these patches can either all be selected or specific patches can be
538 selected. Thus, if you introduce a set of debugging calls into the
539 code, you can commit the debugging code in a distictly separate patch
540 (or patches) that you will not push to $R_c$.
542 \subsection{Private patches}
544 As discussed in the section above, a developer may have various
545 changes to their local development repositories that they do not ever
546 wish to publish to a group repository (e.g. personal debugging code),
547 but which they would like to keep in their local repository, and
548 perhaps even share amongst their local repositories.
550 This is easily done via darcs, since those private changes can be
551 committed in patches that are separate from other patches; during the
552 process of pushing patches to the common repository ($R_c$), the
553 developer is queried for which patches should be moved to ($R_c$) on a
554 patch-by-patch basis.
556 The \verb!--complement! flag for the ``darcs pull'' operation can
557 further simplify this effort. If the developer copies (via ``darcs
558 push'' or ``darcs pull'') all private patches into a special
559 repository/working tree ($R_p$), then those patches are easily
560 disregarded for pulling by adding \verb!--complement! to the ``darcs
561 pull'' line and listing $R_p$ after the primary source repository.
563 The \verb!--complement! flag is only available for ``darcs pull'', and
564 not ``darcs push'' or ``darcs send'', requiring the user to have pull
565 access to the target repository. While the actual public repository
566 is often not shared in this manner, it's simple to create a local
567 version of the public repository to act as the staging area for that
568 public repository.
570 The following example extends the two feature addition example in the
571 previous section using a local staging repository ($R_l$) and a
572 private patch repository:
574 \begin{verbatim}
575 $ cd working-dir
576 $ darcs get http://server/repos/Rc Rl
578 $ darcs get Rl R1
579 $ cd R1
580 ...development of f1
581 $ darcs record -m'p1: f1 initial work'
583 $ darcs record -m'p2: my debugging tracepoints'
586 $ cd ..
587 $ darcs get http://server/repos/Rc R2
588 $ cd R2
589 $ darcs pull -p p2 ../R1
590 ... development of f2
591 $ darcs record -m'p3: f2 finished'
593 $ cd ..
594 $ darcs get Rl Rp
595 $ cd Rp
596 $ darcs pull -p p2 ../R2
598 $ cd ../Rl
599 $ darcs pull --complement ../R2 ../Rp
600 $ darcs send
601 ... for publishing f2 patches to Rc
603 $ cd ../R1
604 $ darcs pull ../R2
605 ... updates R1 with f2 changes from R2
606 ... more development of f1
607 $ darcs record -m'p4: f1 feature finished.'
609 $ cd ../Rl
610 $ darcs pull --complement ../R1 ../Rp
611 $ darcs send
612 \end{verbatim}