Sun Apr 12 13:58:10 CEST 2009 [email protected] * Edit Front Page
Sun Apr 12 13:58:53 CEST 2009 [email protected] * Add Contribute page Sun Apr 12 14:00:00 CEST 2009 [email protected] * Add Editing page Sun Apr 12 14:00:23 CEST 2009 [email protected] * Add Easy page. Sun Apr 12 14:00:55 CEST 2009 [email protected] * Add Download page. Sun Apr 12 14:01:27 CEST 2009 [email protected] * Addd Smart Patches page. Sun Apr 12 14:02:00 CEST 2009 [email protected] * Add Patch Theory directory. Sun Apr 12 14:02:35 CEST 2009 [email protected] * Add Path Theory Index page. Sun Apr 12 14:03:22 CEST 2009 [email protected] * Add Patch Theory Intro page. Sun Apr 12 14:03:42 CEST 2009 [email protected] * Add Patch Theory Examples Revisited page.
New patches: [Edit Front Page [email protected]**20090412115810] hunk ./Front\32\Page.page 1 -Welcome to the Darcs Weekly News test wiki! +What is Darcs? +============== +Darcs is a free, open source, source code management system with many +fabulous features: hunk ./Front\32\Page.page 6 -We are experimenting with a darcs-based instantiation of the gitit wiki engine. +- **[Distributed]()** - Every user has access to the full command set. You can +save, commit, branch and merge without ever connecting to a central server. hunk ./Front\32\Page.page 9 -You can retrieve the darcs repository behind this wiki with - darcs get http://darcs.net/test-wiki +- **[Smart](Smart Patches)** - **Smart Patches** is what makes darcs stand out +above the rest. You can cherrypick, merge, apply patches in different orders, +modify patches and Darcs will know how to do it. With darcs, you can apply patches +in any order and you will always get the same result. + +- **[Easy]()** - Easy to learn. Easy to use. Easy branches. Easy merging. hunk ./Front\32\Page.page 16 -And send patches in the usual way (darcs record followed by darcs send). +<center>***Darcs is clever for you so you don't have to be...***</center> + +Test this wiki +============== +You can retrieve the darcs repository behind this wiki with hunk ./Front\32\Page.page 22 -Note that the access code is "lambda". +> darcs get http://darcs.net/test-wiki [Add Contribute page [email protected]**20090412115853] addfile ./Contribute.page hunk ./Contribute.page 1 +*[note: this page is a merger of FrontPage and HowToHelp]* + +We are always looking for new volunteers. You don't have to be a Haskell geek +to contribute. There is always a need for documentation, bug finding, etc. + +Documentation +============= +There is always a need for complete, clear, easy to understand documentation. +To start, you should read the [Editing]() page to learn how to edit a Gitit +wiki. Then write to the users list saying that you wish to contribute. + +Bugs and ideas +============== +You can contribute by just using Darcs in your own projects and reporting bugs +and ideas. You can also help by sorting through existing bugs and ideas. For +example, you can help us triage bugs and you can help organize and develop the +darcs ideas. + +**Submit a bug**: Bonus points if you can produce a shell script that reproduces +the bug, so we can add it to our test suite, and thus reduce the danger of the +same bug reappearing later. Bugs should be reported in the +[darcs bug tracker](http://bugs.darcs.net/). + +**Triage bugs**: Help sort bugs by level of importance ([learn more](BugTracker)). +If there are no new bugs to triage, look for stale bug reports or check up on +people we need follow-ups from, etc. + +**Ideas**: Ideas for darcs should be added to the [ideas for darcs](IdeasForDarcs) +page where they can be developed. Or you can add a wish list item to the +[bug tracker](http://bugs.darcs.net/). + +It is probably worth while writing to the users list to point out the bug or +to discuss your idea. + + +Development +=========== + +New developers +-------------- + +All developers +-------------- [Add Editing page [email protected]**20090412120000] addfile ./Editing.page hunk ./Editing.page 1 +This page explains things you need to know to contribute to the Darcs wiki. + +# Markdown + +This wiki's pages are written in [pandoc]'s extended form of [markdown]. +If you're not familiar with markdown, you should start by looking +at the [markdown "basics" page] and the [markdown syntax description]. +Consult the [pandoc User's Guide] for information about pandoc's syntax +for footnotes, tables, description lists, and other elements not present +in standard markdown. + +[pandoc]: http://johnmacfarlane.net/pandoc +[pandoc User's Guide]: http://johnmacfarlane.net/pandoc/README.html +[markdown]: http://daringfireball.net/projects/markdown +[markdown "basics" page]: http://daringfireball.net/projects/markdown/basics +[markdown syntax description]: http://daringfireball.net/projects/markdown/syntax + +Markdown is pretty intuitive, since it is based on email conventions. +Here are some examples to get you started: + +<table> +<tr> +<td>`*emphasized text*`</td> +<td>*emphasized text*</td> +</tr> +<tr> +<td>`**strong emphasis**`</td> +<td>**strong emphasis**</td> +</tr> +<tr> +<td>`` `literal text` ``</td> +<td>`literal text`</td> +</tr> +<tr> +<td>`\*escaped special characters\*`</td> +<td>\*escaped special characters\*</td> +</tr> +<tr> +<td>`[external link](http://google.com)`</td> +<td>[external link](http://google.com)</td> +</tr> +<tr> +<td>``</td> +<td></td> +</tr> +<tr> +<td>Wikilink: `[Front Page]()`</td> +<td>Wikilink: [Front Page]()</td> +</tr> +<tr> +<td>`H~2~O`</td> +<td>H~2~O</td> +</tr> +<tr> +<td>`10^100^`</td> +<td>10^100^</td> +</tr> +<tr> +<td>`~~strikeout~~`</td> +<td>~~strikeout~~</td> +</tr> +<tr> +<td> +`$x = \frac{{ - b \pm \sqrt {b^2 - 4ac} }}{{2a}}$` +</td> +<td> +$x = \frac{{ - b \pm \sqrt {b^2 - 4ac} }}{{2a}}$^[If this looks like +code, it's because jsMath is +not installed on your system. Contact your administrator to request it.] +</td> +</tr> +<tr> +<td> +`A simple footnote.^[Or is it so simple?]` +</td> +<td> +A simple footnote.^[Or is it so simple?] +</td> +</tr> +<tr> +<td> +<pre> +> an indented paragraph, +> usually used for quotations +</pre> +</td> +<td> + +> an indented paragraph, +> usually used for quotations + +</td> +<tr> +<td> +<pre> + #!/bin/sh -e + # code, indented four spaces + echo "Hello world" +</pre> +</td> +<td> + + #!/bin/sh -e + # code, indented four spaces + echo "Hello world" + +</td> +</tr> +<tr> +<td> +<pre> +* a bulleted list +* second item + - sublist + - and more +* back to main list + 1. this item has an ordered + 2. sublist + a) you can also use letters + b) another item +</pre> +</td> +<td> + +* a bulleted list +* second item + - sublist + - and more +* back to main list + 1. this item has an ordered + 2. sublist + a) you can also use letters + b) another item + +</td> +</tr> +<tr> +<td> +<pre> +Fruit Quantity +-------- ----------- +apples 30,200 +oranges 1,998 +pears 42 + +Table: Our fruit inventory +</pre> +</td> +<td> + +Fruit Quantity +-------- ----------- +apples 30,200 +oranges 1,998 +pears 42 + +Table: Our fruit inventory + +</td> +</tr> +</table> + +For headings, prefix a line with one or more `#` signs: one for a major heading, +two for a subheading, three for a subsubheading. Be sure to leave space before +and after the heading. + + # Markdown + + Text... + + ## Some examples... + + Text... + +## Wiki links + +Links to other wiki pages are formed this way: `[Page Name]()`. +(Gitit converts markdown links with empty targets into wikilinks.) + +To link to a wiki page using something else as the link text: +`[something else](Page Name)`. + +Note that page names may contain spaces and some special characters. +They need not be CamelCase. CamelCase words are *not* automatically +converted to wiki links. + +Wiki pages may be organized into directories. So, if you have +several pages on wine, you may wish to organize them like so: + + Wine/Pinot Noir + Wine/Burgundy + Wine/Cabernet Sauvignon + +Note that a wiki link `[Burgundy]()` that occurs inside the `Wine` +directory will link to `Wine/Burgundy`, and not to `Burgundy`. +To link to a top-level page called `Burgundy`, you'd have to use +`[Burgundy](/Burgundy)`. + +# Creating and modifying pages + +## Registering for an account + +In order to modify pages, you'll need to be logged in. To register +for an account, just click the "register" button in the bar on top +of the screen. You'll be asked to choose a username and a password, +which you can use to log in in the future by clicking the "login" +button. While you are logged in, these buttons are replaced by +a "logout so-and-so" button, which you should click to log out +when you are finished. + +Note that logins are persistent through session cookies, so if you +don't log out, you'll still be logged in when you return to the +wiki from the same browser in the future. + +## Editing a page + +To edit a page, just double-click it, or click the "edit" button at +the bottom right corner of the page. + +You can click "Preview" at any time to see how your changes will look. +Nothing is saved until you press "Save." + +Note that you must provide a description of your changes. This is to +make it easier for others to see how a wiki page has been changed. + +## Creating a new page + +To create a new page, just create a wiki link that links to it, and +click the link. If the page does not exist, you will be editing it +immediately. + +## Reverting to an earlier version + +If you click the "history" button at the bottom of the page, you will +get a record of previous versions of the page. You can see the differences +between two versions by dragging one onto the other; additions will be +highlighted in yellow, and deletions will be crossed out with a horizontal +line. Clicking on the description of changes will take you to the page +as it existed after those changes. To revert the page to the revision +you're currently looking at, just click the "revert" button at the bottom +of the page, then "Save". + +## Deleting a page + +The "delete" button at the bottom of the page will delete a page. Note +that deleted pages can be recovered, since a record of them will still be +accessible via the "activity" button on the top of the page. + +# Uploading files + +To upload a file--a picture, a PDF, or some other resource--click the +"upload" button in the navigation bar. You will be prompted to select +the file to upload. As with edits, you will be asked to provide a +description of the resource (or of the change, if you are overwriting +an existing file). + +Often you may leave "Name on wiki" blank, since the existing name of the +file will be used by default. If that isn't desired, supply a name. +Note that uploaded files *must* include a file extension (e.g. `.pdf`). + +If you are providing a new version of a file that already exists on the +wiki, check the box "Overwrite existing file." Otherwise, leave it +unchecked. + +To link to an uploaded file, just use its name in a regular markdown link. +For example, if you uploaded a picture `fido.jpg`, you can insert the +picture into a page using the markdown: ``. +If you uploaded a PDF `projection.pdf`, you can insert a link to it +using: `[projection](projection.pdf)`. + [Add Easy page. [email protected]**20090412120023] addfile ./Easy.page hunk ./Easy.page 1 +Easy Branches +============= +<table> + <tr> + <td>How do you make a branch?</td> + <td><pre>cp -r dir1 dir2</pre></td> + </tr> + <tr> + <td>Really?</td> + <td>Yes. In darcs every copy of a repository is a branch.</td> + </tr> +</table> + +Easy Merging +============ +<table> + <tr> + <td>How do you update a repo?</td> + <td><pre>darcs pull <remote-repo></pre></td> + </tr> + <tr> + <td>How do you merge branches?</td> + <td><pre>darcs pull <remote-repo></pre></td> + </tr> + <tr> + <td>Aren't those the same command?</td> + <td>Yes. Because every copy is a branch, updating and merging are the same thing.</td> + </tr> +</table> + +Cheatsheet for CVS users +======================== +<table> + <tr> + <td>Initialize a repository</td> + <td>`darcs init`</td> + <td>`cvs -d /cvsroot init`</td> + </tr> + <tr> + <td>Download a repo</td> + <td>`darcs get`</td> + <td>`cvs update`</td> + </tr> + <tr> + <td>Download remote changes</td> + <td>`darcs pull`</td> + <td>`cvs update`</td> + </tr> + <tr> + <td>Add a file/directory</td> + <td>`darcs add`</td> + <td>`cvs add`</td> + </tr> + <tr> + <td>Undo local changes</td> + <td>`darcs revert foo.c`</td> + <td>`rm foo.c && cvs update foo.c`</td> + </tr> + <tr> + <td>Save changes locally</td> + <td>`darcs record`</td> + <td rowspan="2">CVS cannot save changes locally.<br/>`cvs commit` saves to the server.</td> + </tr> + <tr> + <td>Send local changes</td> + <td>`darcs push`</td> + </tr> + <tr> + <td>Undo save</td> + <td>`darcs unrecord`</td> + <td>**N/A**</td> + </tr> + <tr> + <td>Remove a patch</td> + <td>`darcs obliterate`</td> + <td>**N/A**</td> + </tr> +</table> + [Add Download page. [email protected]**20090412120055] addfile ./Download.page hunk ./Download.page 1 +*[note: This merges CompilingOnCygwin, Binaries and part of the darcs manual]* + +The current stable release is darcs 2.2, released in January 2009. + +Microsoft Windows +================= +Note: If you need SSH support, see [WindowsConfiguration](). +<table> + <tr> + <th>Type</th> + <th>Version</th> + <th>Notes</th> + </tr> + <tr> + <td>Without Cygwin</td> + <td>[2.2.1](http://homepage.mac.com/kirby81_it/darcs/darcs-2.2.1-win1.zip)</td> + <td>With Curl.</td> + </tr> + <tr> + <td>Without Cygwin</td> + <td>[2.2.0](http://testgrid.allmydata.org:3567/uri/URI:DIR2-RO:bminllzdrpadzvyt54cbhotnam:jqafknaedfksjjq3xmkfpe4g4ppklctw3xwpszufol7zddyx5agq/darcsdir-w32-2.2.0.zip)</td> + <td>With SSH support files.</td> + </tr> + <tr> + <td>With Cygwin</td> + <td>[2.2.0](http://testgrid.allmydata.org:3567/uri/URI:DIR2-RO:bminllzdrpadzvyt54cbhotnam:jqafknaedfksjjq3xmkfpe4g4ppklctw3xwpszufol7zddyx5agq/darcsdir-cygwin-2.2.0.tar.bz2)</td> + <td>With SSH support files.</td> + </tr> +</table> + +Mac OS X +======== +<table> + <tr> + <th>Type</th> + <th>Version</th> + <th>Notes</th> + </tr> + <tr> + <td>Intel binary</td> + <td>[2.2.1](http://dark.ly/darcs-2.2.1-i386-darwin.bz2)</td> + <td>Requires Mac OS 10.5.</td> + </tr> + <tr> + <td>Intel binary</td> + <td>[2.1.2](http://www.fivesquaresoftware.com/code/Darcs-2.1.2-x86.mpkg.zip)</td> + <td>Supports Mac OS 10.4 and 10.5.<br/>Includes documentation and the bash completion file.</td> + </tr> + <tr> + <td>Fink (Intel and PPC)</td> + <td>[2.0.2](http://pdb.finkproject.org/pdb/package.php/darcs)</td> + <td>Requires Mac OS 10.4 or 10.5.</td> + </tr> + <tr> + <td>MacPorts</td> + <td>[2.2.0](http://trac.macports.org/browser/trunk/dports/devel/darcs)</td> + <td>If you don't have `perl` and `ghc` from MacPorts, it'll compile them.<br/>That can take several hours.</td> + </tr> + <tr> + <td>PPC binary</td> + <td>[1.0.9](http://www.fivesquaresoftware.com/code/Darcs-2.1.2-x86.mpkg.zip)<br/>(Older version)</td> + <td>Requires Mac OS 10.5<br/>Includes documentation and the bash completion file.</td> + </tr> + <tr> + <td>PPC binary</td> + <td>[1.0.9rc2](http://www.accela.net/~lucca/darcs-1.0.9rc2-macos10.4-ppc.tar.gz)<br/>(Older version)</td> + <td>Requires Mac OS 10.4 or 10.5.</td> + </tr> +</table> + +GNU/Linux +========= +*[note: distributions sorted according to Distrowatch]* +<table> + <tr> + <th colspan="2">Install option</th> + <th>Notes</th> + </tr> + <tr> + <td>Static binary</td> + <td>[2.2.1](http://repos.mornfall.net/darcs/darcs-2.2.0-ghc6.10-libwww-static.bin)</td> + <td>Should work in all versions of Linux.</td> + </tr> + <tr> + <td>Ubuntu</td> + <td><pre>apt-get install darcs</pre></td> + <td>You need to enable Universe.</td> + </tr> + <tr> + <td>openSUSE</td> + <td>[2.2.0](http://download.opensuse.org/repositories/devel:/tools:/scm/)<br/>(Older version)</td> + <td>For SLES9, SLES10 , 9.3, 10, 10.1, Factory</td> + </tr> + <tr> + <td>Fedora</td> + <td><pre>yum install darcs</pre></td> + <td>Darcs is located in [Fedora Extras](http://fedoraproject.org/wiki/Extras/UsingExtras)</td> + </tr> + <tr> + <td>Debian</td> + <td><pre>apt-get install darcs</pre></td> + <td></td> + </tr> + <tr> + <td>Mandriva</td> + <td><pre>urpmi darcs<br/>## Optional:<br/>urpmi bash-completion</pre></td> + <td>Ensure your urpmi is setup with contrib.</td> + </tr> + <tr> + <td>Arch Linux</td> + <td><pre>pacman -Sy darcs</pre></td> + <td></td> + </tr> + <tr> + <td>Gentoo</td> + <td><pre>emerge darcs</pre></td> + <td></td> + </tr> + <tr> + <td>Crux Linux</td> + <td> +<pre> +cd /etc/ports +wget http://yhafri.club.fr/crux/yhafri.httpup +prt-get depinst httpup && ports -u +prt-get depinst ilenia && ilenia -U darcs</pre> +</td> + <td></td> + </tr> + <tr> + <td>Frugalware</td> + <td><pre>pacman-g2 -Sy darcs</pre></td> + <td></td> + </tr> + <tr> + <td>GoboLinux</td> + <td><pre>Compile darcs</pre></td> + <td></td> + </tr> +</table> + +Unix +==== + +<table> + <tr> + <th colspan="2">Install option</th> + <th>Notes</th> + </tr> + <tr> + <td>FreeBSD</td> + <td><pre>pkg_add -r darcs</pre></td> + <td>This may download and install other Haskell related ports.</td> + </tr> + <tr> + <td>NetBSD</td> + <td>Use pkgsrc. Darcs is located in pkgsrc/devel/darcs.</td> + <td>On x86, the static Linux binary works if you have COMPAT_LINUX.</td> + </tr> + <tr> + <td>OpenBSD</td> + <td>[2.1.0](http://teratorn.org/code/darcs-2.1.0-openbsd-i386.tar.gz) (dynamically linked binary).</td> + <td>Compiled with GHC 6.8.3 on OpenBSD 4.2.</td> + </tr> + <tr> + <td>OpenBSD</td> + <td>[2.1.0](http://teratorn.org/code/darcs-2.1.0-openbsd-i386-static.tar.gz) (statically linked binary).</td> + <td>Compiled with GHC 6.8.3 on OpenBSD 4.2.</td> + </tr> + <tr> + <td>DragonFlyBSD</td> + <td><pre>cd /usr/pkgsrc/devel/darcs && bmake install</pre></td> + <td>GHC is currently broken. Use a Linux binary.</td> + </tr> + <tr> + <td>Solaris Sparc</td> + <td>[1.0.8](http://www.accela.net/~lucca/darcs-1.0.8-solaris9-sparc.tar.gz) (Older version)</td> + <td>Dynamic and static binaries. GCC 2.95, GHC 6.4.1, Solaris 9</td> + </tr> +</table> + +Compiling from Source +===================== +Darcs is written in [Haskell](http://www.haskell.org/), and to build it you +need the Glasgow Haskell Compiler ([GHC](http://www.haskell.org/ghc/download.html)) +version 6.6 or later (see also [Installing GHC](http://www.haskell.org/ghc/docs/latest/html/users_guide/installing-bin-distrib.html)). + +Download the sources: + +<table> + <tr> + <th colspan="2">Download option</th> + <th>Notes</th> + </tr> + <tr> + <td>Tar Ball</td> + <td>[2.2.0](http://darcs.net/darcs-2.2.0.tar.gz)</td> + <td></td> + </tr> + <tr> + <td>Darcs repository</td> + <td><pre>darcs get --lazy http://darcs.net/</pre></td> + <td>You need to have darcs 2 already.</td> + </tr> +</table> + +Compile Darcs: + +<table> + <tr> + <th>Target</th> + <th>Instructions</th> + <th>Notes</th> + </tr> + <tr> + <td>Mac OS X</td> + <td>Install the Apple Developer Tools and the ghc 6.6 package. Then follow the instructions for Unix/Linux.</td> + <td></td> + </tr> + <tr> + <td>Unix/Linux</td> + <td> +<pre> +./configure +make +# Optional, but recommended +make test +make install +</pre> + +If your header files are installed in a non-standard location, you may need to +define the CFLAGS and CPPFLAGS environment variables. e.g. on NetBSD, you may need: +<pre> +CFLAGS=-I/usr/pkg/include +CPPFLAGS=-I/usr/pkg/include +</pre> +</td> + <td> +**Prerequisites**: You need GHC, and probably GCC and GNU Make.<br/><br/> +**Notes about Solaris**:<br/> +* Use GCC 2.95 or 3.4+.<br/> +* You may need add `-lposix4 -lpthread` to the LDFLAGS before ./configure<br/> +* You may experience problems unless you configure with `--disable-optimize --disable-mmap`.</td> + </tr> + <tr> + <td>Cygwin</td> + <td> +**Compile zlib**:<br/> +Download [zlib](http://www.zlib.net/) and put it in a directory +without spaces. Then run: +<pre> +cd c:/path/to/zlib/source +export CC=c:/ghc/ghc-6.2.2/gcc.exe +./configure +make +</pre> +**Compile darcs**: +<pre> +export CC=c:/ghc/ghc-6.2.2/gcc.exe +export CPPFLAGS=-Ic:/path/to/zlib/source +export LDFLAGS=-Lc:/path/to/zlib/source +autoconf +./configure --without-libcurl --target=mingw +make +</pre> +</td> + <td> +**Prerequisites**: You need ghc. We will assume that ghc is installed in `c:/ghc/ghc-6.2.2`. +<br/> +**Important**: You must use the gcc that ships with ghc, not cygwin's native gcc. +</td> + </tr> + <tr> + <td>FreeBSD</td> + <td><pre>cd /usr/ports/devel/darcs<br/>make [-DWITH_SERVER] install</pre></td> + <td>Be sure to use gmake instead of make.<br/>If you install the server, the CGI executable is `/usr/local/libexec/darcs/cgi-bin/darcs`, and the config file is `/usr/local/etc/darcs/darcs/cgi.conf`.</td> + </tr> + <tr> + <td>NetBSD</td> + <td>Use pkgsrc to install binary or build Darcs from sources. Darcs is + in directory pkgsrc/devel/darcs.</td> + <td></td> + </tr> +</table> + [Addd Smart Patches page. [email protected]**20090412120127] addfile ./Smart\32\Patches.page hunk ./Smart\32\Patches.page 1 +*[note: this page merges content from WhyYouWantPatchTheory and PatchTheoryExample]* + +Smart Patches are coolest feature that darcs has to offer. They are key to +Darcs' ease of use, easy branching and easy merging. + +Basic concept +============= +If you just want to use darcs, this is all you need to know about Smart Patches. +Say you have the stable branch with three patches (let's call them A, B and C) in it: + +> Stable: A B C + +You create a development branch based on that and add some new patches: + +> Devel: A B C D E F + +Now you notice that F is an important bugfix that should go into the next stable +release. But maybe F depends on some stuff you added with D, or with E? Darcs +can figure out if a patch depends on another, and it can figure out how to +adapt F to a branch without the other patches. + +<center>*Darcs will **always** find the smallest set of patches needed to +satisfy dependencies.*</center> +<center>*Darcs does not need to ask you what other patches it needs.*</center> +<br/> +Darcs may need to make changes to F to make it fit in the stable branch (e.g. +change line numbers). We call the new patch F' because it does the +same thing as F but in the context of a different tree: + +> Stable: A B C F' + +<center>*The idea of transforming patches (e.g. F to F') depending on context<br/> +is the key idea behind darcs' Smart Patches.*</center> + + +Example 1: Your first merge +=========================== +Suppose that we are working on a recipe for scrambled eggs. We have the file +`recipe.txt`: + +<blockquote> +<pre> +Break the egg shells. +Whisk the raw eggs into a homogeneous liquid. +Pour into a hot greased pan. +Stir until cooked. +</pre> +</blockquote> + +Now suppose that Alice and Bob each add an item to the list independently. +Alice adds the following patch: + +<table> + <tr> + <th>Patch A</th><th>Resulting file</th> + </tr> + <tr> +<td> +<blockquote> +<pre> +recipe.txt 3 ++ Add salt. +</pre> +</blockquote> +</td> +<td> +<blockquote> +<pre> +Break the egg shells. +Whisk the raw eggs into a homogeneous liquid. +<b>Add salt.</b> +Pour into a hot greased pan. +Stir until cooked. +</pre> +</blockquote> +</td> + </tr> +</table> + +Meanwhile, Bob adds the following patch: + +<table> + <tr> + <th>Patch B</th><th>Resulting file</th> + </tr> + <tr> +<td> +<blockquote> +<pre> +recipe.txt 5 ++ Serve and eat. +</pre> +</blockquote> +</td> +<td> +<blockquote> +<pre> +Break the egg shells. +Whisk the raw eggs into a homogeneous liquid. +Pour into a hot greased pan. +Stir until cooked. +<b>Serve and eat.</b> +</pre> +</blockquote> +</td> + </tr> +</table> + + +What happens when Alice pulls patch B? If we leave B as it is we will insert +"Serve and eat" before "Stir until cooked". Darcs figures out that it needs +to modify B a little to make it work for Alice. We call the new patch B': + +<table> + <tr> + <th>Patch B'</th><th>Combined with Alice's patch</th> + </tr> + <tr> +<td> +<blockquote> +<pre> +recipe.txt 6 ++ Serve and eat. +</pre> +</blockquote> +</td> +<td> +<blockquote> +<pre> +Break the egg shells. +Whisk the raw eggs into a homogeneous liquid. +Add salt. +Pour into a hot greased pan. +Stir until cooked. +<b>Serve and eat.</b> +</pre> +</blockquote> +</td> + </tr> +</table> + +<center>*The ability to turn B into B' reliably and predictably is the core<br/> +feature of darcs' Smart Patches*</center> +<br/> +Darcs' Smart Patches are built upon a solid mathematical foundation called +[Patch Theory](Patch Theory/Index). But you don't need to know Patch Theory to use +darcs. You only need to know that darcs will be reliable and predictable. + +Example 2: Where other SCMs fear to thread +========================================== +This patch-oriented view is unique to darcs. The ability to transform patches +to apply to a different source tree allows darcs to correctly deal with some +situations which other SCMs would get wrong. Consider the following example +using `git` (nothing against Git): + +<table> + <tr> + <th>Git</th><th>Darcs</th><th>Notes</th> + </tr> +<tr> +<td> +<blockquote> +<pre> +mkdir b1 +cd b1 +git init +echo 1 > num_file +git add num_files +git commit +cd .. +</pre> +</blockquote> +</td> <!-- --> <td> +<blockquote> +<pre> +mkdir d1 +cd d1 +darcs init +echo 1 > num_files +darcs add num_files +darcs record +cd .. +</pre> +</blockquote> +</td> <!-- --> <td> +Create a new project.<br/> +`num_files` says how many<br/>files exist in the project. +</td> +</tr> +<!-- / / / / / / / / --> +<tr> +<td> +<blockquote> +<pre> +git clone b1 b2 +cd b2 +echo 'hi' > foo +echo 2 > num_files +git add foo num_files +git commit +cd .. +</pre> +</blockquote> +</td> <!-- --> <td> +<blockquote> +<pre> +cp -r d1 d2 +cd d2 +echo 'hi' > foo +echo 2 > num_files +darcs add foo +darcs record +cd .. +</pre> +</blockquote> +</td> <!-- --> <td> +Create a new branch.<br/> +Add file `foo`<br/> +Update `num_files`<br/> +</td> +</tr> +<!-- / / / / / / / / --> +<tr> +<td> +<blockquote> +<pre> +cd b1 +echo 'hi' > bar +echo 2 > num_files +git add bar num_files +git commit +git pull ../b2 +</pre> +</blockquote> +</td> <!-- --> <td> +<blockquote> +<pre> +cd d1 +echo 'hi' > bar +echo 2 > num_files +darcs add bar +darcs record +darcs pull ../d2 +</pre> +</blockquote> +</td> <!-- --> <td> +Back in the first branch.<br/> +Add file `bar`<br/> +Update `num_files`<br/> +Merge with branch 2. +</td> +</tr> +</table> + + +Git happily merges the branches, creating a broken repository (num_files has the +value 2 but there are 3 files). On the other hand, Darcs correctly detects the +potential conflict in having two patches tht make the same change. + +Most SCMs would get this wrong because they work by looking at differences +between branches. The only difference between these branches is the files `foo` +and `bar`, so the SCM happily merges. Darcs keeps track of individual patches. +When merging, Darcs tries to apply the same patches to the new branch. This way, +darcs can see that two patches are making the same change and issue a warning. + + +If you wish to dig deeper +========================= +You don't need to know anything else about Smart Patches to use darcs. +However, if you would like to dig deeper into the theory behind Smart Patches, +you are welcome to read about [Patch Theory](Patch Theory/Index). + + [Add Patch Theory directory. [email protected]**20090412120200] adddir ./Patch\32\Theory [Add Path Theory Index page. [email protected]**20090412120235] addfile ./Patch\32\Theory/Index.page hunk ./Patch\32\Theory/Index.page 1 - +You don't need to know Patch Theory to use darcs. Patch Theory is just for geeks +who want to know the theory behind darcs amazing Smart Patches. If you just want +to use darcs, just read [Smart Patches](../Smart Patches). + +What you need to know +===================== +You should read the [Smart Patches](../Smart Patches) page before reading about +Patch theory. It would help if you also have a little experience using darcs in +a real project. + +Contents +======== +- [Intro]() - Introduction to Patch Theory. +- [Examples Revisited]() - A second look at the examples in the [Smart Patches](../Smart Patches) page. [Add Patch Theory Intro page. [email protected]**20090412120322] addfile ./Patch\32\Theory/Intro.page hunk ./Patch\32\Theory/Intro.page 1 +*[note: this page merges content from the darcs manual]* + +<table> + <tr> + <td>Prev:[Index]()</td><td>Up:[Index]()</td><td>Next:[Examples Revisited]()</td> + </tr> +</table> + +Remember matrices from school? +============================== +Did you learn matrix algebra in school? If you liked it, you can think of patch +theory as being similar to matrix algebra. If you didn't like it, don't read +this paragraph. :-) + +Primitive patches +================= +A primitive patch is the smallest possible patch that darcs can understand. +Every patch is made up of one or more primitive patches. Primitive patches include: + +<table> + <tr> + <td>`Hunk`</td> + <td>The single most important primitive patch. It replaces a set of lines + by a different set of lines.</td> + </tr> + <tr> + <td>`Add File`</td> + <td>Adds a file.</td> + </tr> + <tr> + <td>`Remove File`</td> + <td>Removes a file.</td> + </tr> + <tr> + <td>`Add Dir`</td> + <td>Adds a directory.</td> + </tr> + <tr> + <td>`Remove Dir`</td> + <td>Removes a directory.</td> + </tr> + <tr> + <td>`Move`</td> + <td>Moves/renames a file or directory.</td> + </tr> +</table> + +The exact list of primitive patches is not important. What is important is that +any patch is made up of a combination of primitive patches. + +Rules for patches +================= +There are a few basic rules that patches follow: + +<table> + <tr> + <td>`Composition`</td> + <td>Patches are applied in sequence: ABCD means "patch A followed by patch B + followed by patch C ...".</td> + </tr> + <tr> + <td>`Inverse`</td> + <td>For every patch *P* there is a patch $P^{-1}$ such that $PP^{-1} = e$ + where *e* is the "empty" patch.</td> + </tr> + <tr> + <td>`Commutation`</td> + <td>We say that patches *AB* commute if there exist patches **A\'** and + **B\'** which "do the same thing"[1] as A and B (resp) and **AB = B\'A\'**. + If no such A\' and B\' exist, we say that A is a **dependency** of B.</td> + </tr> +</table> + +[1] The concept of "do the same thing" will be made rigorous in the next section. + +**Theorem 1**: The inverse of the composition of two patches is given by +$(AB)^{-1} = B^{-1}A^{-1}$ + +**Exercise**: Prove theorem 1. + +A closer look at commutation +============================ +We need a more rigorous definition of commutation. For this, we note the following +fact: + +<center> +*Every patch A can be expressed as a `composition` of primitive patches: $A = P_1 P_2 P_3 ...$ +<br/> +If we can define commutation for primitive patches, we obtain commutation for all patches.* +</center> +<br/> +For example, if $A = P_1 P_2 P_3$ and $B = Q_1 Q_2 Q_3$ where all the *Ps* an *Qs* +are primitive patches and they all commute, we can say: + +$AB = P_1 P_2 P_3 Q_1 Q_2 Q_3$<br/> +$AB = P_1 P_2 Q_1' P_3' Q_2 Q_3$ (commute $P_3$ and $Q_1$)<br/> +$AB = P_1 Q_1'' P_2' Q_2' P_3'' Q_3$ (commute more ...)<br/> +...<br/> +$AB = Q_1''' Q_2''' Q_3''' P_1''' P_2''' P_3'''$<br/> + +At this point we let $B' = Q_1''' Q_2''' Q_3'''$ and $A' = P_1''' P_2''' P_3'''$ +and we have our commutation. + + +At this point all that is left to do is to define commutation for primitive +patches. We do this by defining commutation for every pair of primitive +*patch types* - for example, a `Hunk` and a `Hunk`, or a `Hunk` and a `Move`. +This is a straight forward, though tedious exercise. Here we write down +commutation rules for two Hunks. The other cases are left as an exercise to +the reader. First, a `Hunk` has the format: + +<table> +<tr> +<td> +<pre> +groceries.txt 3 +- Bananas. +- Mangos. ++ Tomatoes. +</pre> +</td> +<td>The Hunk has a file reference and a line reference followed by lines +removed (-) and lines added (+).</td> +</tr> +</table> + +The commutation rules for two Hunks A and B are: + + +* If A and B refer to different files, AB = BA (no change). +* If A and B refer to the same file: + - If the lines overlap, they don't commute. + - If A and B refer to the same file, and the lines don't overlap: + - If B's line ref < A's line ref, change A's line ref by (#rows added by B - #rows removed by B). + - If B's line ref > A's line ref, change B's line ref by (#rows added by A - #rows removed by A). + +**Exercise**: Write down the commutation rules for a Hunk and a Move. + +Merging patches +=============== +Now we are ready to look at merging. The merging mechanism relies on the follow +theorem: + +**Theorem 2**: $AB' = BA'$ if and only if $B^{-1} A = A' B'^{-1}$, provided +both commutations succeed. + +This can be proven by multiplying the first equation by $B^{-1}$ on the left +and $B'^{-1}$ on the right. So how do we actually do a merge? A merge is needed +when we have two trees with different patches: + +> Tree1 = X Y Z A<br/> +> Tree2 = X Y Z B + +Merging these means finding patches B', A' such that `XYZAB' = XYZBA'`. +This means that AB' = BA', which by theorem 2 means that $B^{-1} A = A' B'^{-1}$. +Therefore, we can obtain A' and B' by commuting $B^{-1} A$. + +**Exercise**: How would you write the invest of a Hunk? [Add Patch Theory Examples Revisited page. [email protected]**20090412120342] addfile ./Patch\32\Theory/Examples\32\Revisited.page hunk ./Patch\32\Theory/Examples\32\Revisited.page 1 - +*[note: this page merges content from PatchTheoryExample and the darcs manual]* + +<table> + <tr> + <td>Prev:[Intro]()</td><td>Up:[Index]()</td><td>Next:[]()</td> + </tr> +</table> + +In this section we are going to take a second look at the two examples we +saw in the [Smart Patches](../Smart Patches) page and figure out why darcs +behaves the way it does. Before reading this page you should be familiar with +the contents of the [Patch Theory Intro](Intro) including the exercises. + +Example 1 revisited +=================== +Now we have the theoretical foundation to take a second look at Example 1 in the +introductory page [Smart Patches](../Smart Patches). In this example, we are +developing a recipe for scrambled eggs. We have the file `recipe.txt`: + +<blockquote> +<pre> +Break the egg shells. +Whisk the raw eggs into a homogeneous liquid. +Pour into a hot greased pan. +Stir until cooked. +</pre> +</blockquote> + +Now Alice and Bob each add a line to `recipe.txt`. We know now that adding a +line to a file is a `Hunk`. This is what the two Hunks look like: + +<table> + <tr> + <th>Hunk A</th><th>Hunk B</th> + </tr> + <tr> +<td> +<blockquote> +<pre> +recipe.txt 3 ++ Add salt. +</pre> +</blockquote> +</td> +<td> +<blockquote> +<pre> +recipe.txt 5 ++ Serve and eat. +</pre> +</blockquote> +</td> + </tr> +</table> + +In our example, Alice pull's Bob's patch. So we need to merge the two branches. +In the previous section we learned how to merge: (1) Calculate $B^{-1}$, +(2) Commute $B^{-1}$ and $A$. (3) Use $B^{-1} A = A' B'^{-1}$. + +<table> + <tr> + <th>$B^{-1}$</th><th>$B^{-1} A$</th><th>$A' B'^{-1}$</th> + </tr> + <tr> +<td> +<blockquote> +<pre> +recipe.txt 5 +- Serve and eat. +</pre> +</blockquote> +</td> + +<td> +<blockquote> +<pre> +recipe.txt 5 +- Serve and eat. +</pre> +</blockquote> +<blockquote> +<pre> +recipe.txt 3 ++ Add salt. +</pre> +</blockquote> +</td> + +<td> +<blockquote> +<pre> +recipe.txt 3 ++ Add salt. +</pre> +</blockquote> +<blockquote> +<pre> +recipe.txt 6 +- Serve and eat. +</pre> +</blockquote> +</td> + </tr> +</table> + +Now we can use $B'^{-1}$ to obtain $B'$: + +<table> + <tr> + <th>$B'^{-1}$</th><th>$B'$</th> + </tr> + <tr> +<td> +<blockquote> +<pre> +recipe.txt 6 +- Serve and eat. +</pre> +</blockquote> +</td> + +<td> +<blockquote> +<pre> +recipe.txt 6 ++ Serve and eat. +</pre> +</blockquote> +</td> + </tr> +</table> + +And presto! We have obtained the B' we need to apply to Alice's tree in order +to merge the two trees. Notice that this is the same B' that we saw back +in the page on [Smart Patches](../Smart Patches). + +Example 2 revisited +=================== +Example 2 is interesting because we want to figure out, not why a merge suceeds +but why it it fails. We have two branches, and in each branch we make different +changes: + +<table> + <tr> + <th colspan="2">Patch A</th><th colspan="2">Patch B</th> + </tr> + <tr> + <td>Patch A1:</td> + <td><blockquote><pre>`Add File` bar</pre></blockquote></td> + <td>Patch B1:</td> + <td><blockquote><pre>`Add File` foo</pre></blockquote></td> + </tr> + <tr> + <td>Patch A2:</td> + <td><blockquote><pre>bar 1<br/>+ hi</pre></blockquote></td> + <td>Patch B2:</td> + <td><blockquote><pre>foo 1<br/>+ hi</pre></blockquote></td> + </tr> + <tr> + <td>Patch A3:</td> + <td><blockquote><pre>num_files 1<br/>- 1<br/>+ 2</pre></blockquote></td> + <td>Patch B3:</td> + <td><blockquote><pre>num_files 1<br/>- 1<br/>+ 2</pre></blockquote></td> + </tr> +</table> + +We try to appply patch B on top of patch A. (1) Calculate $B^{-1}$, +(2) Commute $B^{-1}$ and $A$. (3) Use $B^{-1} A = A' B'^{-1}$. + +**Calculate** $B^{-1}$ using theorem 1: +$B^{-1} = (B1 B2 B3)^{-1} = B3^{-1} B2^{-1} B1^{-1}$ + +<table> + <tr> + <th colspan="2">Patch B</th><th colspan="2">Patch $B^{-1}$</th> + </tr> + <tr> + <td>Patch B1:</td> + <td><blockquote><pre>`Add File` foo</pre></blockquote></td> + <td>Patch $B3^{-1}$:</td> + <td><blockquote><pre>num_files 1<br/>- 2<br/>+ 1</pre></blockquote></td> + </tr> + <tr> + <td>Patch B2:</td> + <td><blockquote><pre>foo 1<br/>+ hi</pre></blockquote></td> + <td>Patch $B2^{-1}$:</td> + <td><blockquote><pre>foo 1<br/>- hi</pre></blockquote></td> + </tr> + <tr> + <td>Patch B3:</td> + <td><blockquote><pre>num_files 1<br/>- 1<br/>+ 2</pre></blockquote></td> + <td>Patch $B1^{-1}$:</td> + <td><blockquote><pre>`Remove File` foo</pre></blockquote></td> + </tr> +</table> + +Then we try to commute $B^{-1} A = B3^{-1} B2^{-1} B1^{-1} A1 A2 A3$. We +quickly run into a problem when we get to the step where we have to commute +$B3^{-1}$ and $A3$ as they are boht Hunks that affect the same file and the +same line. Therefore, the commutation fails and so the merge fails. Context: [Tweak darcs send instructions and give away the access code. Eric Kow <[email protected]>**20090410234827 Ignore-this: ad930f4ee744eec54b9896761db1e517 ] [Fix conflict between changes from gwern and me. Eric Kow <[email protected]>**20090410233856 Ignore-this: e9556bd0cb1cf93b5e52b641e34f4775 ] [2009-04-05 Guillaume Hoffmann <[email protected]>**20090405201241 Ignore-this: ea1286d07db1353871f3d02f2c4dce38 ] [use real name instead of email address Guillaume Hoffmann <[email protected]>**20090329190624 Ignore-this: 1b02353ef73bd9344a1a8d1fe37fbeb7 ] [2009-03-29 Guillaume Hoffmann <[email protected]>**20090329185900 Ignore-this: 6b958e329253b3ff6c56f2f47b6e1716 ] [entries/2009-03-22 Guillaume Hoffmann <[email protected]>**20090322115706 Ignore-this: 1e592b94017b87fd7035d89f2c2c8402 ] [entries/2009-03-15 Guillaume Hoffmann <[email protected]>**20090315204111 Ignore-this: 1bfba012e4be8159fd98ad36fae152ad ] [entries/2009-03-08 Guillaume Hoffmann <[email protected]>**20090308125015 Ignore-this: 1bb10ed850704b8df46d59a785de171f ] [Rename FrontPage to 'Front Page' Eric Kow <[email protected]>**20090215192824 Ignore-this: 2afa590c5f49f7bec96a4a6dce576cc7 ] [Front page for gitit Eric Kow <[email protected]>**20090215192528 Ignore-this: f99e5ccb2d39f2438d6dfbe05c99b01b ] [Rename all entries so far with a .page extension (for gitit) Eric Kow <[email protected]>**20090215191108 Ignore-this: 84c3f234fea46c2f89652dd8c761c2e8 ] [entries/2009-03-01 Guillaume Hoffmann <[email protected]>**20090301205408 Ignore-this: f29fffefb2a1bea4d773558abfcb6575 ] [2009-02-23 oops, forgot the fundraising Guillaume Hoffmann <[email protected]>**20090223083329 Ignore-this: a3ce15cbda599ae79d0a0cb32a298043 ] [2009-02-23 Guillaume Hoffmann <[email protected]>**20090223082118 Ignore-this: a8bd3b10b22e39f936ccdd0f9fdf7fc9 ] [entry 2009-02-13 Guillaume Hoffmann <[email protected]>**20090213160528 Ignore-this: 585544e7ff0010890c1b577d6d153763 ] [entry 2009-02-07 Guillaume Hoffmann <[email protected]>**20090207141152 Ignore-this: d688bffee8f7074de755997050f55539 ] [dwn #15 Guillaume Hoffmann <[email protected]>**20090131104509 Ignore-this: be71c4b3912a3c83f80f41ea8e1220d3 ] [Add the template (oops) Eric Kow <[email protected]>**20090126120412 Ignore-this: cb5bf57b0709d2c652000748b2a54ae2 ] [Wibble Eric Kow <[email protected]>**20090123180218 Ignore-this: 37023dad89e48081351456cb5b373f02 ] [Get rid of excess space in blog output Eric Kow <[email protected]>**20090123180205 Ignore-this: 3250a70a1c893c9ce30da4678199e853 ] [dwn #14 - catch up edition Eric Kow <[email protected]>**20090123175514 Ignore-this: a047fcf79e7ed5140eb92fb571626d58 ] [Tweak instructions for generating lastchanges Eric Kow <[email protected]>**20090123175452 Ignore-this: 1538782e03c013d88b74f5ea4607945c ] [foo [email protected]**20090117190300 Ignore-this: 6bdd0aa849634c8cd35c28d8e5e8d18a ] [foo [email protected]**20090117190001 Ignore-this: 92a1e811555a2aa1d25da0eec910c071 ] [foo [email protected]**20090117175048 Ignore-this: b808d126678bddd2a85546636e16aa54 ] [Make it a tad easier to get started Eric Kow <[email protected]>**20090117141833 Ignore-this: 85b84bd6769f90c6aec1c33957080c27 ] [More thoughts on workflow (collecting news items) Eric Kow <[email protected]>**20090117141607 Ignore-this: 914ca360336fa1a3aa368996d3ed8a8d ] [Clarify README Eric Kow <[email protected]>**20090116182254 Ignore-this: 8fdec1d728dd29332b83232a19e93c7c ] [Tweak workflow Eric Kow <[email protected]>**20090116182210 Ignore-this: 3afd500fec18d7692295646a12d0530a ] [Rename getchanges to createstub Eric Kow <[email protected]>**20090116182156 Ignore-this: cfa24b2158a7cc3cf664daa4a4672ee2 ] [getchanges.sh should only focus on getting the most recent changes Eric Kow <[email protected]>**20090116175945 Ignore-this: 1b7d7acc2704fe2e943f458b57a23da1 ] [add automated bits to 2008-11-22 Jason Dagit <[email protected]>**20081123051747 Ignore-this: b85341a4e17abb2f00cf52ab81e1436b ] [add entry for 2008-11-22 Jason Dagit <[email protected]>**20081123051516 Ignore-this: 798ff5a9ae859da9f1696adb6597eb74 ] [typo Jason Dagit <[email protected]>**20081117081447] [formatting fixes for 2008-11-16 Jason Dagit <[email protected]>**20081117081123] [add 2008-11-16 Jason Dagit <[email protected]>**20081117013638] [update README Jason Dagit <[email protected]>**20081117013624] [added note to readme Jason Dagit <[email protected]>**20081111181725] [add a simple README Jason Dagit <[email protected]>**20081111181546] [Actuaually, we have resolved an issue Eric Kow <[email protected]>**20081107101233 Ignore-this: 1a73cdfa52495e3bc4907a5666d0d274 ] [dwn #11 Eric Kow <[email protected]>**20081107101043 Ignore-this: 6dc4955b35c99c9b50f95181be84876 ] [DWN #11 beginning Eric Kow <[email protected]>**20081107085702] [dwn #10 Eric Kow <[email protected]>**20081030143039] [Whoops! URL paste-o in dwn #9 Eric Kow <[email protected]>**20081023101542] [oops! missed a new contributor Eric Kow <[email protected]>**20081023095750] [dwn #9 Eric Kow <[email protected]>**20081023095547] [wibble Eric Kow <[email protected]>**20081016220550] [Improve dwn #8 Eric Kow <[email protected]>**20081016215534] [tweak to lastentry obtention Eric Kow <[email protected]>**20081016190236] [dwn #8? Eric Kow <[email protected]>**20081016190228] [dww #7 tweaks Eric Kow <[email protected]>**20081016190218] [Tweak dwn #7 Eric Kow <[email protected]>**20081009222635] [dacrs weekly news #7 Eric Kow <[email protected]>**20081009221031] [Tweak the blog entry creation. Eric Kow <[email protected]>**20081002163152] [More suggestions from Florent. Eric Kow <[email protected]>**20081002160715] [Tweak #6 again (with Florent's ideas) Eric Kow <[email protected]>**20081002160321] [Tweaks to dwn #6 Eric Kow <[email protected]>**20081002155841] [darcs weekly news #6 Eric Kow <[email protected]>**20081002155304] [Use a dumb perl script to help tweak the entry for my blog. Eric Kow <[email protected]>**20080925103115] [Credit Vlad for the issue1041 fix Eric Kow <[email protected]>**20080925094506] [wibble Eric Kow <[email protected]>**20080925094255] [Add dwn #5 Eric Kow <[email protected]>**20080925094158] [Add one more news item for DWN #4 Eric Kow <[email protected]>**20080918102258] [DWN #4 Eric Kow <[email protected]>**20080918101757] [Call pandoc automatically with the right options. Eric Kow <[email protected]>**20080918101732] [Drop last patch in parsechanges (redundant with last week). Eric Kow <[email protected]>**20080918101651] [Whoops, misplaced links in dwn #3 Eric Kow <[email protected]>**20080910092207] [Use ReStructured Text in parsechanges.hs Eric Kow <[email protected]>**20080910091524] [Add issue/patch entries for dwn #3 Eric Kow <[email protected]>**20080910091457] [dwn #3 progress Eric Kow <[email protected]>**20080910090801] [News for dwn #3 Eric Kow <[email protected]>**20080910085713] [dwn #2 first draft Eric Kow <[email protected]>**20080903082538] [Get changes from a named patch; not trusting dates. Eric Kow <[email protected]>**20080903081219 Patch date does not have any relation with push date. ] [Use reStructured text markup for dwn #2 Eric Kow <[email protected]>**20080903081033] [Reviewers for 2008-09-03 Eric Kow <[email protected]>**20080902220359] [Entry for dwn #2 Eric Kow <[email protected]>**20080901215747] [Use official http://darcs.net for changes. Eric Kow <[email protected]>**20080827105314 Avoid the mistake of grabbing anybody's draft code. ] [Avoid showing email address in output. Eric Kow <[email protected]>**20080827104110] [Don't show email addresses in darcs news. Eric Kow <[email protected]>**20080827104040 Not a question of privacy, just prettiness ] [finish a sentence Eric Kow <[email protected]>**20080827103734] [Integrate fancier issue output into first entry Eric Kow <[email protected]>**20080827103525] [Fancier still. Eric Kow <[email protected]>**20080827103451] [Fancier issue printing Eric Kow <[email protected]>**20080827103233] [Bullets Eric Kow <[email protected]>**20080827102231] [Wibble Eric Kow <[email protected]>**20080827102159] [Wibble Eric Kow <[email protected]>**20080827101930] [Fix script and pipe to parsechanges Eric Kow <[email protected]>**20080827101915] [First week's entry Eric Kow <[email protected]>**20080827101904] [Wibble Eric Kow <[email protected]>**20080827100315] [Tweak first entry Eric Kow <[email protected]>**20080827100206] [Case Eric Kow <[email protected]>**20080827100202] [Begin entry for first darcs weekly news. Eric Kow <[email protected]>**20080827100056] [Add archive of entries. Eric Kow <[email protected]>**20080827095945] [Also print issues resolved. Eric Kow <[email protected]>**20080827095922] [Initial version. Eric Kow <[email protected]>**20080827094739] Patch bundle hash: d7f736cef16d32f1ad680dd17492339a8a76a6c2
_______________________________________________ darcs-users mailing list [email protected] http://lists.osuosl.org/mailman/listinfo/darcs-users
