Planet Darcs2018-12-19T08:00:09+00:00http://intertwingly.net/code/venus/Darcs News: Darcs 2.14.0 releasedtag:blogger.com,1999:blog-819021106854702432.post-22062160311447781452018-04-04T15:04:14+00:00The Darcs team is pleased to announce the release of Darcs 2.14.0!<br /><br />Darcs is a free, open source revision control system. It is:<br /><br /><ul><li>Distributed: Every user has access to the full command set, removing boundaries between server and client or committer and non-committers.</li><li>Interactive: Darcs is easy to learn and efficient to use because it asks you questions in response to simple commands, giving you choices in your work flow. You can choose to record one change in a file, while ignoring another. As you update from upstream, you can review each patch name, even the full "diff" for interesting patches.</li><li>Smart: Originally developed by physicist David Roundy, darcs isbased on a unique algebra of patches.</li></ul>Learn more about Darcs on <a href="http://darcs.net/" rel="noreferrer" target="_blank">http://darcs.net</a> .<br /><br /><h4>Supported GHC and Cabal versions</h4>Darcs 2.14 can be compiled with GHC 8.0, 8.2 and 8.4, and<br />supports Cabal versions from 1.24.<br /><br /><h4>Windows issues</h4>Darcs 2.14 received many updates in its support of encoding.<br />However, it may still contain bugs, especially under Windows,<br />a platform for which we have fewer known users. Please let us<br />know if you encounter weird behaviour under Windows.<br /><br /><h4>What's new </h4>User Interface:<br /><br /><ul><li> fix encoding business, make DARCS_DONT_ESCAPE_8BIT=1 default (Ben Franksen, Ganesh Sittampalam)</li><li>show explicit dependencies in `darcs log -s` (Gian Piero Carrubba)</li><li>improve bash/zsh completion (Ben, Gian Piero)</li><li>no longer print an error message when ctrlc'ing pager (Guillaume Hoffmann)</li><li>darcs help markdown` mentions all files in `_darcs/prefs/` (Guillaume)</li><li>add patch index status to `show repo` command (Ben)</li></ul>New features:<br /><br /><ul><li>per-file conflict marking (Ben)</li><li>make it possible to use DARCS_SCP=rsync (Ben)</li><li>add --not-in-remote option to unrecord command (Ben)</li></ul>Performance:<br /><br /><ul><li>plug memory leak and improve efficiency in annotate (Ben)</li><li>save unneeded FL/RL reverses in SelectChanges module (Ben)</li><li>optimize token replace code and --look-for-replaces (Ben)</li><li>no longer show conflicting files on `whatsnew -s`, will reintrodue this</li><li>feature when it is done efficiently (Guillaume)</li></ul>Developer-related:<br /><br /><ul><li>separate display and storage of patches (Ben)</li><li>support GHC 8.2 and GHC 8.4 (Ganesh)</li><li>many refactorings in Darcs.Repository modules and API (Ben, Guillaume)</li><li>no longer track build dependencies in Setup.hs, nor use alpha, beta, rc names (Guillaume)</li><li>refactor `pull --reorder-patches` (Ben)</li><li>refactor SelectChanges (Ben)</li><li>remove Patchy typeclass and redundant constaints where possible (Guillaume)</li><li>fix build with cabal new-build (Francesco Ariis)</li><li>unit and quickcheck tests for inventories (Ben)</li><li>throw out all access to bytestring internals from Darcs.Util.ByteString (Ben)</li><li>refactor, simplify, and document hunk application (Ben)</li><li>drop support of old cache location and SHA1-hashed repos (Guillaume)</li><li>rely on GHC's own stack traces for bug reporting (Guillaume)</li></ul>Issues resolved in Darcs 2.14:<br /><br /><ul><li>fix mail encoding with '.' or '=' as last character (Timo von Holtz)</li><li>issue2526: whatsnew -l --boring should list boring files (Ben)</li><li>issue2208: replace detects existing force hunks in working (Ben)</li><li>issue2512: author name is written to repository after multiple-choice prompt (Stephan-A. Posselt)</li><li>issue2359: convert --export mishandles Unicode filenames (Ben)</li><li>issue2545: prevent argument smuggling in SSH repository URLs (Gian Piero)</li><li>issue2581: fix rebase pull --reorder (Ben)</li><li>issue2575: fix unrevert with rebase (Ben)</li><li>issue2579: allow darcs send to work even if no MTA is installed</li><li>issue2555: include explicit dependencies in the output of `log -v` (Gian Piero)</li><li>issue2569: decoding multibyte characters (Ben)</li><li>issue2563: create remote repo in correct format in ssh tests (Ben)</li><li>issue2565: create _darcs dir after searching for an existing one (Ben)</li><li>issue2567: darcs whatsnew --unified (Ben)</li><li>issue2566: avoid renaming across file systems (Ben)</li><li>issue2564: delete wrong and irrelevant propConcatPS (Guillaume)</li><li>issue2559: remove trailing empty lines in patch header edition (Guillaume)</li><li>issue2536: mask out internal matchers in `show files` routing logic (Gian Piero)</li></ul>guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: Darcs News #114tag:blogger.com,1999:blog-819021106854702432.post-28794652722449021562017-07-26T14:35:05+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>Since the first release of Darcs 2.12, we released a few minor versions, the latest being 2.12.5 on January:<br /> <ul><li><a class="uri" href="https://hackage.haskell.org/package/darcs-2.12.5/changelog">https://hackage.haskell.org/package/darcs-2.12.5/changelog</a></li></ul></li><li>Ben Franksen and Gian Piero Carrubba performed some refactorings about Darcs (zsh) autocompletion:<br /> <ul><li><a class="uri" href="https://hub.darcs.net/darcs/darcs-reviewed/patch/4800ed861b90e94d6963ba9079725d7e6cdddeda">https://hub.darcs.net/darcs/darcs-reviewed/patch/4800ed861b90e94d6963ba9079725d7e6cdddeda</a></li><li><a class="uri" href="https://hub.darcs.net/darcs/darcs-reviewed/patch/4ddee01dac242abaed1d532c94f9a105bec7f272">https://hub.darcs.net/darcs/darcs-reviewed/patch/4ddee01dac242abaed1d532c94f9a105bec7f272</a></li><li><a class="uri" href="https://hub.darcs.net/darcs/darcs-reviewed/patch/ad82b9f4b110df2924e1fa1fb6074c48a2cf6234">https://hub.darcs.net/darcs/darcs-reviewed/patch/ad82b9f4b110df2924e1fa1fb6074c48a2cf6234</a></li><li><a href="https://hub.darcs.net/darcs/darcs-reviewed/patch/dd660f6b34d4e4775db2984c55f1a5568a482adc">https://hub.darcs.net/darcs/darcs-reviewed/patch/dd660f6b34d4e4775db2984c55f1a5568a482adc</a> </li></ul></li><li>As for Darcsden, the backend of <a class="uri" href="http://hub.darcs.net/">http://hub.darcs.net</a>, progress has been made on modernizing the ssh server used by it:<br /> <ul><li><a class="uri" href="https://hub.darcs.net/ganesh/ssh/issue/5">https://hub.darcs.net/ganesh/ssh/issue/5</a></li><li><a class="uri" href="https://hub.darcs.net/simon/darcsden">https://hub.darcs.net/simon/darcsden</a></li></ul></li></ol><h3 id="issues-resolved-7">Issues resolved (7)</h3><dl><dt>issue2138 Guillaume Hoffmann</dt><dd><ul><li>report conflicting files in whatsnew -s</li><li><a class="uri" href="http://bugs.darcs.net/issue2138">http://bugs.darcs.net/issue2138</a></li></ul></dd><dt>issue2496 Ben Franksen</dt><dd><ul><li>improve output of darcs whatsnew with file arguments</li><li><a class="uri" href="http://bugs.darcs.net/issue2496">http://bugs.darcs.net/issue2496</a></li></ul></dd><dt>issue2498 Ganesh Sittampalam</dt><dd><ul><li>unconditionally use the Haskell HTTP package</li><li><a class="uri" href="http://bugs.darcs.net/issue2498">http://bugs.darcs.net/issue2498</a></li></ul></dd><dt>issue2504 Ben Franksen</dt><dd><ul><li>skip ssh tests that require password input</li><li><a class="uri" href="http://bugs.darcs.net/issue2504">http://bugs.darcs.net/issue2504</a></li></ul></dd><dt>issue2512 Stephan-A. Posselt</dt><dd><ul><li>author name is written to repository after multiple-choice prompt</li><li><a class="uri" href="http://bugs.darcs.net/issue2512">http://bugs.darcs.net/issue2512</a></li></ul></dd><dt>issue2516 Ben Franksen</dt><dd><ul><li>joining (possible) URL path elements should not use <code>&lt;/&gt;</code> from System.FilePath</li><li><a class="uri" href="http://bugs.darcs.net/issue2516">http://bugs.darcs.net/issue2516</a></li></ul></dd><dt>issue2526 Ben Franksen</dt><dd><ul><li>actually consider boring option in D.UI.Flags.diffingOpts</li><li><a class="uri" href="http://bugs.darcs.net/issue2526">http://bugs.darcs.net/issue2526</a></li></ul></dd></dl><h3 id="patches-applied-196">Patches applied (196)</h3>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2017-07-25">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: darcs 2.12.1 releasetag:blogger.com,1999:blog-819021106854702432.post-70633810140911869742016-09-05T20:17:45+00:00The Darcs team is pleased to announce the release of Darcs 2.12.1!<br /><br />The most important changes are:<br /><ul><li>fixes for building with GHC 8</li></ul><ul><li>drop support for GHC 7.6 and 7.8, i.e., require GHC 7.10</li></ul><ul><li>improvements in `darcs whatsnew` output with irrelevant files (Ben Franksen)</li></ul>This release can be installed via cabal or (soon) stack. The 2.12 branch is also available as a darcs repository from <a href="http://darcs.net/releases/branch-2.12">http://darcs.net/releases/branch-2.12</a> .guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: darcs 2.12.0 releasetag:blogger.com,1999:blog-819021106854702432.post-39786384495581500012016-04-29T15:20:01+00:00The Darcs team is pleased to announce the release of Darcs 2.12.0.<br /><h3>Downloading</h3>One way of installing Darcs 2.12.0 is with stack:<br /><br /><span>$ stack install darcs-2.12.0</span><br /><br />Or first install the Haskell Platform (http://www.haskell.org/platform)<br />and install Darcs with cabal-install:<br /><span><br /></span><span>$ cabal update</span><br /><span>$ cabal install darcs-2.12.0</span><br /><br />You can also download the tarball from<br />http://darcs.net/releases/darcs-2.12.0.tar.gz and build it by hand.<br /><br />The 2.12 branch is also available as a darcs repository from<br />http://darcs.net/releases/branch-2.12<br /><h3>What's new</h3><h4>Patch dependency graph export</h4>The new command `darcs show dependencies`, enables to export the dependency graph of a repository (up to the latest tag, by default) as a Graphviz file: <br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-qkVJ-L5MqE4/VyN4T0baemI/AAAAAAAAC3k/Uh5BiWMY6ucPeARdd2hWlxozj1omIuYugCLcB/s1600/deps.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://2.bp.blogspot.com/-qkVJ-L5MqE4/VyN4T0baemI/AAAAAAAAC3k/Uh5BiWMY6ucPeARdd2hWlxozj1omIuYugCLcB/s320/deps.png" width="320" /></a></div><h4>whatsnew output and third-party VC frontend support</h4>The flag `whatsnew --machine-readable` is a simplified version of `whatsnew -s` for easier parsability by third-party tools. Darcs 2.12 adds conflict markers to the output of whatnew when summarized (ie, when used with the `-s` or `--machine-readable` flags or via the `darcs status` alias). Thanks to this, Darcs support <a href="https://git.gnome.org/browse/meld/commit/?id=12663886ecf91b4c965bad39999b21e2b717e07e">was reintroduced in meld 3.15.2</a> .<br /><h4>improvements for Git repository imports</h4>File moves are converted to file moves primitives, instead of being file deletes and add as before. This enables to have smaller Darcs respositories with a more understandable history. This change adds to other improvements and fixes that make Git import more practical.<br /><h4>repository Weak Hashes</h4>The command `darcs show repo` now shows a hash that is the XOR<br />of all hashes of the patches metadata of the repository. Being a XOR,<br />it does not depend on the patches' ordering. Also it is quite fast to<br />calculate. This Weak Hash can be useful to quickly check whether two<br />repositories of a single proyect have the same patches.<br /><br />guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: Darcs News #113tag:blogger.com,1999:blog-819021106854702432.post-79753633374294738712016-04-15T15:02:03+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>We will release Darcs 2.12 by the end of this month:<br /> <ul><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2016-April/027198.html">http://lists.osuosl.org/pipermail/darcs-users/2016-April/027198.html</a></li><li><a class="uri" href="http://darcs.net/Releases/2.12">http://darcs.net/Releases/2.12</a></li></ul></li><li>On May 6th-8th in Helsinki, a joint sprint Pijul/Darcs is organized:<br /> <ul><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2016-April/027197.html">http://lists.osuosl.org/pipermail/darcs-users/2016-April/027197.html</a></li><li><a class="uri" href="http://darcs.net/Sprints/2016-05">http://darcs.net/Sprints/2016-05</a></li></ul></li></ol><h3 id="issues-resolved-5">Issues resolved (5)</h3><dl><dt>issue1807 Guillaume Hoffmann</dt><dd><ul><li>clarify help of PAGER, DARCS_PAGER</li><li><a class="uri" href="http://bugs.darcs.net/issue1807">http://bugs.darcs.net/issue1807</a></li></ul></dd><dt>issue2258 Guillaume Hoffmann</dt><dd><ul><li>improve patch index error message with suggestion</li><li><a class="uri" href="http://bugs.darcs.net/issue2258">http://bugs.darcs.net/issue2258</a></li></ul></dd><dt>issue2393 Guillaume Hoffmann</dt><dd><ul><li>remove whatsnew functionality from annotate</li><li><a class="uri" href="http://bugs.darcs.net/issue2393">http://bugs.darcs.net/issue2393</a></li></ul></dd><dt>issue2486 Ben Franksen</dt><dd><ul><li>obliterate --not-in-remote -q should be more quiet</li><li><a class="uri" href="http://bugs.darcs.net/issue2486">http://bugs.darcs.net/issue2486</a></li></ul></dd><dt>issue2494 Ben Franksen</dt><dd><ul><li>output of darcs record with file arguments</li><li><a class="uri" href="http://bugs.darcs.net/issue2494">http://bugs.darcs.net/issue2494</a></li></ul></dd></dl><h3 id="patches-applied-96">Patches applied (96)</h3><dl><dt>2016-04-14 Guillaume Hoffmann</dt><dd><ul><li>move network-related tests to network dir, update command names</li><li>resolve issue2393: remove whatsnew functionality from annotate</li><li>add log --machine-readable to see patch dependencies non-interactively</li><li>help of log</li></ul></dd><dt>2016-04-01 Ganesh Sittampalam</dt><dd><ul><li>add some doc comments to RepoType</li></ul></dd><dt>2016-03-29 Guillaume Hoffmann</dt><dd><ul><li>merge Repository.Util into Repository.State</li><li>use B and BC instead of BS and BSC in Repository.State</li><li>fix prelude import in Repository.State</li><li>move maybeApplyToTree to Darcs.Patch.Apply</li><li>move getRecursiveDarcsRepos to UI.Commands.Optimize</li><li>move patchSetfMap to Darcs.Patch.Set</li><li>move functions from Repository.Util to Patch.TokenReplace</li><li>comment in Repository.Util</li><li>refactor similar functions in Darcs.Repository.State</li><li>use readUnrecordedFiltered in getReplaces</li><li>inline a function in Clone</li><li>no longer move index to index.old on mingw32 os</li><li>clarify comments in Darcs.Repository.State</li><li>hlint Darcs.Repository.State</li><li>move External module from Repository to Util</li><li>move Compat and Lock modules from Repository to Util</li><li>merge Darcs.Repository.Ssh into Darcs.Util.Ssh</li><li>remove Darcs.Repository.Read by moving readRepo back to Internal</li><li>add comments and remove checks of optimize commands wrt repo formats</li><li>make all optimize subcommands require hashed except upgrade</li><li>move copySources from HashedRepo to Clone</li><li>move Storage.Hashed modules to Darcs.Util</li><li>remove unused function from Storage.Hashed.Plain</li><li>fix compile error in Storage.Hashed.Test</li><li>remove Storage.Hashed.Utils, move functions to Darcs.Utils.ByteString</li><li>move index-related functions from Utils to Index</li><li>removed unused or redundant functions from Storage.Hashed.Utils</li><li>remove unused functions from Storage.Hashed.Hash</li><li>hlint Storage.Hashed.Darcs</li><li>reuse functions from Darcs.Util.Path</li><li>remove unused Storage.Hashed.Packs</li></ul></dd><dt>2016-03-09 Ben Franksen</dt><dd><ul><li>revert command: be quiet when requested</li><li>accept issue2480: display unicode in patch content</li><li>slightly improved chaotic indentations and import lists</li><li>refactor: use maybeRestrictSubpaths</li><li>refactor: use Darcs.Util.English.capitalize</li><li>replace Darcs.Util.Printer.&lt;&gt; with &lt;&gt; from Data.Monoid; restructured haddocks</li><li>small code layout fix in whatsnew command</li><li>fixed Darcs.Util.English.andClauses and orClauses</li><li>two simple refactorings in the conflict resolution code</li><li>cleanup in revert command: use debugMessage for debug messages</li><li>cleanup: break over-long line in D.R.Merge</li><li>accept issue2494: output of darcs record with file arguments</li><li>resolve issue2494: output of darcs record with file arguments</li><li>refactored some, added readUnrecordedFiltered and maybeRestrictSubpaths</li><li>several fixes and refactorings in fixSubPaths and maybeFixSubPaths</li><li>add Darcs.Util.Printer.quoted and Darcs.Util.Text.pathlist</li><li>added missing hsep function to D.Util.Printer</li><li>added missing Eq and Show instances for ScanKnown</li><li>added Darcs.Util.Printer.ePutDocLn</li><li>add new type IncludeBoring for includeBoring option (was Bool)</li><li>announceFiles only if verbosity /= Quiet</li></ul></dd><dt>2016-03-05 Guillaume Hoffmann</dt><dd><ul><li>rm hashed-storage changelog</li><li>put copyright headers in hashed-storage modules</li><li>add Storage/Hashed dir to checkdeps contrib script</li><li>merge Storage.Hashed.AnchoredPath into Darcs.Util.Path</li><li>explicit exports for Storage.Hashed.Utils</li><li>list and comment exports of Storage.Hashed.Darcs and Plain</li><li>remove Storage.Hashed</li><li>resolve issue2258: improve patch index error message with suggestion</li><li>resolve issue1807: clarify help of PAGER, DARCS_PAGER</li><li>fix extra-source-file path in darcs.cabal</li></ul></dd><dt>2016-03-07 Ben Franksen</dt><dd><ul><li>Darcs.UI.Commands.Unrecord: honor quiet option everywhere</li><li>resolve issue2486: obliterate --not-in-remote -q should be more quiet</li></ul></dd><dt>2016-02-25 Ganesh Sittampalam</dt><dd><ul><li>print the rebase status even after an error</li><li>in runJob, pull repojob out to first-level decision</li><li>refactor displaying suspended status a bit</li><li>inline repoJobOnRebaseRepo</li><li>use helper types to elide more cases in runJob</li><li>elide some common cases in runJob</li><li>reorder runJob cases by job type</li><li>flatten runJob case statements</li><li>add a helper type for flags needed for Rebase</li><li>lift the runJob debugMessage call outside the case</li><li>lift 'therepo' outside the runJob case statement</li><li>express the V1/V2 patch type switch via a GADT too</li><li>use SRepoType to control the rebase type in runJob</li><li>remove commented-out cases for old TreeJob</li><li>drop unnecessary constraints</li><li>break out a runJob function</li><li>drop CarrierType - it can't ever be Rebasing p now</li><li>drop RecontextRebase</li><li>drop NameHack</li><li>inline MaybeInternal module into Named.Wrapped</li><li>make the Rebase import qualified</li><li>Introduce RebaseP to replace Rebasing type</li><li>add 'activecontents' to replace 'patchcontents' for use in conflict resolution</li><li>stop Convert using Wrapped.patchcontents</li><li>add nullary RepoType</li><li>flip dependency between Named.Wrapped and Rebase.Container</li><li>add wrapper type around 'Named'</li></ul></dd></dl>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2016-04-15">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: Darcs News #112tag:blogger.com,1999:blog-819021106854702432.post-26857022074686907772016-04-03T20:29:22+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>After 7 years of being the maintainer/Benevolent Dictator of Darcs, Eric Kow stepped down and offered me (Guillaume Hoffmann) to take over, which I accepted:<br /> <ul><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2015-October/027144.html">http://lists.osuosl.org/pipermail/darcs-users/2015-October/027144.html</a></li><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2015-October/027145.html">http://lists.osuosl.org/pipermail/darcs-users/2015-October/027145.html</a></li></ul></li><li>The release process of Darcs 2.12 will start when GHC 8 is released:<br /> <ul><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2016-March/027185.html">http://lists.osuosl.org/pipermail/darcs-users/2016-March/027185.html</a></li></ul></li><li>We had two new minor releases of Darcs 2.10, and in spite of being minor, they contain a few interesting changes and optimizations:<br /> <ul><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2015-November/027151.html">http://lists.osuosl.org/pipermail/darcs-users/2015-November/027151.html</a></li><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2016-January/027182.html">http://lists.osuosl.org/pipermail/darcs-users/2016-January/027182.html</a></li></ul></li><li>In a span of 4 months we had two sprints, one in Paris in September and another another in Seville in January, check out the reports:<br /> <ul><li><a class="uri" href="http://blog.darcs.net/2015/09/darcs-hacking-sprint-9-report.html">http://blog.darcs.net/2015/09/darcs-hacking-sprint-9-report.html</a></li><li><a class="uri" href="http://blog.darcs.net/2016/01/darcs-hacking-sprint-10-report.html">http://blog.darcs.net/2016/01/darcs-hacking-sprint-10-report.html</a></li></ul></li><li>Finally, Pierre-Étienne Meunier announced a Pijul sprint in may in Finland. Darcs hackers are welcome!<br /> <ul><li><a class="uri" href="http://pijul.org/2016/04/02/sprint.html">http://pijul.org/2016/04/02/sprint.htm </a></li></ul></li></ol><h3 id="issues-resolved-7">Issues resolved (7)</h3><dl><dt>issue2269 Eric Kow</dt><dd><ul><li>push hijack test to suspend time</li><li><a class="uri" href="http://bugs.darcs.net/issue2269">http://bugs.darcs.net/issue2269</a></li></ul></dd><dt>issue2276 Eric Kow</dt><dd><ul><li>Keep track of patch hijack decisions</li><li><a class="uri" href="http://bugs.darcs.net/issue2276">http://bugs.darcs.net/issue2276</a></li></ul></dd><dt>issue2400 Ben Franksen</dt><dd><ul><li>use async package to keep track of unpack threads</li><li><a class="uri" href="http://bugs.darcs.net/issue2400">http://bugs.darcs.net/issue2400</a></li></ul></dd><dt>issue2459 Ben Franksen</dt><dd><ul><li>fall back to writing the file if createLink fails</li><li><a class="uri" href="http://bugs.darcs.net/issue2459">http://bugs.darcs.net/issue2459</a></li></ul></dd><dt>issue2479 Ben Franksen</dt><dd><ul><li>root dir most not be among the sources of a move</li><li><a class="uri" href="http://bugs.darcs.net/issue2479">http://bugs.darcs.net/issue2479</a></li></ul></dd><dt>issue2481 Ganesh Sittampalam</dt><dd><ul><li>expose API for 'darcs diff' command</li><li><a class="uri" href="http://bugs.darcs.net/issue2481">http://bugs.darcs.net/issue2481</a></li></ul></dd><dt>issue2489 Guillaume Hoffmann</dt><dd><ul><li>dequote filepaths while importing from git</li><li><a class="uri" href="http://bugs.darcs.net/issue2489">http://bugs.darcs.net/issue2489</a></li></ul></dd></dl><h3 id="patches-applied-176">Patches applied (176)</h3><dl><dt>2016-03-26 Sergei Trofimovich</dt><dd><ul><li>allow zip-archive-0.3</li></ul></dd><dt>2016-03-22 Guillaume Hoffmann</dt><dd><ul><li>remove failing-issue1609 from testsuite as property we don't want</li></ul></dd><dt>2016-03-06 Ben Franksen</dt><dd><ul><li>move command: fixed punctuation of error messages and added a comment</li><li>use bug from impossible.h instead of error</li><li>cleanup in Darcs.Patch.Merge: use case instead of fromJust (do return ...)</li></ul></dd><dt>2016-02-12 Ganesh Sittampalam</dt><dd><ul><li>Get rid of the need for DummyPatch in Darcs.Patch.Match</li></ul></dd><dt>2016-03-05 Guillaume Hoffmann</dt><dd><ul><li>move runHLint.sh to root and update to run outside of testsuite</li></ul></dd><dt>2016-02-12 Ganesh Sittampalam</dt><dd><ul><li>drop re-exports from Darcs.Patch.Rebase</li><li>abstract out checking whether a Named is internal</li><li>add versions of simplifyPush[es] for Suspended</li><li>move addFixup to Rebase.Container and give it a clearer name</li><li>add Repair instance for Suspended</li><li>Ignore the rebase internal patch when showing dependencies</li><li>simplify instance ShowPatchBasic (RebaseSelect p)</li><li>break out PatchInspect instance for Suspended</li><li>rename mkSuspended to mkRebase and make it work on 'Suspended'</li><li>use Suspended instead of FL RebaseItem in take<i>Rebase</i></li><li>break out RepairToFL instance for Suspended</li><li>break out ReadPatch instance for Suspended</li><li>break out Check instance for Suspended</li><li>break out Show instances for Suspended</li><li>break out Conflict instance for Suspended</li><li>break out Effect instance for Suspended</li><li>add PrimPatchBase instance for Suspended</li><li>break out ShowPatch instance for Suspended</li><li>break out Apply instance for Suspended</li><li>refactor instance ShowPatch Rebasing a bit</li><li>inline a couple of defaults to simplify future refactoring</li><li>abstract out an instance ShowPatchBasic Suspended</li><li>Introduce a 'Suspended' type to encapsulate 'FL RebaseItem'</li></ul></dd><dt>2016-03-18 Ben Franksen</dt><dd><ul><li>skip ssh tests if ssh server is down</li><li>made network ssh tests more robust by passing --skip-long-comment</li><li>fix ssh network tests so they work in the test harness</li><li>skip http network tests when server does not respond</li><li>run network tests by default</li><li>resolve issue2479: root dir most not be among the sources of a move</li><li>accept issue2479: bug descending in modifyTree</li></ul></dd><dt>2016-03-08 Guillaume Hoffmann</dt><dd><ul><li>update failing-issue2219</li><li>acknowledge that issue1196 is solved</li><li>acknowledge a working case in failing-index-argument.sh</li><li>merge HACKING into README.md</li></ul></dd><dt>2016-02-17 Ganesh Sittampalam</dt><dd><ul><li>get rid of a couple of trailing newlines</li></ul></dd><dt>2016-02-05 Guillaume Hoffmann</dt><dd><ul><li>remove unused executable and testsuite dependencies</li><li>comment in cabal file workaround</li><li>group all non-optional build-depends</li><li>remove unused darcs-test dependencies</li><li>comment use of flag REENTRANT</li><li>drop definition of HAVE_SIGINFO_H unused since 2009</li><li>hlint Darcs.Util.Diff.Patience</li><li>format patch names within 20 characters in dependencies output</li><li>show dependencies up to last tag by default</li><li>further merge hashed-storage code and tests into darcs code</li><li>bump second html dependency</li><li>darcs show dependencies</li><li>implement function getDeps</li></ul></dd><dt>2016-01-28 Ganesh Sittampalam</dt><dd><ul><li>fix git test involving deletions</li></ul></dd><dt>2016-01-25 Guillaume Hoffmann</dt><dd><ul><li>handle file moves and copies when importing from git</li><li>recommend using -M flag on git fast-export</li><li>tests related to git import of file moves</li><li>use F and T instead of From and To in whatsnew --machine-readable</li><li>bump dependencies lower bounds implied by requiring ghc 7.6</li><li>2.10.3 changelog</li></ul></dd><dt>2016-01-29 Ganesh Sittampalam</dt><dd><ul><li>support transformers-compat 0.5.x</li></ul></dd><dt>2016-01-25 Guillaume Hoffmann</dt><dd><ul><li>avoid irrefutable pattern when importing unnamed commit</li><li>test for deleting empty directories on git import</li><li>delete empty directories on git import</li><li>rollback filename dequoting on import since now done during parsing</li><li>quoting and escaping of filenames in convert export and import</li><li>test for checking filepaths consistency with git</li><li>resolve issue2489: dequote filepaths while importing from git</li></ul></dd><dt>2016-01-28 Ganesh Sittampalam</dt><dd><ul><li>fix tests that use "git commit"</li><li>applyToTree is just a specialisation of applyToState</li><li>drop unnecessary constraint</li><li>simplify type</li><li>drop unused (and never defined) putApplyState</li><li>move the ObjectMap related code to the FileUUID patch type</li><li>disentangle the state-specific ApplyMonad methods</li><li>swap argument order to ApplyMonad/ApplyMonadTrans</li><li>Rename Prim.V3 to Prim.FileUUID</li><li>move listConflictedFiles out of Conflict class</li><li>Get rid of default implementation of conflictedEffect</li><li>Add some tests for how conflicts are reported</li><li>Drop an unnecessary call to patchcontents in applyAndFix</li><li>Drop unnecessary use of patchcontents in hunkmatch and touchmatch</li></ul></dd><dt>2016-01-16 Guillaume Hoffmann</dt><dd><ul><li>rename Patch and RealPatch to RepoPatchV1 and RepoPatchV2 in harness</li><li>rename Patch and RealPatch to RepoPatchV1 and RepoPatchV2 in darcs code</li><li>do not open patches uselessly when no file restriction given</li><li>add Darcs.Test.Patch.Selection and one unit test</li><li>convert import should be a RepoJob, not a V2Job</li><li>replace TaggedPatch by LabelledPatch in a comment</li><li>whatsnew --machine-readable help string update on file moves</li><li>--machine-readable flag for more parseable whatsnew</li><li>fix code inside of a comment</li></ul></dd><dt>2016-01-16 Ganesh Sittampalam</dt><dd><ul><li>resolve conflicts between changes to splitters and to hijacking</li><li>capture diffAlgorithm in splitters instead of passing it to SelectChanges unconditionally</li><li>drop unneeded export</li><li>simplify the PatchInspect (Rebasing p) instance</li><li>implement hunkMatches for PatchInfoAnd</li><li>move Rebasing out into its own module</li><li>break RebaseItem out into its own file</li><li>bump async dependency</li><li>conditionalise a couple of orphan instances</li><li>resolve conflict in build-tools removal</li><li>drop build-tools restriction</li><li>Bump time, HTTP dependencies</li></ul></dd><dt>2016-01-15 Guillaume Hoffmann</dt><dd><ul><li>set use-time-1point5 flag default to True to please stack</li><li>disable interfering env variable in issue1739 test</li><li>rename README to README.md to get it properly rendered</li></ul></dd><dt>2016-01-15 Ganesh Sittampalam</dt><dd><ul><li>resolve conflict between binary version bump and containers dep</li><li>bump binary, transformers and tar upper bounds</li></ul></dd><dt>2016-01-14 Guillaume Hoffmann</dt><dd><ul><li>make commit an alias for record</li><li>implement repoXor and show it in "show repo" output as "Weak Hash"</li></ul></dd><dt>2015-12-28 Ganesh Sittampalam</dt><dd><ul><li>Portability fix - #type nl_item isn't always Int32</li><li>add test that lost deps during rebase are reported on</li><li>remove unused fmapPIAP</li></ul></dd><dt>2015-12-22 Guillaume Hoffmann</dt><dd><ul><li>fix repo upgrade help string</li></ul></dd><dt>2015-12-02 Ganesh Sittampalam</dt><dd><ul><li>resolve issue2481: expose API for 'darcs diff' command</li></ul></dd><dt>2015-11-20 Guillaume Hoffmann</dt><dd><ul><li>remove a flag needed only for GHC &lt; 7</li><li>remove -fno-warn-dodgy-imports from modules that were still using it</li><li>no longer hide catch from Prelude since we require ghc&gt;=7.6</li><li>acknowledge -fno-warn-dodgy-imports is always needed</li><li>merge Darcs.Patch.ConflictMarking into Darcs.Patch.Conflict</li></ul></dd><dt>2015-11-29 Ganesh Sittampalam</dt><dd><ul><li>bump dependencies on vector, process, HUnit</li><li>force grep to treat output of locale as text</li></ul></dd><dt>2015-11-20 Guillaume Hoffmann</dt><dd><ul><li>Rename Darcs.Repository.LowLevel to Darcs.Repository.Pending</li></ul></dd><dt>2012-08-09 Eric Kow</dt><dd><ul><li>Haddock the pending patch parts of Darcs.Repository.State.</li><li>Make Darcs.Repository.isSimple apply over a whole list.</li></ul></dd><dt>2015-11-09 Guillaume Hoffmann</dt><dd><ul><li>rename NEWS to CHANGELOG to please hackagedb</li><li>fix release date of 2.10.2</li><li>update NEWS for 2.10.1 and 2.10.2</li><li>fix two tests after stopping using the word changes in pull message</li><li>shorter README with quickstart instructions</li></ul></dd><dt>2015-11-06 Ganesh Sittampalam</dt><dd><ul><li>add comments about the rejected 'hasDuplicate' cases</li><li>"Fix" some intermittent QuickCheck failures</li><li>disambiguate imports in some test code</li><li>Add an option to control the number of QuickCheck iterations</li><li>make test-framework imports explicit</li></ul></dd><dt>2015-11-05 Guillaume Hoffmann</dt><dd><ul><li>refactor breakAfterNthNewline and breakBeforeNthNewline</li><li>refactor clone code</li><li>download patches pack asynchronously</li><li>ignore meta- files in packs when cloning</li><li>comment in doOptimizeHTTP</li></ul></dd><dt>2015-06-28 Ben Franksen</dt><dd><ul><li>remove race from D.R.Packs, further simplify the code</li></ul></dd><dt>2015-10-31 Guillaume Hoffmann</dt><dd><ul><li>replace changes by log in release.sh</li><li>remove darcs.spec.in file from 2008</li><li>replace changes by log in Setup.lhs</li><li>update upload.cgi with new command names</li><li>update buildbot-try.sh with new command names</li><li>update cygwin-wrapper file with new commands names and flags</li><li>remove annotate xml schema no longer needed</li><li>remove patch index correctness and timing scripts from contrib</li><li>adapt tests to using patches word instead of changes</li><li>update commands names in help strings</li></ul></dd><dt>2015-10-28 Ganesh Sittampalam</dt><dd><ul><li>split issue1932 test up into a network and non-network part</li><li>Avoid subshells in amend-unrecord test</li><li>disable issue2086 test on Windows - umasks don't really work there</li><li>using mmap on Windows was causing test failures</li><li>warn when suspending "hijacked" patches in rebase pull and apply</li><li>be a bit clearer about patch names in hijack test</li></ul></dd><dt>2015-09-20 Eric Kow</dt><dd><ul><li>resolve issue2269: push hijack test to suspend time</li><li>resolve issue2276: Keep track of patch hijack decisions</li><li>Generalise hijack warning to support use in other commands</li><li>Helper to capitalize a sentence</li></ul></dd><dt>2015-06-24 Ben Franksen</dt><dd><ul><li>resolve issue2459: fall back to writing the file if createLink fails</li><li>resolve issue2400: use async package to keep track of unpack threads</li><li>removed special handling of --to-match from cloneRepository</li></ul></dd><dt>2015-10-16 Guillaume Hoffmann</dt><dd><ul><li>remove redundant import</li></ul></dd><dt>2015-10-15 Ganesh Sittampalam</dt><dd><ul><li>drop sandi lower bound to support GHC 7.4 and add an upper bound</li></ul></dd><dt>2015-10-03 Daniil Frumin</dt><dd><ul><li>Switch from dataenc (deprecated) to sandi</li></ul></dd><dt>2015-10-09 Guillaume Hoffmann</dt><dd><ul><li>replace changes by log in two help strings</li></ul></dd><dt>2015-09-18 Eric Kow</dt><dd><ul><li>Refactor darcs send patch count text snippet</li><li>Tidy darcs send msg code (shorter lines)</li><li>Fix typo in darcs send message</li></ul></dd><dt>2015-09-19 Guillaume Hoffmann</dt><dd><ul><li>make patch selection lazier in presence of matchers</li><li>get rid of selectChanges</li><li>inline patchSetToPatches in the only place where it is used</li></ul></dd></dl>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2016-04-01">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: darcs hacking sprint 10 reporttag:blogger.com,1999:blog-819021106854702432.post-31129310563965493712016-01-18T16:57:22+00:00<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><span style="font-family: inherit;">Last weekend we had our tenth Darcs sprint, and <span style="font-family: inherit;">our</span> first one in Spain. This time indeed, the sprint was organised in the University of Seville, <a href="https://www.informatica.us.es/">ETSII</a> (Technical Superior School of Informatics Engineering), on January 15th to 17th.</span><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://upload.wikimedia.org/wikipedia/commons/a/af/ETSII_Sevilla_003.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://upload.wikimedia.org/wikipedia/commons/a/af/ETSII_Sevilla_003.jpg" width="320" /></a></div><br /><span style="font-family: inherit;"><span style="font-family: inherit;"><br /></span></span><span style="font-family: inherit;"><span style="font-family: inherit;">We were 3 participants: <span><span style="background-color: white;"><span style="background-color: white;"><span style="background-color: white;">Florent Becker</span>, </span></span></span></span><span style="font-family: inherit;"><span><span style="background-color: white;"><span style="background-color: white;"><span style="font-family: inherit;"><span><span style="background-color: white;">Guillaume Hoffmann and </span></span></span>Ganesh </span>Sittampalam. We also had </span><span style="background-color: white;">Pierre-Étienne Meunier on video call and Simon Michael on IRC.</span></span></span></span><br /><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span><br /><h4><span style="font-family: inherit;"><span><span style="background-color: white;">Darcs and Pijul integration</span></span></span></h4><div class="separator" style="clear: both; text-align: center;"><a href="https://pijul.org/img/logo.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://pijul.org/img/logo.png" /></a></div><br /><span style="font-family: inherit;"><span><span style="background-color: white;">One major topic during the whole sprint was the possible integration of Darcs with Pijul. <a href="http://pijul.org/">Pijul</a> is a new version control system based on a different patch theory, whose main author is Pierre-Étienne Meunier. Florent also contributes to Pijul and <a href="http://lists.osuosl.org/pipermail/darcs-users/2015-October/027143.html">announced its first release</a> last October. </span></span></span><br /><br /><span style="font-family: inherit;"><span><span style="background-color: white;">Pijul is promising in terms of how it handles conflicts in a better way than Darcs (better as: better presentation to the user and better performance). There may be a future where Darcs uses Pijul patches by default. </span></span></span><span style="font-family: inherit;"><span><span style="background-color: white;">We had many conversations with Florent to understand the internals of Pijul and how it manages patches.</span></span></span><br /><br /><span style="font-family: inherit;"><span><span style="background-color: white;">On the first day of the sprint we did a video call with Pierre-Étienne Meunier, to discuss integration of Pijul core with Darcs. It happens that the Darcs code is modular enough to handle Pijul patches (with some work). That afternoon Florent started to work on a Haskell binding for libpijul (through a C binding maintained by Pierre-Étienne, Pijul being implemented in Rust).</span></span></span><br /><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span><span style="font-family: inherit;"><span><span style="background-color: white;">Ganesh, Florent and Pierre-Étienne are going to work towards a better integration of both systems. Pierre-Étienne plans to release a 0.2 version of Pijul soon.</span></span></span><br /><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-XllxsQJCcUo/Vp0HZifZ07I/AAAAAAAACtE/CYMwMu1k3qk/s1600/SAM_1789.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="http://4.bp.blogspot.com/-XllxsQJCcUo/Vp0HZifZ07I/AAAAAAAACtE/CYMwMu1k3qk/s320/SAM_1789.JPG" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Ganesh and Florent with Pierre-Étienne on video call</td></tr></tbody></table><h4><span style="font-family: inherit;"><span><span style="background-color: white;">Renaming Patch/RealPatch to RepoPatchV1/RepoPatchV2</span></span></span></h4><span style="font-family: inherit;"><span><span style="background-color: white;">The code of Darcs contains many different layers of patch types. One of them is represented by the two types Patch and RealPatch, and specifies the behaviour of named patch when they are commuted and in case of conflicts. The "Patch" type is the behaviour of patches in repositories with the darcs-1 patch semantics (which can still be created by Darcs) and "RealPatch" is for darcs-2 semantics (the current default of Darcs). I sent <a href="http://bugs.darcs.net/patch1429">a patch</a> to rename these types into something less confusing: RepoPatchV1 and RepoPatchV2.</span></span></span><br /><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span><br /><h4><span style="font-family: inherit;"><span><span style="background-color: white;">Interactive selection performance and refactoring</span></span></span></h4><span style="font-family: inherit;"><span><span style="background-color: white;">Even if <a href="http://hub.darcs.net/darcs/darcs-screened/patch/4d55c7ccc1e8cbd80066c05d66e6309bd96aed8e">we wrote a patch that improved greatly performance during the last sprint</a> (and we now have </span></span></span><span style="font-family: inherit;"><span><span style="background-color: white;"><span style="font-family: inherit;"><span><span style="background-color: white;"><a href="http://bugs.darcs.net/patch1434">a unit test</a> for it), </span></span></span>the command "darcs rollback -p ." still remains much slower than "darcs rollback" before presenting the first choice of patch to the user. Florent determined that this was because the action of matching patches within interactive selection is not lazy, ie, the whole list of patches has to be scanned and classified before the first prompt is shown to the user. Florent unearthed a refactor he had of the patch selection code and started rebasing it against the current code.</span></span></span><br /><span style="font-family: inherit;"><span><span style="background-color: white;"></span></span></span><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span><br /><h4><span style="font-family: inherit;"><span><span style="background-color: white;">User manual and developer handbook</span></span></span></h4><span style="font-family: inherit;"><span><span style="background-color: white;">We want Darcs to have a user manual again, and a developer handbook that would compile documentation for programmers and computer scientists. We decided the manual should live in darcs' repository itself (so that it stays up-to-date) and the developer handbook on the wiki.</span></span></span><br /><br /><h4><span style="font-family: inherit;"><span><span style="background-color: white;">Darcs on Stackage</span></span></span></h4><span style="font-family: inherit;"><span><span style="background-color: white;">On IRC, Simon Michael (after an initial request by Joachim Breitner) committed himself to maintain a stack.yaml file for Darcs, and during the weekend Darcs <a href="https://github.com/fpco/stackage/pull/1143">was added to stackage</a> for easier building.</span></span></span><br /><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span><br /><h4><span style="font-family: inherit;"><span><span style="background-color: white;">Cleanup, fixes and refactorings</span></span></span></h4><span style="font-family: inherit;"><span><span style="background-color: white;">Ganesh tracked down bugs in rebase and sent <a href="http://bugs.darcs.net/patch1430">a few</a> <a href="http://bugs.darcs.net/patch1431">cleanup patches</a>. Moreover he's improving the code of "darcs test" (formerly called "darcs trackdown") so that uncompilable states are neither considered as Passing nor Failing, and bisect is going to be more efficient.</span></span></span><br /><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span><br /><h4><span style="font-family: inherit;"><span><span style="background-color: white;">What happens next</span></span></span></h4><span style="font-family: inherit;"><span><span style="background-color: white;">I am going to release Darcs 2.10.3 within a couple of weeks, and Darcs 2.12 within a couple of months. This new major version will have optimizations (some of them are already backported to the 2.10 branch) and code refactorings. It may contain the stash feature currently developed by Ganesh.</span></span></span><span style="font-family: inherit;"><span><span style="background-color: white;"> </span></span></span><br /><br /><span style="font-family: inherit;"><span><span style="background-color: white;">This year we hope to have another sprint, and to have more developers participating. Please consult the <a href="http://darcs.net/HowToHelp">How to Help</a>, <a href="http://darcs.net/Development/GettingStarted">Developer's Getting Started</a> and <a href="http://darcs.net/Projects">Projects</a> page on the wiki to get involved!</span></span></span><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-fwfWx6Nc1NI/Vp0HZgsJ2tI/AAAAAAAACtA/4e3c4FSUVBE/s1600/2016-01-16-153410.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="http://3.bp.blogspot.com/-fwfWx6Nc1NI/Vp0HZgsJ2tI/AAAAAAAACtA/4e3c4FSUVBE/s320/2016-01-16-153410.jpg" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Ganesh, Florent and Guillaume</td></tr></tbody></table><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span><span style="font-family: inherit;"><span><span style="background-color: white;"><br /></span></span></span>guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: darcs hacking sprint 9 reporttag:blogger.com,1999:blog-819021106854702432.post-74015420505970173922015-09-24T15:35:27+00:00<a href="http://2.bp.blogspot.com/-LHCSc5cTpo8/VgQKgx6-62I/AAAAAAAACn0/r82qVlFB610/s1600/IMG_20150920_093906303_HDR.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-LHCSc5cTpo8/VgQKgx6-62I/AAAAAAAACn0/r82qVlFB610/s320/IMG_20150920_093906303_HDR.jpg" width="179" /></a><span style="font-family: Arial,Helvetica,sans-serif;">After a one year and a half absence, the Darcs Hacking Sprint returned!</span><br /><br /><span style="font-family: Arial,Helvetica,sans-serif;">Once again, the event occurred at the <a href="https://www.irill.org/">IRILL</a> (Innovation and Research Initiative for Free Software) in Paris, on September 18th to 20th.</span><br /><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span><span style="font-family: Arial,Helvetica,sans-serif;">The sprint had 7 participants: <span style="background-color: white;">Danill Frumin, Eric Kow, </span><span style="background-color: white;"><span style="background-color: white;"><span style="background-color: white;"> Florent Becker</span>, Ganesh </span>Sittampalam, </span><span style="background-color: white;">Guillaume Hoffmann, Thomas Miedema and Vinh Dang.</span></span><br /><br /><h4><span style="font-family: Arial,Helvetica,sans-serif;"><b>Darcs and GHC 8</b></span></h4><span style="font-family: Arial,Helvetica,sans-serif;">Thomas Miedema is a Haskell and GHC hacker, and came on the first day of the sprint. Since Darcs is a system that aims at supporting the various GHC versions out there, Thomas helped us preparing for GHC 8, the next major version. He explained us one issue of <a href="https://ghc.haskell.org/trac/ghc/wiki/Status/GHC-8.0.1">GHC 8</a> that got triggered by Darcs: <a href="https://ghc.haskell.org/trac/ghc/ticket/10653">a bug with the PatternSynonyms extension</a>. Fortunately it seems that the bug will be fixed in GHC HEAD. (First release candidate is planned for December).</span><br /><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://3.bp.blogspot.com/-C1OmxtMgHUs/VgPm55yAjBI/AAAAAAAACmg/c1jrOLRsn8E/s1600/IMG_20150918_183638407.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="http://3.bp.blogspot.com/-C1OmxtMgHUs/VgPm55yAjBI/AAAAAAAACmg/c1jrOLRsn8E/s640/IMG_20150918_183638407.jpg" width="640" /></a></span></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: xx-small;"><b>Thomas explaining PatternSynonyms to Eric and Ganesh</b></span></span></td></tr></tbody></table><h4 style="text-align: left;"><span style="font-family: Arial,Helvetica,sans-serif;">Diving into SelectChanges and PatchChoices code</span></h4><div style="text-align: left;"><span style="font-family: Arial,Helvetica,sans-serif;">On the first day I (Guillaume) claimed the <a href="http://bugs.darcs.net/issue2436">"rollback takes ages" bug</a>, which made me look into SelectChanges and PatchChoices code. The result is that I still haven't yet fixed the bug, but I discovered that patch matching was unnecessarily strict, <a href="http://hub.darcs.net/darcs/darcs-screened/patch/4d55c7ccc1e8cbd80066c05d66e6309bd96aed8e">which I could fix easily</a>. Internally, there are two interesting patch types when it comes to matching:</span></div><ul><li><span style="font-family: Arial,Helvetica,sans-serif;">NamedPatch: represent the contents of a patch file in _darcs/patches, that is, its info and its contents</span></li><li><span style="font-family: Arial,Helvetica,sans-serif;">PatchInfoAnd: represents the info of a patch as read from an inventory file (from _darcs/inventories or _darcs/hashed_inventory) and a lazy field to its corresponding NamedPatch.</span></li></ul><span style="font-family: Arial,Helvetica,sans-serif;">Now, getting the NamedPatch for some patch is then obviously more costly than a PatchInfoAnd. You may even have to download the patch file in order to read it (in the case of lazy repositories). Moreover, </span><span style="font-family: Arial,Helvetica,sans-serif;"> the majority of matchers only need the patch info (or metadata), not its actual contents. Only two matchers (hunk and touch) need to actually read the patch file, while matching or a patch name for instance (probably the most common operation) does not.</span><br /><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span><span style="font-family: Arial,Helvetica,sans-serif;">So, before the sprint, as soon as you wanted to match on a patch file, you had to open (and maybe download) its file, even if this was useless. With my change (mostly in Darcs.Patch.Match) we gained a little more laziness; and the unreasonably slow command "rollback -p ." passes from 2 minutes to ~15 seconds on my laptop. I hope to push this change into Darcs 2.10.2.</span><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://1.bp.blogspot.com/-3-kkJUFxXXk/VgP1RaVZM-I/AAAAAAAACms/-x5GNH6mxRA/s1600/darcs_sprint2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="http://1.bp.blogspot.com/-3-kkJUFxXXk/VgP1RaVZM-I/AAAAAAAACms/-x5GNH6mxRA/s640/darcs_sprint2.jpg" width="640" /></a></span></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Eric, Guillaume and Vinh</b></span></td></tr></tbody></table><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span><span style="font-family: Arial,Helvetica,sans-serif;">Now, the real source of the "rollback -p ." slowness is that patch selection is done on <a href="https://parenz.wordpress.com/2015/09/20/darcs-directed-types/">FL's (Forward List)</a>, while commands like rollback and obliterate naturally work backwards in time on RL. Currently, an RL is inverted and then given to the patch selection code, which is not convenient at all! Moreover, the actual representation of history of a Darcs repository is (close to being) an RL. So it seems like a proper fix for the bug is to generalize the patch selection code to also work on RL's; which may involve a good amount of typeclass'ing in the relevant modules. I think this will be too big/risky to port to the 2.10 branch, so it will wait for Darcs 2.12.</span><br /><h4 style="text-align: left;"><span style="font-family: Arial,Helvetica,sans-serif;">Ganesh's new not-yet-officially-named stash command</span></h4><div class="separator" style="clear: both; text-align: center;"></div><div style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-HeIGNpPhsEM/VgQH6ZtHxKI/AAAAAAAACnc/Dk1t_0V2wCY/s1600/IMG_20150920_143803780_HDR.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://2.bp.blogspot.com/-HeIGNpPhsEM/VgQH6ZtHxKI/AAAAAAAACnc/Dk1t_0V2wCY/s640/IMG_20150920_143803780_HDR.jpg" width="640" /></a></div><br /><span style="font-family: Arial,Helvetica,sans-serif;">A few days before the sprint, Ganesh unveiled his "stash" branch. It feature a refactoring that enables to suspend patches (ie, put them into a state such that they have no effect in the working copy) but without changing their identity (which is currently what occurs with the darcs rebase command). This enables to implement a git-stash-like feature.</span></div><div style="text-align: left;"><span style="font-family: Arial,Helvetica,sans-serif;"></span><br /><span style="font-family: Arial,Helvetica,sans-serif;"></span></div><div style="text-align: left;"><span style="font-family: Arial,Helvetica,sans-serif;">The sprinters (IRL and on IRC) <a href="http://irclog.perlgeek.de/darcs/2015-09-18#i_11239885">discussed</a> the possible name of the command that should encapsulate this stash feature. More importantly, on the last day we discussed what would be the actual UI of such a feature. As always when a new feature is coming to darcs, we want to make the UI as darcsy as possible :-)</span></div><div style="text-align: left;"><span style="font-family: Arial,Helvetica,sans-serif;"></span><br /><span style="font-family: Arial,Helvetica,sans-serif;"></span></div><div style="text-align: left;"><span style="font-family: Arial,Helvetica,sans-serif;">Coming back to the code, Ganesh's refactoring, if extensive, will also simplify the existing types for suspended patches. We decided to go with it.</span></div><h4><span style="font-family: Arial,Helvetica,sans-serif;">Dan's den</span></h4><div style="text-align: left;"><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://2.bp.blogspot.com/-FHOZaKYLLDA/VgQBvP78wlI/AAAAAAAACnE/Vma1JiSEcR4/s1600/IMG_20150920_163258089.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" height="313" src="http://2.bp.blogspot.com/-FHOZaKYLLDA/VgQBvP78wlI/AAAAAAAACnE/Vma1JiSEcR4/s640/IMG_20150920_163258089.jpg" width="640" /></a></span></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Dan demonstrating den (on the left: Florent)</b></span></td></tr></tbody></table><span style="font-family: Arial,Helvetica,sans-serif;">Daniil Frumin was this years <a href="http://darcs.net/GSoC/2015-Darcsden">Google Summer of Code student for Darcs</a>. Mentored by Ganesh, he brought improvements to Darcsden, many of them <a href="http://hub.darcs.net/">being already deployed</a>. Among them, it is possible to launch a local instance of Darcsden (using an executable called den), not unlike Mercurial's "serve" command.</span></div><div style="text-align: left;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div><span style="font-family: Arial,Helvetica,sans-serif;">Dan tells more about his work and this sprint <a href="https://parenz.wordpress.com/2015/09/24/darcsden-darcs/">in his latest blog post</a>.</span><br /><div class="separator" style="clear: both; text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></div><h4><span style="font-family: Arial,Helvetica,sans-serif;">A better website and documentation</span></h4><span style="font-family: Arial,Helvetica,sans-serif;">As a newcomer to the project, Vinh took a look at the documentation, especially the website of the project. He implemented changes to make the front page less intimidating and more organized. He also had a fresh look at our "quickstart" and proposed improvements which we felt were much needed!</span><br /><h4><span style="font-family: Arial,Helvetica,sans-serif;">Florent's projects</span></h4><span style="font-family: Arial,Helvetica,sans-serif;">For this sprint, Florent was more an external visitor than a Darcs hacker. He talked about one of his current projects: <a href="https://pijul.org/">Pijul</a>, a version control system with another approach. Check out their website!</span><br /><h4><span style="font-family: Arial,Helvetica,sans-serif;">Conclusion and the next sprint</span></h4><span style="font-family: Arial,Helvetica,sans-serif;">In the end this sprint turned out to be more productive and crowded than we initially thought! It has been a lot of time since the previous one, so we had a lot of things to share at first. Sprints do make synchronization between contributors more effective. They are also a moment when we can get more concentrated on the Darcs codebase, and spend more time tacking some issue.</span><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-MNzTrBoAiKI/VgQJZMtQzII/AAAAAAAACno/rR1WxqlTJfA/s1600/IMG_20150920_094036071_HDR.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="http://2.bp.blogspot.com/-MNzTrBoAiKI/VgQJZMtQzII/AAAAAAAACno/rR1WxqlTJfA/s640/IMG_20150920_094036071_HDR.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><b>Avenue d'Italie, Paris</b></td></tr></tbody></table><span style="font-family: Arial,Helvetica,sans-serif;">We would like to thank the IRILL people for hosting the sprint for the third time and our generous <a href="http://darcs.net/Donations">donators</a> to make travelling to sprints easier.</span><br /><br /><span style="font-family: Arial,Helvetica,sans-serif;">We already have a time and a place for the next sprint: <b>Sevilla</b>, Spain in <b>January 2016</b>! The exact moment will be announced later, but you can already start organizing yourself and <a href="http://darcs.net/Sprints/2016-01">tell us if you're going</a>.</span><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-vTv3HH2jLng/VgQL0ZtHPlI/AAAAAAAACoA/gKPSlbGXVpM/s1600/IMG_20150918_183531465_HDR.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="http://2.bp.blogspot.com/-vTv3HH2jLng/VgQL0ZtHPlI/AAAAAAAACoA/gKPSlbGXVpM/s400/IMG_20150918_183531465_HDR.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif;">Thomas, Eric and Ganesh</span></td></tr></tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-XdjO00HG-Oo/VgQL3TxDPGI/AAAAAAAACoI/v0iwfcciDeg/s1600/IMG_20150920_163311197.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="http://1.bp.blogspot.com/-XdjO00HG-Oo/VgQL3TxDPGI/AAAAAAAACoI/v0iwfcciDeg/s400/IMG_20150920_163311197.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">From left to right: Vinh, Florent, Dan, Ganesh and Eric</td></tr></tbody></table>guillaume (noreply@blogger.com)http://blog.darcs.net/Dan Frumin: Darcsden improvements and Darcs sprinthttp://parenz.wordpress.com/?p=1922015-09-24T13:06:49+00:00<p>This post is intended to be a short summary of my SoC project, as well as my recent trip to Darcs sprint.</p>
<h2 id="introduction">Introduction</h2>
<p>I am finishing up this post on the train back from the Autumn 2015 <a href="http://darcs.net/Sprints/2015-09">Darcs sprint</a>. Today (Sept 20, Sun) was a very fun day full of darcs chatting and coding. By the end of the day we’ve heard a number of presentations</p>
<ul>
<li>Ganesh described his work on "stash" command for darcs (naming subject to change!). It involves some refactoring of the rebase code. I hope we would hear more from him on that, because the internal workings are actually quite interesting — I believe it’s the first time singleton types and <code>DataKinds</code> are used in the darcs codebase;</li>
<li>Florent Becker gave a presentation about <a href="http://pijul.org">Pijul</a> and the theory behind it — <em>A Categorical Theory of Patches</em> by Samuel Mimram and Cinzia Di Giusto, see <a href="http://arxiv.org/abs/1311.3903">arXiv:1311.3903</a>;</li>
<li>Vinh Dang talked about his improvements on the <a href="http://darcs.net">darcs wiki</a> (it’s about time to organize the website), his goal was to make it more accessible to the newcomers;</li>
<li>Yours truly gave a small presentation, outline of which you will find below:</li>
</ul>
<h2 id="looking-back">Looking back</h2>
<p>I have spent this summer hacking on <a href="http://hub.darcs.net/simon/darcsden">DarcsDen</a> as part of the Google Summer of Code program.</p>
<p>My basic goal was to create a "local" version of darcsden. It was not a trivial task to install darcsden (and probably installation is still not very easy!). It uses a third-party software like Redis and CouchDB. During my coding process I modifed darcsden such that it now can be a good choice for local (or lightweight single user) darcs UI. The local darcsden version can be used without any databases, tracking the repositories in the local file system. This way darcsden can be used by a developer on her local computer, like darcsum, (for working with/comparing repositories) as well as a replacement for darcsweb/cgit — a single user web front for darcs repositories.</p>
<p>Besides that a user of a local version can use darcsden’s interactive UI for recording new patches, as well as a command-line tool <code>den</code> for a quick way of browsing the repositories.</p>
<p>Installing darcsden-local is currently not as easy as I want to it be, but I hope that soon you will be able to install it just by running <code>cabal install darcsden</code> or <code>brew install darcsden</code>. As for now, one could do the following:</p>
<ol>
<li><code>darcs get --lazy <a href="http://hub.darcs.net/co-dan/darcsden-local" rel="nofollow">http://hub.darcs.net/co-dan/darcsden-local</a></code></li>
<li><code>cabal install .</code> or <code>stack install</code></li>
</ol>
<p>This should install the darcsden binary and all the related css/js files. You can start darcsden by running <code>darcsden --local</code>. If you open your web browser you should see a list of repositories in the current directory.</p>
<p>However, you might have repositories scattered all over the place, and scanning your whole system for darcs repositories is just inefficient. For this purposes darcs keeps a list of repositories in a file inside your <code>~/.darcs</code> directory. You can manage that list either by hand, or using the command-line <code>den</code> tool:</p>
<ul>
<li><code>den $PATH</code> — add $PATH to the list of repositories in <code>~/.darcs/darcsden_repos</code> (if it’s not already present there), start darcsden server in the background and launch the browser pointing to $PATH;</li>
<li><code>den</code> — the same as <code>den .</code>;</li>
<li><code>den --add $PATH</code> — add $PATH to the list of repositories in <code>~/.darcs/darcsden_repos</code>;</li>
<li><code>den --remove $PATH</code> — remove $PATH from the list of repositories in <code>~/.darcs/darcsden_repos</code>.</li>
</ul>
<p>In order to further customize darcsden, one can tweak the configuration file located at <code>~/.darcs/darcsden.conf</code>. Apart from the usual <a href="http://hub.darcs.net/simon/darcsden#to-configure">darcsden settings</a> one may pay attention to the following variables:</p>
<ul>
<li><code>homeDir</code> (default <code>.</code>), points to the "root" directory with repositories. If the list file <code>~/.darcs/darcsden_repos</code> is not present darcsden will recursively search repositories in that directory</li>
<li><code>unLocal</code>, <code>pwLocal</code>: the username and the password of the "local" user</li>
</ul>
<p>The user/password credentials are required for editing the repositories and recording new patches. However, the <code>den</code> binary should automatically pick them up from the config file and log you in.</p>
<p>Once you are logged in, and you have unrecorded changes in the repository, you can use darcsden UI to record a new patch.</p>
<div class="figure">
<img alt="DarcsDen record" src="https://i2.wp.com/covariant.me/stuff/img/denrecord.gif" /><p></p>
<p class="caption">DarcsDen record</p>
</div>
<p>Below you can see an example of recording and merging patches from a branch.</p>
<div class="figure">
<img alt="DarcsDen merge" src="https://i2.wp.com/covariant.me/stuff/img/denmerge.gif" /><p></p>
<p class="caption">DarcsDen merge</p>
</div>
<p>Darsden allows you to create forks/branches of your repositories, and it keeps track of the patch dependencies in your branches.</p>
<p>More "internal" changes:</p>
<ul>
<li>Instead of having to specify some parts of the configuration in DarcsDen.Settings, darcsden now uses runtime flags: –hub for using hub-specific modifications, –local for using the local backend and no flag for default behaviour</li>
<li>The flag actually choose what are called <em>instances</em> — something that a bit less fine-grained than settings. Instances allow you to pick backend, overwrite settings, modify the looks of the front page.</li>
<li>HTTP-testing using <a href="http://hackage.haskell.org/package/wreq">wreq</a>. The previous test suite used selenium and it got bit-rotten. The wreq-based is easier to run and perhaps slightly easier to maintain.</li>
<li>HTTP auth, which is used as part of the local instance; the <code>den</code> tool utilizes it to log the user in automatically.</li>
<li>Support for repositories inside directories and nested repositories.</li>
<li>All the backend code that is used for handling repositories and meta-data on the file system.</li>
<li>Functionality for downloading zipped dist archives of darcs repositories.</li>
<li>Assorted mini-fixes</li>
</ul>
<h2 id="what-now">What now?</h2>
<p>During the <a href="http://darcs.net/Sprints/2015-09">sprint</a> I hacked together some code for viewing <a href="https://parenz.wordpress.com/2015/07/28/darcs-rebase-by-example/">suspended</a> patches along the regular ones. The next step would be to have a similar interface for managing the suspended patches.</p>
<p>We have also discussed the possibility of adding rewrite rules implementing short-cut fusion <a href="https://parenz.wordpress.com/2015/09/20/darcs-directed-types/">for the directed types</a> in Darcs. In order to see if it’s really worth it we would have to bring back to life the benchmarking suite (or at least check on it!).</p>
<p>It was a really exciting weekend for me and I was delighted to meet some of my IRC friends. As it turns out, it is a small world and despite being from different parts of it we have a bunch of common IRL friends, professors. As the French would (probably not) say, <em>très bien</em>. The next darcs sprint will probably be in January, and probably in Europe, again.</p>Danhttps://parenz.wordpress.comDan Frumin: Darcs internals, part 1: typesafe directed datastructureshttp://parenz.wordpress.com/?p=1872015-09-20T10:22:56+00:00<p><em>I am editing this post from IRILL, where the <a href="http://darcs.net/Sprints/2015-09">darcs sprint</a> is taking place</em></p>
<p>One of the things that I particularly like about the Darcs codebase is that you can see that the developers were not shy about using intermediate-slash-advanced Haskell/GHC features to help achieving type safety. You can see GADTs, associated types, phantom types, existential types actively used.</p>
<p>In this post I would like to discuss the representation of patches and the use of type witnesses in darcs.</p>
<h1 id="a-word-about-patches-and-contexts">A word about patches and contexts</h1>
<p>This post is intended for people interested in patch theory and its implementation in darcs. A passing familiarity with <a href="https://en.wikibooks.org/wiki/Understanding_Darcs/Patch_theory">patches, contexts, inverses, etc</a> is useful, but not required, as we restate some basic definitions in this section.</p>
<p>A <em>primitive patch</em> is a basic unit in patch theory. It constitutes an atomic change in the repository. The definition of a primitive patch may vary, but usually the following changes are considered primitive patches:</p>
<ul>
<li>Removing a file from the repository</li>
<li>Adding file to the repository</li>
<li>Changing a line <code>n</code> in a file in the repository</li>
<li>Identity patch, i.e. an empty/non-existing change that does not modify the state of the repository at all</li>
</ul>
<p>Every primitive patch has a pre-context and a post-context. Roughly, you can think of a pre-context as the full state of the repository <strong>before</strong> the change was made, and of the post-context as the full state of the repository <strong>after</strong> the change was applied. We write <code>(x)-A-&gt;(y)</code> for a patch <code>A</code> with a pre-context <code>x</code> and a post-context <code>y</code>.</p>
<p>If a primitive patch <code>A</code> has a pre-context <code>a</code>, a post-context <code>o</code>, and a primitive patch <code>B</code> has a pre-context <code>o</code>, a post-context <code>b</code>, then we can combine two patches to obtain a <em>sequential patch</em> <code>AB</code> with the pre-context <code>a</code> and the post-context <code>b</code>.</p>
<p>Every primitive patch <code>(x)-A-&gt;(y)</code> has an inverse <code>(y)-A^{-1}-&gt;(x)</code>, such that <code>(x)-A-&gt;(y)-A^{-1}-&gt;(x)</code> is equivalent to the identity patch <code>(x)-1-&gt;(x)</code>.</p>
<p>In the next sections we will see how those things are implemented in darcs.</p>
<h1 id="primitive-patches-and-witnesses">Primitive patches and witnesses</h1>
<p>A <em>primitive</em> patch, which constitutes a single fine grained change, can be represented as a (G)ADT:</p>
<pre><code>data Prim where
Move :: FileName -&gt; FileName -&gt; Prim
RmFile :: FileName -&gt; Prim
AddFile :: FileName -&gt; Prim
Hunk :: FileName -&gt; Int -&gt; ByteString -&gt; ByteString -&gt; Prim
RmDir :: FileName -&gt; Prim
…</code></pre>
<p>We can represent complex patches as sequences of primitive patches:</p>
<pre><code>data Patch where
NilP :: Patch
PrimP :: Prim -&gt; Patch
SeqP :: Patch -&gt; Patch -&gt; Patch</code></pre>
<p>This seems reasonable enough. But if we implement our patch theory this way we seem to be missing something — patches have (pre- and post-) contexts. Having contexs allows us to enforce patch composition on the level of type system. Consider the following definition, which uses phantom types as type witnesses for contexts.</p>
<pre><code>data Prim x y where
Move :: FileName -&gt; FileName -&gt; Prim x y
RmFile :: FileName -&gt; Prim x y
AddFile :: FileName -&gt; Prim x y
Hunk :: FileName -&gt; Int -&gt; ByteString -&gt; ByteString -&gt; Prim x y
RmDir :: FileName -&gt; Prim x y
…
data Patch x y where
NilP :: Patch x x
PrimP :: Prim x y -&gt; Patch x y
SeqP :: Patch x y -&gt; Patch y z -&gt; Patch x z</code></pre>
<p>We call the types with witnesses representing pre- and post-contexts <em>directed types</em>. Intuitively, the directed type <code>D x y</code> has a “direction” from <code>x</code> to <code>y</code>, written as <code>(x)-&gt;(y)</code>. The <code>Prim</code> datatype looks pretty much like the type actually used in Darcs. The <code>Patch</code> datatype, however, is completely artificial. We will see in the next sections how Darcs really models complex patches.</p>
<h1 id="directed-programming">Directed programming</h1>
<h2 id="fl-rl">FL &amp; RL</h2>
<p>Two particularly useful directed types used in darcs are directed lists: forwards lists of the type <code>FL a x y</code> and reverse lists <code>RL a x y</code>. Forward lists “go” from the head to the tail; reverse lists “go” from the tail to the head. The lists are polymorphic over <code>a</code> just like regular lists.</p>
<pre><code>data FL a x y where
NilFL :: FL a x x {- The empty list stays at (x) -}
(:&gt;:) :: a x y -&gt; FL a y z -&gt; FL a x z
infixr 5 :&gt;:</code></pre>
<p>For myself, I visualise forward lists like this:</p>
<pre><code>(x) —a—&gt; (y) —b—&gt; (z) ——Nil——&gt; (z)
a :: Patch x y
b :: Patch y z
(a :&gt;: b :&gt;: NilFL) :: FL Patch x z</code></pre>
<p>The reverse lists are “going” from tail to head<a class="footnoteRef" href="https://parenz.wordpress.com/2015/09/20/darcs-directed-types/#fn1" id="fnref1"><sup>1</sup></a></p>
<pre><code>data RL a x y where
NilRL :: RL a x x
(:&lt;:) :: RL a x y -&gt; a y z -&gt; RL a x z
infixl 5 :&lt;:</code></pre>
<p>(Mnemonically, the the head is always “greater” than the tail)</p>
<p>The reason I used the word “go” inside quotation marks so far is the following. Reverse lists and forward lists represent the same concept: a sequence of patches (or a sequence of directed things for that matter). They only differ in the associativity of the elements. Forward lists associate to the right, but reverse lists associate to the left.</p>
<pre><code>p = Move "foo" "bar"
-- [[(x) --Nil--&gt; (x) -p-&gt; (y)] -id-&gt; (y)] -p^{-1}-&gt; (x)
example :: RL Patch x x
example = NilRL :&lt;: p :&lt;: Identity :&lt;: inverse p
-- (x) -p-&gt; [(y) -p^{-1}-&gt; (x) --Nil--&gt; (x)]
example2 :: FL Patch x x
example2 = p :&gt;: inverse p :&gt;: NilFL</code></pre>
<p>The right-associated/reverse lists provide easy access to the last element of the sequence; the left-associated/forward lists provide easy access to the first element of the sequence. Therefore, if we view a repository as a directed sequence of patches, right-associated lists are useful for operations that work on the “latest” patches in the repository (such as record/unrecord), and left-associated lists are useful for commands that scan the repository from the beginning (like clone).</p>
<p>We can reassociate the lists easily, and verify that the two representations are isomoprhic:<a class="footnoteRef" href="https://parenz.wordpress.com/2015/09/20/darcs-directed-types/#fn2" id="fnref2"><sup>2</sup></a></p>
<pre><code>reverseRL :: RL a wX wY -&gt; FL a wX wY
reverseRL = r NilFL
-- the type signature of r basically gives us an invariant
-- wZ is slowly "decreasing" reaching the point where
-- wZ = wX; at that point the first argument is of type FL a wX wY
where r :: FL a wZ wY -&gt; RL a wX wZ -&gt; FL a wX wY
r a NilRL = a
r a (xs :&lt;: x) = r (x :&gt;: a) xs</code></pre>
<p>For example,</p>
<pre><code>-- [[(x) --Nil--&gt; (x) -p-&gt; (y1)] -q-&gt; (y2)] -r-&gt; (z)</code></pre>
<p>Turns into</p>
<pre><code>-- (x) -p-&gt; [(y1) -q-&gt; (y2) -r-&gt; [(z) --Nil--&gt; (z)]]</code></pre>
<p><em>Exercise</em>: write a function <code>reverseFL :: FL a wX wY -&gt; RL a wX wY</code></p>
<p>We can write a lot of directed analogues of familiar list functions. For example, here is a directed append:</p>
<pre><code>infixl 5 +&lt;+
(+&lt;+) :: RL a wX wY -&gt; RL a wY wZ -&gt; RL a wX wZ
xs +&lt;+ NilRL = xs
xs +&lt;+ (ys :&lt;: y) = (xs +&lt;+ ys) :&lt;: y</code></pre>
<p><em>Exercise</em>: write directed append for forward lists: <code>(+&gt;+) :: FL a wX wY -&gt; FL a wY wZ -&gt; FL a wX wZ</code></p>
<h3 id="type-witnesses">Type witnesses</h3>
<p>So we wrote a bunch of standard list functions for directed lists; what about some of the other functions? Can we, for example, implement <code>filter</code> for directed lists. Can it look like <code>filterFL :: (a wX wY -&gt; Bool) -&gt; FL a wX wY</code>? Well, we can try writing</p>
<pre><code>filterFL :: (a wX wY -&gt; Bool) -&gt; FL a wX wY
filterFL p NilFL = NilFL
filterFL p (x :&gt;: xs) | p x = filterFL p xs
| otherwise = x :&gt;: filterFL p xs</code></pre>
<p>However, under closer scrutiny we realize that it does not typecheck! In the second clause of filterFL we have the following information:</p>
<pre><code>x :: a x y, xs :: FL a y z
filterFL xs :: FL a y z</code></pre>
<p>Thus, in the first case (in which <code>p x</code> holds) we try to return something of the type <code>FL a wY wZ</code>, when <code>FL a wX wZ</code> was expected. It is clear that generally we can do this only if <code>x :: a wX wX</code>, i.e. <code>wY = wX</code>. But a simple predicate of the type <code>p :: a wX wZ -&gt; Bool</code> won’t tell us anything about that. We need an additional type witness in our system telling us that if <code>p x</code> holds, then <code>x :: a wX wX</code>. For that purpose we introdue the EqCheck datatype.</p>
<pre><code>data EqCheck wX wY where
IsEq :: EqCheck wX wX
NotEq :: EqCheck wX wY</code></pre>
<p>then the type of a predicate would be</p>
<pre><code>type Pred a = forall wX wY. a wX wY -&gt; EqCheck wX wY</code></pre>
<p>If <code>(p x) = IsEq</code>, then the typechecker will know that <code>x :: a wX wX</code>. We can then finally write</p>
<pre><code>filterFL :: Pred a -&gt; FL a wX wY -&gt; FL a wX wY
filterFL p NilFL = NilFL
filterFL p (x :&gt;: xs) | IsEq &lt;- p x = filterFL p xs
| otherwise = x :&gt;: filterFL p xs</code></pre>
<p><code>EqCheck</code> is used this way in the darcs source code to e.g., filter our internal patches. Sometimes darcs stores information — like <a href="https://parenz.wordpress.com/2015/07/28/darcs-rebase-by-example/">suspended patches</a> — in the so called <em>internal patches</em>. Every patch type implements the internal patch checker (code slightly adapted):</p>
<pre><code>-- |Provides a hook for flagging whether a patch is "internal" to the repo
-- and therefore shouldn't be referred to externally, e.g. by inclusion in tags.
-- Note that despite the name, every patch type has to implement it, but for
-- normal (non-internal) types the default implementation is fine.
-- Currently only used for rebase internal patches.
class MaybeInternal p where
-- | @maybe (const NotEq) (fmap isInternal patchInternalChecker) p@
-- returns 'IsEq' if @p@ is internal, and 'NotEq' otherwise.
-- The two-level structure is purely for efficiency: 'Nothing' and 'Just (InternalChecker (const NotEq))' are
-- semantically identical, but 'Nothing' allows clients to avoid traversing an entire list.
-- The patch type is passed as an 'FL' because that's how the internals of named patches are stored.
patchInternalChecker :: Maybe (forall wX wY . FL p wX wY -&gt; EqCheck wX wY)
patchInternalChecker = Nothing</code></pre>
<p>When the user runs <code>darcs tag</code> in the repository, darcs creates a dummy patch that explicitly depends on all the previous patches — apart from the internal ones of course. Thus, the <code>tag</code> command uses the following function (slightly adapted):</p>
<pre><code>filterNonInternal :: MaybeInternal p =&gt; PatchSet p wX wY -&gt; PatchSet p wX wY
filterNonInternal =
case patchInternalChecker of
Nothing -&gt; id
Just f -&gt; \l -&gt; PatchSet (filterRL (f . patchcontents . hopefully) (unPatchSet l))</code></pre>
<p>where a <code>PatchSet</code> is the list of <code>PatchInfoAnd</code> patches — patches together with the meta-information.</p>
<p>It is worth noting that <code>EqCheck x y</code> is isomorphic <code>Maybe (x :~: y)</code>, but the <a href="https://hackage.haskell.org/package/base/docs/Data-Type-Equality.html">propositional equality datatype</a> has only been added to base since 4.7.0.0. In the future versions darcs will probably switch to using <code>Data.Type.Equality</code>.</p>
<h1 id="conclusion">Conclusion</h1>
<p>We’ve briefly touched upon patch representation in darcs and talked about directed types and directed programming.</p>
<p>A good if a bit outdated reference is Jason Dagit’s <a href="http://files.codersbase.com/thesis.pdf">master thesis</a> (specifically the bits from chapter 4). The <a href="http://darcs.net/Internals/Witnesses">wiki</a> is currently lacking in material, but I hope to improve the situation eventually.</p>
<p>Next time we will probably discuss either directed pairs and their use in darcs, or sealed datatypes, or both.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
<p>Essentially, a reverse list is a directed version of a snoc-list.<a href="https://parenz.wordpress.com/2015/09/20/darcs-directed-types/#fnref1"><img alt="↩" class="wp-smiley" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/21a9.png" style="height: 1em;" /></a></p>
</li>
<li id="fn2">
<p>Before darcs 2.10.1 the right-associated lists had a slightly different datatype, and for the old lists those functions would “reverse” the list. Hence the names of the functions.<a href="https://parenz.wordpress.com/2015/09/20/darcs-directed-types/#fnref2"><img alt="↩" class="wp-smiley" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/21a9.png" style="height: 1em;" /></a></p>
</li>
</ol>
</div>Danhttps://parenz.wordpress.comDarcs News: Darcs News #111tag:blogger.com,1999:blog-819021106854702432.post-30877709492530653822015-09-01T22:26:38+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>The next Darcs Sprint will take place in Paris on September 18-20th. Please add yourself to the wiki page if you're going!<br /> <ul><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2015-August/027134.html">http://lists.osuosl.org/pipermail/darcs-users/2015-August/027134.html</a></li><li><a class="uri" href="http://darcs.net/Sprints/2015-09">http://darcs.net/Sprints/2015-09</a></li></ul></li><li>Darcs 2.10.1 has been released (bugfixes, dependency versions bump):<br /> <ul><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2015-July/027130.html">http://lists.osuosl.org/pipermail/darcs-users/2015-July/027130.html</a></li></ul></li></ol><h3 id="issues-resolved-19">Issues resolved (19)</h3><dl><dt>issue2102 Guillaume Hoffmann</dt><dd><ul><li>document packs in help of clone and optimize http</li><li><a class="uri" href="http://bugs.darcs.net/issue2102">http://bugs.darcs.net/issue2102</a></li></ul></dd><dt>issue2307 Daniil Frumin</dt><dd><ul><li>Add information about 'darcs help manpage' and 'darcs help markdown'</li><li><a class="uri" href="http://bugs.darcs.net/issue2307">http://bugs.darcs.net/issue2307</a></li></ul></dd><dt>issue2308 Ben Franksen</dt><dd><ul><li>use command agnostic comment for changes summary</li><li><a class="uri" href="http://bugs.darcs.net/issue2308">http://bugs.darcs.net/issue2308</a></li></ul></dd><dt>issue2327 Alain91</dt><dd><ul><li>ask user to keep trying if locking fails</li><li><a class="uri" href="http://bugs.darcs.net/issue2327">http://bugs.darcs.net/issue2327</a></li></ul></dd><dt>issue2420 Ben Franksen</dt><dd><ul><li>commandGetArgPossibilities for apply should not list all files in the repo</li><li><a class="uri" href="http://bugs.darcs.net/issue2420">http://bugs.darcs.net/issue2420</a></li></ul></dd><dt>issue2421 Guillaume Hoffmann</dt><dd><ul><li>don't fail if caches are not writeable</li><li><a class="uri" href="http://bugs.darcs.net/issue2421">http://bugs.darcs.net/issue2421</a></li></ul></dd><dt>issue2423 Alain91</dt><dd><ul><li>fix diff only respecting --diff-command when a diff.exe is present</li><li><a class="uri" href="http://bugs.darcs.net/issue2423">http://bugs.darcs.net/issue2423</a></li></ul></dd><dt>issue2433 Guillaume Hoffmann</dt><dd><ul><li>fix help strings of send and fetch</li><li><a class="uri" href="http://bugs.darcs.net/issue2433">http://bugs.darcs.net/issue2433</a></li></ul></dd><dt>issue2438 Guillaume Hoffmann</dt><dd><ul><li>no longer build patch index by default on cloning</li><li><a class="uri" href="http://bugs.darcs.net/issue2438">http://bugs.darcs.net/issue2438</a></li></ul></dd><dt>issue2444 Ben Franksen</dt><dd><ul><li>added default interactivity parameter to isInteractive</li><li><a class="uri" href="http://bugs.darcs.net/issue2444">http://bugs.darcs.net/issue2444</a></li></ul></dd><dt>issue2446 Guillaume Hoffmann</dt><dd><ul><li>in fast-export delete dirs before dumping contents</li><li><a class="uri" href="http://bugs.darcs.net/issue2446">http://bugs.darcs.net/issue2446</a></li></ul></dd><dt>issue2447 Ben Franksen</dt><dd><ul><li>by using getNonrangeMatch as in ShowFiles</li><li><a class="uri" href="http://bugs.darcs.net/issue2447">http://bugs.darcs.net/issue2447</a></li></ul></dd><dt>issue2448 Gian Piero Carrubba</dt><dd><ul><li>enable -h/--hash flag for the diff command</li><li><a class="uri" href="http://bugs.darcs.net/issue2448">http://bugs.darcs.net/issue2448</a></li></ul></dd><dt>issue2449 Ganesh Sittampalam</dt><dd><ul><li>use new hook in shelly to handle test output as binary</li><li><a class="uri" href="http://bugs.darcs.net/issue2449">http://bugs.darcs.net/issue2449</a></li></ul></dd><dt>issue2451 Ben Franksen</dt><dd><ul><li>allow terminfo 0.4.*</li><li><a class="uri" href="http://bugs.darcs.net/issue2451">http://bugs.darcs.net/issue2451</a></li></ul></dd><dt>issue2457 Ben Franksen</dt><dd><ul><li>fix darcs-test command line options</li><li><a class="uri" href="http://bugs.darcs.net/issue2457">http://bugs.darcs.net/issue2457</a></li></ul></dd><dt>issue2461 Ben Franksen</dt><dd><ul><li>this time also when no file names are specified</li><li><a class="uri" href="http://bugs.darcs.net/issue2461">http://bugs.darcs.net/issue2461</a></li></ul></dd><dt>issue2461 Ben Franksen</dt><dd><ul><li>darcs log --repo=remoterepo creates and populates _darcs</li><li><a class="uri" href="http://bugs.darcs.net/issue2461">http://bugs.darcs.net/issue2461</a></li></ul></dd><dt>issue2463 Joachim Breitner</dt><dd><ul><li>building darcs on powerpc</li><li><a class="uri" href="http://bugs.darcs.net/issue2463">http://bugs.darcs.net/issue2463</a></li></ul></dd></dl><h3 id="patches-applied-145">Patches applied (145)</h3>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2015-09-01">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Dan Frumin: Darcs rebase by examplehttp://parenz.wordpress.com/?p=1792015-07-28T10:40:20+00:00<p>Darcs is a patch-centric version control system. In Darcs, there is no “correct” linear history of a repository – rather, there is a poset of patches. That means that most of the time you are pushing and pulling changes you can cherry-pick patches without a problem. However, in some cases you cannot perform a pull (or some other operation on the repository) smoothly. Sometimes it is necessary to rewrite the “history” – i.e. modify a patch that is a dependency of one or more other patches. For those cases <code>darcs rebase</code> comes in handy. To put it in the words of the implementor “Rebase is a workaround for cases where commutation doesn’t do enough”.</p>
<p>A repository can change it’s state from rebase-in-progress back to normal if there are no suspended patches left. However, be aware that you cannot unsuspend a patch<a class="footnoteRef" href="https://parenz.wordpress.com/2015/07/28/darcs-rebase-by-example/#fn1" id="fnref1"><sup>1</sup></a> if you have unrecorded changes in the repository. In light of this, I suggest recording a temporary patch with current changes</p>
<pre><code>darcs record -am DRAFT</code></pre>
<p>You can suspend that patch at the beginning of your rebase process and apply it at the end.</p>
<h1 id="general-overview-of-rebase">General overview of rebase</h1>
<p><code>darcs rebase</code> is an operation (or, rather, a family of operations) that allows one to make changes “deep down” in the repository history. One of the crucial things that allows for <code>rebase</code> to work is the fact that since darcs 2.10 patches can be <em>suspended</em>. When one performs any of the <code>darcs rebase</code> commands, the repository moves to a special rebase-in-progress state. In this state repository contains a pristine, a set of patches, a working copy, and — in addition to all the usual stuff — a set of <em>suspended</em> patches. Suspended patches are not active in the repository — that is, they are not applied.</p>
<p>Let’s go over the <code>rebase</code> subcommands</p>
<h2 id="rebase-logrebase-changes">rebase log/rebase changes</h2>
<p>This is simple: list the <em>suspended</em> patches</p>
<h2 id="rebase-suspend">rebase suspend</h2>
<p>Moves selected patches into the <em>suspended</em> state. Once the patch is suspended it is no longer active in the repository.</p>
<p><strong>Note</strong>: once you suspend a patch, it changes its identity. That means that even if you suspend a patch and unsuspend it immediately, you <em>will</em> get a different repository that you have started with. Let this be a good reason (one of a couple!) for doing rebase on a separate branch.</p>
<pre><code>&gt; cat file
test
123
&gt; darcs rebase suspend
patch 64523bc4622fad02a4bdb9261887628b7997ebdd
Author: Daniil Frumin
Date: Thu Jul 23 18:49:30 MSK 2015
* 123
Shall I suspend this patch? (1/5) [ynW…], or ? for more options: y
patch cc54d7cf4b9e3d13a24ce0b1b77b76581d98d75d
Author: Daniil Frumin
Date: Thu Jul 23 18:43:53 MSK 2015
* Test
Shall I suspend this patch? (2/5) [ynW…], or ? for more options: d
Rebase in progress: 1 suspended patches
&gt; darcs rebase log
patch 64523bc4622fad02a4bdb9261887628b7997ebdd
Author: Daniil Frumin
Date: Thu Jul 23 18:49:30 MSK 2015
* 123
Shall I view this patch? (1/?) [yN…], or ? for more options: y
[123
Daniil Frumin **20150723154930
Ignore-this: 43e09e6503ac74688e74441dc29bce25
] hunk ./file 2
+123
Rebase in progress: 1 suspended patches
&gt; cat file
test</code></pre>
<h2 id="rebase-unsuspend">rebase unsuspend</h2>
<p>Does the opposite of <code>suspend</code>: applies a suspended patch to the repository and changes its state to normal.</p>
<pre><code>&gt; darcs rebase unsuspend
patch 64523bc4622fad02a4bdb9261887628b7997ebdd
Author: Daniil Frumin
Date: Thu Jul 23 18:49:30 MSK 2015
* 123
Shall I unsuspend this patch? (1/1) [ynW…], or ? for more options: y
Do you want to unsuspend these patches? [Yglqk…], or ? for more options: y
Rebase finished!</code></pre>
<h2 id="rebase-apply">rebase apply</h2>
<p>Rebase apply takes a patch bundle and tries to apply all the patches in the bundle to the current repository. If a patch from the bundle conflicts with a local patch, then the <em>local</em> patch gets suspended. You will thus have a chance to resolve the conflict by amending your conflicting patches, at a price of.. well, changing the identity of your local patches.</p>
<h2 id="rebase-pull">rebase pull</h2>
<p>Sort of like <code>rebase apply</code>, but instead of a patch bundle it obtains the patches from a remote repository.</p>
<p>Specifically, <code>rebase pull</code> applies all the remote patches, one-by-one, suspending any <em>local</em> patches that conflict. We will see more of <code>rebase pull</code> in the second example.</p>
<h1 id="example-1-suspending-local-changes">Example 1: suspending local changes</h1>
<p>Imagine the following situation: at point A you add a configuration file to your repository, then you record a patch B that updates the settings in the configuration file. After that you make some more records before you realize that you’ve included by accident your private password in patch A! You want to get rid of it in your entire history, but you can’t just unrecord A, because B depends on A, and possibly some other patches depend on B.</p>
<p>The contents of the configuration file after patch A:</p>
<pre><code>port = 6667
host = irc.freenode.net
password = awesomevcs </code></pre>
<p>Patch B, diff:</p>
<pre><code>@@ -1,3 +1,4 @@
-port = 6667
+port = 6697
+usessl = True
host = irc.freenode.net
password = awesomevcs</code></pre>
<p>You cannot just amend patch A, because the patch B depends on A:</p>
<pre><code>&gt; darcs amend
patch 1925d640f1f3180cb5b9e64260c1b5f374fce4ca
Author: Daniil Frumin
Date: Tue Jul 21 13:23:07 MSK 2015
* B
Shall I amend this patch? [yNjk…], or ? for more options: n
Skipping depended-upon patch:
patch 22d7c8da83141f8b1f80bdd3eff02064d4f45c6b
Author: Daniil Frumin
Date: Tue Jul 21 13:22:24 MSK 2015
* A
Cancelling amend since no patch was selected.</code></pre>
<p>What we will have to do is <em>temporarily suspend</em> patch B, amend patch A, and then unsuspend B.</p>
<pre><code>&gt; darcs rebase suspend
patch 1925d640f1f3180cb5b9e64260c1b5f374fce4ca
Author: Daniil Frumin
Date: Tue Jul 21 13:23:07 MSK 2015
* B
Shall I suspend this patch? (1/2) [ynW…], or ? for more options: y
patch 22d7c8da83141f8b1f80bdd3eff02064d4f45c6b
Author: Daniil Frumin
Date: Tue Jul 21 13:22:24 MSK 2015
* A
Shall I suspend this patch? (2/2) [ynW…], or ? for more options: d
Rebase in progress: 1 suspended patches</code></pre>
<p>At this point, the state of our repository is the following: there is one (active) patch A, and one <em>suspended</em> patch B.</p>
<pre><code>&gt; darcs rebase changes -a
patch 4c5d45230dc146932b21964aea938e2a978523eb
Author: Daniil Frumin
Date: Tue Jul 21 13:28:58 MSK 2015
* B
Rebase in progress: 1 suspended patches
&gt; darcs changes -a
patch 21f56dfb425e4c49787bae5db4f8869e96787fb2
Author: Daniil Frumin
Date: Tue Jul 21 13:28:49 MSK 2015
* A
Rebase in progress: 1 suspended patches
&gt; cat config
port = 6667
host = irc.freenode.net
password = awesomevcs
&gt; $EDITOR config # remove the password bit
&gt; darcs amend
patch 22d7c8da83141f8b1f80bdd3eff02064d4f45c6b
Author: Daniil Frumin
Date: Tue Jul 21 13:22:24 MSK 2015
* A
Shall I amend this patch? [yNjk…], or ? for more options: y
hunk ./config 3
-password = awesomevcs
Shall I record this change? (1/1) [ynW…], or ? for more options: y
Do you want to record these changes? [Yglqk…], or ? for more options: y
Finished amending patch:
patch 21f56dfb425e4c49787bae5db4f8869e96787fb2
Author: Daniil Frumin
Date: Tue Jul 21 13:28:49 MSK 2015
* A
Rebase in progress: 1 suspended patches</code></pre>
<p>Now that we’ve removed the password from the history, we can safely unsuspend patch B (in this particular situation we actually know that applying B to the current state of the repository won’t be a problem, because B does not conflict with our modified A)</p>
<pre><code>&gt; darcs rebase unsuspend
patch 1925d640f1f3180cb5b9e64260c1b5f374fce4ca
Author: Daniil Frumin
Date: Tue Jul 21 13:23:07 MSK 2015
* B
Shall I unsuspend this patch? (1/1) [ynW…], or ? for more options: y
Do you want to unsuspend these patches? [Yglqk…], or ? for more options: y
Rebase finished!</code></pre>
<p>And that’s done!</p>
<pre><code>&gt; cat config
port = 6697
usessl = True
host = irc.freenode.net</code></pre>
<p>You may use this rebase strategy for removing sensitive information from the repository, for removing that 1GB binary .iso that you added to your repository by accident, or for combining two patches into one deep down in the patchset.</p>
<h1 id="example-2-developing-against-a-changing-upstream---rebase-pull">Example 2: developing against a changing upstream – rebase pull</h1>
<p>Imagine you have a fork R’ of a repository R that you are working on. You are implementing a feature that involves a couple of commits. During your work you record a commit L1 that refractors some common datum from modules A.hs and B.hs. You proceed with your work recording a patch L2. At this point you realise that after you forked R, the upstream recorded two more patches U1 and U2, messing with the common datum in A.hs. If you just pull U1 into your fork R’, you will have a conflict, that you will have to resolve by recording another patch on top.</p>
<pre><code> S
/ \
/ \
L1 U1</code></pre>
<p><strong>Note</strong>: if you run <code>darcs rebase pull</code> in R’, then the only patches that will be suspended are the ones which are already in R’. Because suspended patches gain new identity, make sure that you do not have other people’s conflicting patches present in R’.</p>
<p>The way to solve this would be to first do <code>darcs rebase pull</code>, which would suspend the conflicting patches, and then start unsuspending the patches one by one, making sure that you fix any conflicts that may arise after each unsuspend.</p>
<p>Consider a concrete example with two repositories <code>rep1</code> and <code>rep1_0</code>.</p>
<pre><code>rep1_0 &gt; darcs changes
patch ebaccd5c36667b7e3ee6a49d25ef262f0c7edf2b
Author: Daniil Frumin
Date: Mon Jul 27 20:56:25 MSK 2015
* commit2
patch a7e0d92a53b0523d0224ef8ffae4362adf854485
Author: Daniil Frumin
Date: Mon Jul 27 20:56:25 MSK 2015
* commit1
rep1_0 &gt; darcs diff —from-patch=commit2
patch ebaccd5c36667b7e3ee6a49d25ef262f0c7edf2b
Author: Daniil Frumin
Date: Mon Jul 27 20:56:25 MSK 2015
* commit2
diff -rN -u old-rep1_0/dir1/file2 new-rep1_0/dir1/file2
— old-rep1_0/dir1/file2 1970-01-01 03:00:00.000000000 +0300
+++ new-rep1_0/dir1/file2 2015-07-28 12:25:54.000000000 +0300
@@ -0,0 +1 @@
+double whatsup
rep1_0 &gt; cd ../rep1
rep1 &gt; darcs changes
patch e3df0e23a3915910a81eb8181d7b3669e8f270a9
Author: Daniil Frumin
Date: Tue Jul 28 12:27:55 MSK 2015
* commit2’
patch a7e0d92a53b0523d0224ef8ffae4362adf854485
Author: Daniil Frumin
Date: Mon Jul 27 20:56:25 MSK 2015
* commit1
rep1 &gt; darcs diff —from-patch=“commit2’”
patch e3df0e23a3915910a81eb8181d7b3669e8f270a9
Author: Daniil Frumin
Date: Tue Jul 28 12:27:55 MSK 2015
* commit2’
diff -rN -u old-rep1/dir1/file2 new-rep1/dir1/file2
— old-rep1/dir1/file2 1970-01-01 03:00:00.000000000 +0300
+++ new-rep1/dir1/file2 2015-07-28 12:28:39.000000000 +0300
@@ -0,0 +1 @@
+touch file2
\ No newline at end of file
diff -rN -u old-rep1/file1 new-rep1/file1 — old-rep1/file1 2015-07-28 12:28:39.000000000 +0300 +++ new-rep1/file1 2015-07-28 12:28:39.000000000 +0300
@@ -1 +1 @@
-whatsup
\ No newline at end of file
+double whatsup
\ No newline at end of file</code></pre>
<p>The patch <code>commit2</code> from <code>rep1_0</code> conflicts with <code>commit2’</code> from <code>rep1</code>.</p>
<pre><code>rep1 &gt; darcs rebase pull ../rep1_0
patch ebaccd5c36667b7e3ee6a49d25ef262f0c7edf2b
Author: Daniil Frumin
Date: Mon Jul 27 20:56:25 MSK 2015
* commit2
Shall I pull this patch? (1/1) [ynW…], or ? for more options: y
Do you want to pull these patches? [Yglqk…], or ? for more options: y
The following local patches are in conflict:
patch e3df0e23a3915910a81eb8181d7b3669e8f270a9
Author: Daniil Frumin
Date: Tue Jul 28 12:27:55 MSK 2015
* commit2’
Shall I suspend this patch? (1/1) [ynW…], or ? for more options: y
Do you want to suspend these patches? [Yglqk…], or ? for more options: y
Finished pulling.
Rebase in progress: 1 suspended patches</code></pre>
<p>Now we have one patch — <code>commit2’</code> — in the suspended state. We want to resolve the conflict by amending <code>commit2’</code>. We will do that by unsuspending it and manually editing out the conflicting lines. This will also make it depend on <code>commit2</code>.</p>
<pre><code>rep1 &gt; darcs rebase unsuspend
patch e3df0e23a3915910a81eb8181d7b3669e8f270a9
Author: Daniil Frumin
Date: Tue Jul 28 12:27:55 MSK 2015
* commit2’
Shall I unsuspend this patch? (1/1) [ynW…], or ? for more options: y
Do you want to unsuspend these patches? [Yglqk…], or ? for more options: d
We have conflicts in the following files:
./dir1/file2
Rebase finished!
rep1 &gt; cat dir1/file2
v v v v v v v
=============
double whatsup
*************
touch file2
^ ^ ^ ^ ^ ^ ^
rep1 &gt; $EDITOR dir1/file2
rep1 &gt; darcs amend -a
patch 40b3b4123c78dba6a6797feb619572072654a9cd
Author: Daniil Frumin
Date: Tue Jul 28 12:32:56 MSK 2015
* commit2’
Shall I amend this patch? [yNjk…], or ? for more options: y
Finished amending patch:
patch c35867259f187c1bc30310f1cacb34c1bb2cce41
Author: Daniil Frumin
Date: Tue Jul 28 12:34:30 MSK 2015
* commit2’
rep1 &gt; darcs mark-conflicts
No conflicts to mark.</code></pre>
<p>Another repository saved from conflicting patches, yay!</p>
<div class="references">
</div>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
<p>See <a href="http://lists.osuosl.org/pipermail/darcs-users/2015-May/027125.html">this discussion</a> for details<a href="https://parenz.wordpress.com/2015/07/28/darcs-rebase-by-example/#fnref1"><img alt="↩" class="wp-smiley" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/21a9.png" style="height: 1em;" /></a></p>
</li>
</ol>
</div>Danhttps://parenz.wordpress.comDan Frumin: Darcs 2.10.1 (Mac OSX build)http://parenz.wordpress.com/?p=1772015-07-12T18:13:01+00:00<p><a href="http://lists.osuosl.org/pipermail/darcs-users/2015-July/027130.html">Darcs 2.10.1 has been released!</a></p>
<p>Citing the official release notes</p>
<pre class="sourceCode haskell"><code class="sourceCode haskell"><span>&gt;</span> <span>The</span> <span>darcs</span> <span>team</span> <span>is</span> <span>pleased</span> <span>to</span> <span>announce</span> <span>the</span> <span>release</span> <span style="color: blue; font-weight: bold;">of</span> <span>darcs</span> <span class="hs-num">2.10</span><span>.</span><span class="hs-num">1</span> <span>!</span>
<span>&gt;</span> <span style="color: red;">..</span>
<span>&gt;</span>
<span>&gt;</span> <span>#</span> <span>What's</span> <span>new</span> <span style="color: blue; font-weight: bold;">in</span> <span class="hs-num">2.10</span><span>.</span><span class="hs-num">1</span> <span style="color: red;">(</span><span>since</span> <span class="hs-num">2.10</span><span>.</span><span class="hs-num">0</span><span style="color: red;">)</span> <span>#</span>
<span>&gt;</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>generalized</span> <span>doFastZip</span> <span>for</span> <span>darcsden</span> <span>support</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>support</span> <span>terminfo</span> <span class="hs-num">0.4</span><span style="color: red;">,</span> <span>network</span> <span class="hs-num">2.6</span><span style="color: red;">,</span> <span>zlib</span> <span class="hs-num">0.6</span><span style="color: red;">,</span> <span>quickcheck</span> <span class="hs-num">2.8</span> <span>and</span>
<span>&gt;</span> <span>attoparsec</span> <span class="hs-num">0.13</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>errorDoc</span> <span>now</span> <span>prints</span> <span>a</span> <span>stack</span> <span>trace</span> <span style="color: red;">(</span><span style="color: blue; font-weight: bold;">if</span> <span>profiling</span> <span>was</span> <span>enabled</span><span style="color: red;">)</span> <span style="color: red;">(</span><span>Ben</span> <span>Franksen</span><span style="color: red;">)</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>beautified</span> <span>error</span> <span>messages</span> <span>for</span> <span>command</span> <span>line</span> <span>and</span> <span style="color: blue; font-weight: bold;">default</span> <span>files</span> <span style="color: red;">(</span><span>Ben</span> <span>Franksen</span><span style="color: red;">)</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>fixed</span> <span>the</span> <span>following</span> <span>bugs</span><span>:</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>issue2449</span><span>:</span> <span>test</span> <span>harness</span><span>/</span><span>shelly</span><span>:</span> <span>need</span> <span>to</span> <span>handle</span>
<span>&gt;</span> <span>mis</span><span style="color: green;">-</span><span>encoded</span><span>/</span><span>binary</span> <span style="color: blue; font-weight: bold;">data</span> <span style="color: red;">(</span><span>Ganesh</span> <span>Sittampalam</span><span style="color: red;">)</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>issue2423</span><span>:</span> <span>diff</span> <span>only</span> <span>respecting</span> <span style="color: green;">--diff-command when a diff.exe</span>
<span>&gt;</span> <span>is</span> <span>present</span> <span style="color: red;">(</span><span>Alain91</span><span style="color: red;">)</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>issue2447</span><span>:</span> <span>get</span> <span>contents</span> <span style="color: blue; font-weight: bold;">of</span> <span>deleted</span> <span>file</span> <span style="color: red;">(</span><span>Ben</span> <span>Franksen</span><span style="color: red;">)</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>issue2307</span><span>:</span> <span>add</span> <span>information</span> <span>about</span> <span style="color: teal;">'</span><span>darcs</span> <span>help</span> <span>manpage'</span> <span>and</span>
<span>&gt;</span> <span style="color: teal;">'</span><span>darcs</span> <span>help</span> <span>markdown'</span> <span style="color: red;">(</span><span>Dan</span> <span>Frumin</span><span style="color: red;">)</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>issue2461</span><span>:</span> <span>darcs</span> <span>log</span> <span style="color: green;">--repo=remoterepo creates and populates</span>
<span>&gt;</span> <span class="hs-sel">_darcs</span> <span style="color: red;">(</span><span>Ben</span> <span>Franksen</span><span style="color: red;">)</span>
<span>&gt;</span> <span style="color: green;">-</span> <span>issue2459</span><span>:</span> <span>cloning</span> <span>remote</span> <span>repo</span> <span>fails</span> <span>to</span> <span>use</span> <span>packs</span> <span style="color: blue; font-weight: bold;">if</span> <span>cache</span> <span>is</span>
<span>&gt;</span> <span>on</span> <span>a</span> <span>different</span> <span>partition</span> <span style="color: red;">(</span><span>Ben</span> <span>Franksen</span><span style="color: red;">)</span>
<span>&gt;</span>
<span>&gt;</span> <span>#</span> <span>Feedback</span> <span>#</span>
<span>&gt;</span>
<span>&gt;</span> <span>If</span> <span>you</span> <span>have</span> <span>an</span> <span>issue</span> <span>with</span> <span>darcs</span> <span class="hs-num">2.10</span><span>.</span><span class="hs-num">0</span><span style="color: red;">,</span> <span>you</span> <span>can</span> <span>report</span> <span>it</span> <span>on</span>
<span>&gt;</span> <span>http</span><span>://</span><span>bugs</span><span>.</span><span>darcs</span><span>.</span><span>net</span><span>/</span> <span>.</span> <span>You</span> <span>can</span> <span>also</span> <span>report</span> <span>bugs</span> <span>by</span> <span>email</span> <span>to</span>
<span>&gt;</span> <span>bugs</span> <span>at</span> <span>darcs</span><span>.</span><span>net</span><span style="color: red;">,</span> <span>or</span> <span>come</span> <span>to</span> <span>#</span><span>darcs</span> <span>on</span> <span>irc</span><span>.</span><span>freenode</span><span>.</span><span>net</span><span>.</span>
</code></pre>
<p>I’ve updated <a href="http://darcs.net/Binaries#homebrew">Mac OS</a> to version 2.10.1. You can install it with</p>
<pre><code>brew install http://darcs.covariant.me/darcs.rb</code></pre>
<div class="references">
</div>Danhttps://parenz.wordpress.comDan Frumin: HTTP Basic auth in Snaphttp://parenz.wordpress.com/?p=1752015-07-11T09:27:25+00:00<p>Recently, I’ve implemented HTTP Basic auth for <a href="http://darcs.net/GSoC/2015-Darcsden">darcsden</a> and wrote a simple <code>wreq</code> test for it. In this post I would like to outline the main technical details.</p>
<h1 id="server-side">Server side</h1>
<h2 id="transient-storage">Transient storage</h2>
<p>A lot of darcsden code is (especially the parts that are closer to the users’ web browser — handlers, pages, so on) is written around sessions. Sessions are stored in a special storage — implemented by the <code>DarcsDen.Backend.Transient</code>, but if we abstract away from the details we have a <code>Session</code> datatype. Authorization and authentication information is handled by sessions using functions <code>setUser :: (BTIO bt) =&gt; Maybe User -&gt; Session -&gt; Snap Session</code>, <code>notice :: (BTIO bt) =&gt; String -&gt; Session -&gt; Snap ()</code> (display a message to the user) and others. The <code>BTIO bt</code> part is just a synonym for</p>
<pre><code>type BTIO bt = (BackendTransient bt, ?backendTransient :: bt, MonadIO (BackendTransientM bt))</code></pre>
<p>Which basically says that we are operating with a transient backend that supports all of necessary operations, and we can also do IO in it. Right now there are only two transient backends (read: two ways of storing sessions): Redis and in-process memory.</p>
<h2 id="running-sessions">Running sessions</h2>
<p>If we have a piece of Snap code that we want to “sessionify” we use the following interface:</p>
<pre><code>withSession :: (BTIO bt) =&gt; (Session -&gt; Snap ()) -&gt; Snap ()</code></pre>
<p>What this does is it basically checks for a cookie — in case it is present it grabs the session information from the storage (in accordance with the cookie); if the cookie is not present it creates a new session and stores it in a cookie.</p>
<p>If we have a page of a type <code>Session -&gt; Snap ()</code>, we might want to give user an option to do HTTP authentication on that page. We introduce another function</p>
<pre><code>withBasicAuth :: (BP bp, BTIO bt)
=&gt; (Session -&gt; Snap ())
-&gt; (Session -&gt; Snap ())
withBasicAuth act s = do
rq do
rawHeader &lt;- maybe throwChallenge return $ getHeader “Authorization” rq
let (Just (usr,pw)) = getCredentials rawHeader
c errorPage “Unknown user”
Just u -&gt; if checkPassword (fromBS pw) u
then doLogin (fromBS usr)
else errorPage “Bad password”
_ -&gt; act s</code></pre>
<p>So, what is going on in here? First of all, we check if the “login” parameter is set to “true”. If it does, we try to get the “Authorization” header, de-encode it, and check whether the credentials are good.</p>
<pre><code>throwChallenge :: Snap a
throwChallenge = do
modifyResponse $ (setResponseStatus 401 “Unauthorized”) .
(setHeader “WWW-Authenticate” “Basic realm=darcsdenrealm”)
getResponse &gt;&gt;= finishWith</code></pre>
<p>If the response header is present, it is of a form <code>Basic x</code>, where <code>x</code> is a base64 encoded string <code>user:password</code>. We can extract the credentials from the header like this:</p>
<pre><code>import qualified Data.ByteString as B
import qualified Data.ByteString.Base64 as B
…
getCredentials :: B.ByteString — ^ Header
-&gt; Maybe (B.ByteString, B.ByteString) — ^ Possibly (username, password)
getCredentials header =
if (isInfixOf “Basic “ header)
then fmap extract (hush (B.decode (B.drop 6 header)))
else Nothing
where
extract cred = case (B.breakByte (c2w ‘:’) cred) of
(usr, pw) -&gt; (usr, safeTail pw)</code></pre>
<h1 id="on-the-client">On the client</h1>
<p>The tests that I am currently writing for darcsden are all of the same form: I use wreq to do requests to the darcsden server, then, if necessary, I run taggy to extract information from the webpage, and compare it to the “canonical” information.</p>
<p>As it turns out, doing HTTP Basic Auth is very easy with wreq! First of all, we define a function for doing a GET request that will do some exception handling for us:</p>
<pre><code>getSafeOpts :: Options -&gt; String -&gt; IO (Either Status (Response ByteString))
getSafeOpts opts url = fmap Right (getWith opts url) `catch` hndlr
where
hndlr (StatusCodeException s _ _) = return (Left s)
hndlr e = throwIO e</code></pre>
<p>This way, we won’t get a runtime exception when accessing a non-existing page or getting a server error. Doing a GET request with HTTP Basic Auth is now very easy:</p>
<pre><code>getWithAuth :: (String, String) -&gt; String -&gt; IO (Either Status (Response ByteString))
getWithAuth (username,pw) url = getSafeOpts opts url
where
opts = defaults &amp; auth ?~ basicAuth (toBS username) (toBS pw)
&amp; param “login” .~ [“true”]</code></pre>
<p>In that snippet we use <code>lens</code>es to set up an auth header and an HTTP parameter (<code>?login=true</code>).</p>
<p>Finally, after obtaining a <code>Response ByteString</code>, we can parse it with <a href="http://hackage.haskell.org/package/taggy-lens">taggy-lens</a>:</p>
<pre><code>parsed :: Fold (Response L.ByteString) Text.Taggy.Node
parsed = responseBody
. to (decodeUtf8With lenientDecode)
. html</code></pre>
<p>We can then play with it in GHCi</p>
<pre><code>*Main&gt; Right r r ^.. parsed
[NodeElement (Element {eltName = “DOCTYPE”, eltAttrs = fromList [(“html”,””)], eltChildren = [NodeElement (Element {eltName = “html”, eltAttrs = fromList [], eltChildren = [NodeElement (Element {eltName = “head”, eltAttrs = fromList [], eltChildren = [NodeElement (Element {eltName = “title”, eltAttrs = fromList [], eltChildren = [NodeContent “localhost”]}),NodeElement (Element {eltName = “link”, eltAttrs = fromList [(“href”,”http://localhost:8900/public/images/favicon.ico”),…</code></pre>
<p>If we want to check that we are indeed logged in correctly, we should look for the “log out” button. Taggy does all the heavy lifting for us, we just have to write down a lens (more precisely, a fold) to “extract” a logout button from the page</p>
<pre><code>logoutButton :: HasElement e =&gt; Fold e Text
logoutButton = allAttributed (ix “class” . only “logout”)
. allNamed (only “a”)
. contents</code></pre>
<p><code>logoutButton</code> searches for <code>&lt;div class=“logout”&gt;</code> and returns the text in the link inside the div. There might be many such links inside the node, hence we use a fold.</p>
<pre><code>*Main&gt; r ^.. parsed . logoutButton
[“log out”]</code></pre>
<p>In this case, since we only care if such link is present, we can use a <code>preview</code></p>
<pre><code>*Main&gt; r ^? parsed . logoutButton
Just “log out”</code></pre>
<h1 id="conclusion">Conclusion</h1>
<p>Well, that’s about it for now. I regret taking way too much time writing this update, and I hope to deliver another one soon. Meanwhile, some information regarding the darcsden SoC project can be found on the <a href="http://darcs.net/GSoC/2015-Darcsden">wiki</a>.</p>
<div class="references">
</div>Danhttps://parenz.wordpress.comDarcs News: darcs 2.10.1 releasetag:blogger.com,1999:blog-819021106854702432.post-66090333249236132052015-07-09T17:10:32+00:00Hi all,<br /><br />The darcs team is pleased to announce the release of darcs 2.10.1 !<br /><h2>Downloading</h2>The easiest way to install darcs 2.10.1 from source is by first installing the Haskell Platform (<a href="http://www.haskell.org/platform" target="_blank">http://www.haskell.org/platform</a>). If you have installed the Haskell Platform or cabal-install, you can install this release by doing:<br /><br /><span>$ cabal update</span><br /><span>$ cabal install darcs-2.10.1</span><br /><br />Alternatively, you can download the tarball from <a href="http://darcs.net/releases/darcs-2.10.1.tar.gz" target="_blank">http://darcs.net/releases/darcs-2.10.1.tar.gz</a> and build it by hand as explained in the README file.<br /><br />The 2.10 branch is also available as a darcs repository from <a href="http://darcs.net/releases/branch-2.10" target="_blank">http://darcs.net/releases/branch-2.10</a><br /><h2 id="whats-new-since-darcs-2.8.5">What's new in darcs 2.10.1 (since darcs 2.10.0)</h2><br /><br /><ul><li>support terminfo 0.4, network 2.6, zlib 0.6, quickcheck 2.8 and attoparsec 0.13</li><li>errorDoc now prints a stack trace (if profiling was enabled) (Ben Franksen)</li><li>beautified error messages for command line and default files (Ben Franksen)</li><li>generalized doFastZip for darcsden support </li><li>fixed the following bugs:</li><ul><li>issue2449: test harness/shelly: need to handle mis-encoded/binary data (Ganesh Sittampalam)</li><li>issue2423: diff only respecting --diff-command when a diff.exe is present (Alain91)</li><li>issue2447: get contents of deleted file (Ben Franksen)</li><li>issue2307: add information about 'darcs help manpage' and 'darcs help markdown' (Dan Frumin)</li><li>issue2461: darcs log --repo=remoterepo creates and populates _darcs (Ben Franksen)</li><li>issue2459: cloning remote repo fails to use packs if cache is on a different partition (Ben Franksen)</li></ul></ul><h2>Feedback </h2>If you have an issue with darcs 2.10.1, you can report it on <a href="http://bugs.darcs.net/" target="_blank">http://bugs.darcs.net/</a> . You can also report bugs by email to <a href="mailto:bugs@darcs.net">bugs@darcs.net</a>, or come to #darcs on <a href="http://irc.freenode.net/" target="_blank">irc.freenode.net</a>.guillaume (noreply@blogger.com)http://blog.darcs.net/Dan Frumin: Darcs binaries for OSX with Homebrewhttp://parenz.wordpress.com/?p=1712015-06-22T12:33:56+00:00<p>Recently I’ve updated my <a href="http://darcs.net/Binaries#homebrew">Darcs homebrew build</a> to Darcs 2.10. You can install it with</p>
<pre><code>brew install http://darcs.covariant.me/darcs.rb</code></pre>
<p>The formula contains a context (<code>--exact-version</code>) and it is a static binary.</p>
<div class="references">
</div>Danhttps://parenz.wordpress.comDan Frumin: Hoogle inside the sandboxhttp://parenz.wordpress.com/?p=1722015-05-13T21:54:47+00:00<h1 id="introduction">Introduction</h1>
<p>This is my first post from the (hopefuly fruitful!) series of blog posts as part of my <a href="http://darcs.net/GSoC/2015-Darcsden">Haskell SoC</a> project. I will spend a great chunk of my summer hacking away on DarcsDen; in addition, I will document my hardships and successes here. You can follow my progress on <a href="http://hub.darcs.net/co-dan/">my DarcsHub</a>.</p>
<p>This particular post will be about my working environment.</p>
<h1 id="the-problem">The problem</h1>
<p><a href="https://www.haskell.org/hoogle/">Hoogle</a> is an amazing tool that usually needs no introduction. Understandably, the online version at haskell.org indexes only so many packages. This means that if I want to use hoogle to search for functions and values in packages like darcs and darcsden, I will have to set up <a href="http://hackage.haskell.org/package/hoogle">a local copy</a>.</p>
<p>Cabal sandboxing is a relatively recent feature of the Cabal package manager, but I don’t think it is reasonable in this day to install from the source (let alone develop) a Haskell package <a href="http://coldwa.st/e/blog/2013-08-20-Cabal-sandbox.html#what-are-sandboxes-and-why-are-they-needed">without using sandboxing</a>.</p>
<p>The problem seems to be that the mentioned tools do not play well together out of the box, and some amount of magic is required. In this note I sketch the solution, on which I’ve eventually arrived after a couple of tries.</p>
<h1 id="using-hoogle-inside-a-cabal-sandbox">Using hoogle inside a Cabal sandbox</h1>
<p>The presumed setup: a user is working on a package X using the cabal sandboxes. The source code is located in the directory <code>X</code> and the path to the cabal sandbox is <code>X/.cabal-sandbox</code>.</p>
<p><em>Step 1: Install hoogle inside the sandbox.</em> This is simply a matter of running <code>cabal install hoogle</code> inside <code>X</code>. If you want to have a standard database alongside the database for your packages in development, now is the time to do <code>.cabal-sandbox/bin/hoogle data</code>.</p>
<p><em>Step 2: Generate haddocks for the packages Y,Z you want to use with hoogle.</em> In my case, I wanted to generate haddocks for darcs and darcsden. This is just a matter of running <code>cabal haddock --hoogle</code> in the correct directory.</p>
<p><em>Step 3: Convert haddocks to .hoo files.</em> Run the following commands in <code>X/</code>:</p>
<pre><code>.cabal-sandbox/bin/hoogle convert /path/to/packageY/dist/doc/html/*/*.txt</code></pre>
<p>You should see something like</p>
<pre><code>Converting /path/to/packageY/dist/doc/html/Y/Y.txt
Converting Y... done</code></pre>
<p>after which the file Y.hoo appears in <code>/path/to/packageY/dist/doc/html/Y/</code></p>
<p><em>Step 4: Moving and combining databases.</em> The hoogle database should be stored in <code>.cabal-sandbox/share/*/hoogle-*/databases</code>. Create such directory, if it’s not present already. Then copy the ‘default’ database to that folder:</p>
<pre><code>cp .cabal-sandbox/hoogle/databases/default.hoo .cabal-sandbox/share/*/hoogle-*/databases</code></pre>
<p>Finally, you can combine your <code>Y.hoo</code> with the default database.</p>
<pre><code>.cabal-sandbox/bin/hoogle combine /path/to/packageY/dist/doc/html/*/*.hoo .cabal-sandbox/share/*/hoogle-*/databases/default.hoo
mv default.hoo .cabal-sandbox/share/*/hoogle-*/databases/default.hoo</code></pre>
<p>And you are done! You can test your installation</p>
<pre><code>$ .cabal-sandbox/bin/hoogle rOwner
DarcsDen.State.Repo rOwner :: Simple Lens (Repository bp) String</code></pre>
<p>For additional usability, consider adding <code>.cabal-sandbox/bin</code> to your $PATH.</p>
<div class="references">
</div>Danhttps://parenz.wordpress.comSimon Michael: ssh, Darcs Hub vulnerabilityhttp://joyful.com/blog/2015-04-20-ssh-darcs-hub-vulnerability.html2015-04-20T23:10:00+00:00<p>I recently learned of a serious undocumented vulnerability in the <a href="http://hackage.haskell.org/package/ssh">ssh</a> package. This is a minimal ssh server implementation used by <a href="http://hackage.haskell.org/package/darcsden">darcsden</a> to support darcs push/pull. If you use the ssh package, or you have darcsden’s darcsden-ssh server running, you should upgrade to/rebuild with the imminent ssh-0.3 release right away. Or if you know of someone like that, please let them know.</p>
<p>darcsden is of course the basis for <a href="http://hub.darcs.net">Darcs Hub</a>. Here’s the announcement I sent to users there a few days ago, with more details.</p>
<div style="margin-left: 1em;">
<hr />
<p>Hello darcs hub users,</p>
<p>This is Simon Michael, operator of hub.darcs.net, with the first all-darcs-hub-users announcement. You’re receiving this because you have an email address configured in your darcs hub user settings.</p>
<p>Thank you for using darcs hub, and for any feedback/bug reports/patches you may have sent. Usage is growing steadily, and I plan to blog more about it soon at <a href="http://joyful.com">joyful.com</a>.</p>
<p>This email is to announce a recently patched security vulnerability in darcs hub’s SSH server.</p>
<p><strong>Timeline:</strong></p>
<p>3/21: a software developer reports that the haskell “ssh” library used by darcs hub does not check for a valid signature on the public key during authentication. This means it was possible to authenticate as any other ssh user if you knew their public key.</p>
<p>3/21-: I discuss the issue with a small number of core darcs developers and the ssh author.</p>
<p>3/25: A preliminary fix is deployed. We believe this closed the vulnerability.</p>
<p>4/6: A more comprehensive and tested fix is deployed.</p>
<p>4/15: This announcement is sent to current darcs hub users with valid email addresses (714 of 765 users).</p>
<p>4/20: Public disclosure via blog, haskell mail lists and the issue tracker (<a href="http://hub.darcs.net/simon/darcsden/issue/130">darcsden #130</a>).</p>
<p><strong>Impact and current status:</strong></p>
<p>We believe the vulnerability is now fixed. But we are not cryptographers - I’m sure the new ssh maintainer would welcome any help from some of those.</p>
<p>We have no reason to believe anyone discovered or exploited the vulnerability. Also, it seems unlikely there’s anything hosted on darcs hub that would attract this kind of attention. darcs hub logs are not good enough to be certain, however. It’s possible I’ll find a way to be more certain by looking at file timestamps or something.</p>
<p>The weakness was present in darcs hub’s ssh server since it went live (and in darcsden.com before that). As mentioned, it was possible to authenticate via ssh as another user if you provided their public ssh key. With ssh access, it’s possible to create, delete, modify or replace any repository in that darcs hub account (but not possible to change user settings in the web app, or to access the system hosting darcshub).</p>
<p>The worst-case scenario we’ve imagined is that a motivated attacker could have authenticated as you and replaced your repo with one that looks just like it, but with patches altered or added, any time since you created the repo on darcs hub (or on darcsden.com, if you moved it from there).</p>
<p>So if you’re paranoid/careful you may want to check the integrity of your repos, eg by reviewing the repo history (“changes” button on the website, “darcs log [-s] [-v]” at the console). If you have more questions about this, you can contact me (simon@joyful.com) and if necessary Ganesh Sittampalam (ganesh@earth.li) privately.</p>
<p><strong>Future plans:</strong></p>
<ul>
<li><p>Public announcement on 4/20</p></li>
<li><p>I’ll add a security section to the darcs hub FAQ</p></li>
<li><p>Ganesh has stepped up to be maintainer of the ssh package, and will make a new release soon</p></li>
<li><p>I’ll do a darcsden release not too long after that</p></li>
<li><p>We’ll need to figure out Darcs hub’s sustainability plan. As it grows and more of you rely on it, so does the need for a revenue stream to allow decent maintenance and oversight. This could be from funding, donations, charging for private repos or something else.</p></li>
</ul>
<p><strong>Also:</strong></p>
<p>Some logistical things to be aware of:</p>
<ul>
<li><p>this announcement has been sent via MailChimp, and as yet there’s no automatic integration between MailChimp and your settings on hub.darcs.net.</p></li>
<li><p>remember that darcs hub’s issue tracker is <a href="http://hub.darcs.net/simon/darcsden/issues">here</a>, and that it does not yet send email notifications - to see replies to an issue, you must visit the issue page.</p></li>
<li><p>darcs hub’s password recovery emails may not always reach you - if you’re experiencing this, please contribute to <a href="http://hub.darcs.net/simon/darcsden/issue/123">#123</a>.</p></li>
</ul>
<p>Needless to say, I regret the vulnerability and am pleased to have it closed. Of course we are not alone, eg github had their <a href="http://arstechnica.com/business/2012/03/hacker-commandeers-github-to-prove-vuln-in-ruby">own incident</a>. Thank you very much to all who have been helping with this, especially the original reporter for letting us all know, and Ganesh for providing swift and high quality fixes.</p>
</div>Simon Michaelhttp://joyful.comDarcs News: darcs 2.10.0 releasetag:blogger.com,1999:blog-819021106854702432.post-23184696810309974912015-04-19T22:01:56+00:00Hi all,<br /><br />The darcs team is pleased to announce the release of darcs 2.10.0.<br /><h2>Downloading</h2>The easiest way to install darcs 2.10.0 from source is by first installing the Haskell Platform (<a href="http://www.haskell.org/platform" target="_blank">http://www.haskell.org/platform</a>). If you have installed the Haskell Platform or cabal-install, you can install this release by doing:<br /><br /><span>$ cabal update</span><br /><span>$ cabal install darcs-2.10.0</span><br /><br />Alternatively, you can download the tarball from <a href="http://darcs.net/releases/darcs-2.10.0.tar.gz" target="_blank">http://darcs.net/releases/darcs-2.10.0.tar.gz</a> and build it by hand as explained in the README file.<br /><br />The 2.10 branch is also available as a darcs repository from <a href="http://darcs.net/releases/branch-2.10" target="_blank">http://darcs.net/releases/branch-2.10</a><br /><h2>Feedback </h2>If you have an issue with darcs 2.10.0, you can report it via the web on <a href="http://bugs.darcs.net/" target="_blank">http://bugs.darcs.net/</a> . You can also report bugs by email to bugs at <a href="http://darcs.net/" target="_blank">darcs.net</a>, or come to #darcs on <a href="http://irc.freenode.net/" target="_blank">irc.freenode.net</a>.<br /><h1 id="whats-new-since-darcs-2.8.5">What's new since darcs 2.8.5</h1><h2 id="new-features">New features</h2><ul><li><code>darcs rebase</code>: enable deep amending of history (Ganesh Sittampalam)</li><li><code>darcs pull --reorder</code>: keep local-only patches on top of mainstream patches (Ale Gadea, Ganesh Sittampalam)</li><li><code>darcs dist --zip</code>: generate a zip archive from a repository (Guillaume Hoffmann)</li><li>patch bundle contexts are minimized by default. Enables bundles to be applied to more repositories. (Guillaume Hoffmann)</li><li><code>darcs convert export/import</code> for conversion to/from VCSes supporting the fast-export protocol (Petr Rockai, Owen Stephens, Guillaume Hoffmann, Lele Gaifax, Ben Franksen)</li><li><code>darcs test --backoff</code>: exponential backoff test strategy, faster than bisect on big repositories (Michael Hendricks)</li><li>work normally on sshfs-mounted repositories (Nathaniel Filardo)</li><li>automatic detection of file/directory moves, and of token replaces (Jose Neder)</li><li>patience diff algorithm by default (Jose Neder)</li><li>interactive mode for whatsnew (Dan Frumin)</li><li><code>tag --ask-deps</code> to create tags that may not include some patches (Ganesh Sittampalam)</li></ul><h2 id="user-interface">User Interface</h2><ul><li>add a last question after all patches have been selected to confirm the whole selection (Florent Becker)</li><li>command names: <ul><li><code>clone</code> is the new name of <code>get</code> and <code>put</code></li><li><code>log</code> is the new name of <code>changes</code></li><li><code>amend</code> is the new name of <code>amend-record</code></li></ul></li><li>show output of <code>log</code> into a pager by default (Guillaume Hoffmann)</li><li>the output of <code>log</code> is more similar to git's: <ul><li>show patch hash in UI (hash of the patch's metadata)</li><li>put author and date on separate lines (Guillaume Hoffmann)</li></ul></li><li>enable to match on patch hash prefix with -h and --hash (Guillaume Hoffmann, Gian Piero Carrubba)</li><li>better messages: <ul><li>better error messages for http and ssh errors (Ernesto Rodriguez)</li><li><code>init</code>, <code>add</code>, <code>remove</code>, <code>move</code> and <code>replace</code> print confirmation messages (Guillaume Hoffmann)</li></ul></li><li><code>rollback</code> only happens in the working copy (Florent Becker, Guillaume Hoffmann)</li><li><code>darcs send</code> no longer tries to send a mail by default (Eric Kow)</li><li>when no patch name given, directly invoke text editor (Jose Neder, Guillaume Hoffmann)</li><li>use nano as default text editor instead of vi (Guillaume Hoffmann)</li><li>keep log files for patch name and mail content in _darcs (Ale Gadea)</li><li><code>optimize</code> and <code>convert</code> are now supercommands (Guillaume Hoffmann)</li><li>improve <code>darcs help environment</code> and <code>darcs help markdown</code> (Radoslav Dorcik, Guillaume Hoffmann)</li><li>warn about duplicate tags when creating a new one (Ale Gadea)</li><li>allow <code>darcs mv</code> into known, but deleted in working, file (Owen Stephens)</li><li>improve<code>--not-in-remote</code>, allowing multiple repos and use default (Owen Stephens)</li></ul><h2 id="performance">Performance</h2><ul><li>faster <code>darcs diff</code> (Petr Rockai)</li><li>faster <code>log</code> and <code>annotate</code> thanks to patch index data structure (BSRK Aditya, Benedikt Schmidt, Eric Kow, Guillaume Hoffmann, Ganesh Sittampalam)</li><li>faster push via ssh by using compression (Ben Franksen)</li><li>cloning to an ssh destination (formerly <code>darcs put</code>) is more efficient (Guillaume Hoffmann)</li><li>faster internal representation of patch hashes (Guillaume Hoffmann)</li><li>when cloning from http, use packs in a more predictable way (Guillaume Hoffmann)</li><li>store global cache in bucketed format (Marcio Diaz)</li></ul><h2 id="developer-related">Developer-related</h2><ul><li>require and support GHC 7.4 to 7.10 (Ganesh Sittampalam)</li><li>replace type witness CPP macros with plain Haskell (Eric Kow)</li><li>hashed-storage is bundled into darcs (Ganesh Sittampalam)</li><li>replace C SHA256 bindings with external libraries (Ganesh Sittampalam)</li><li>move the bits of the datetime package we need into Darcs.Util.DateTime (Ganesh Sittampalam)</li><li>build Darcs once rather than thrice. (Eric Kow)</li><li>remove home page and manual from darcs' repository (Guillaume Hoffmann)</li><li>run tests through cabal test (Ryan Desfosses)</li><li>run fewer darcs-1 related tests in testsuite (Ganesh Sittampalam)</li><li>Use custom replHook to fix cabal repl (Owen Stephens)</li><li>darcs.cabal: make Haskell2010 the default-language for all stanzas (Ben Franksen)</li><li>always compile with mmap support (Ganesh Sittampalam)</li><li>new options subsystem (Ben Franksen)</li><li>various cleanups, code restructurations and refactoring, haddocks (Will Langstroth, Owen Stephens, Florent Becker, Guillaume Hoffmann, Michael Hendricks, Eric Kow, Dan Frumin, Ganesh Sittampalam)</li></ul><h2 id="issues-resolved-in-darcs-2.10">Issues resolved in Darcs 2.10</h2><ul><li>issue346: implement "patience diff" from bzr (Jose Neder)</li><li>issue642: Automatic detection of file renames (Jose Neder)</li><li>issue822: generalized the IO Type for better error messages and exception handling (Ernesto Rodriguez)</li><li>issue851: interactive mode for whatsnew (Dan Frumin)</li><li>issue904: Fix record on Linux/FUSE/sshfs (fall back to sloppy locks automatically) (Nathaniel Filardo)</li><li>issue1066: clone to ssh URL by locally cloning then copying by scp (Guillaume Hoffmann)</li><li>issue1268: enable to write darcs init x (Radoslav Dorcik)</li><li>issue1416: put log files in tempdir instead of in working dir (Ale Gadea)</li><li>issue1514: send --minimize-context flag for send (Guillaume Hoffmann)</li><li>issue1624: bucketed cache (Marcio Diaz)</li><li>issue1828: file listing and working --dry-run for mark-conflicts (Guillaume Hoffmann)</li><li>issue1987: Garbage collection for inventories and patches (Marcio Diaz)</li><li>issue2181: put cache in $XDG_CACHE_HOME (~/.cache by default) (Guillaume Hoffmann)</li><li>issue2193: make that finalizeTentativeChanges no longer run tests (Guillaume Hoffmann)</li><li>issue2198: move repo testing code to Darcs.Repository.Test (Guillaume Hoffmann)</li><li>issue2200: darcs replace complains if no filepaths given (Owen Stephens)</li><li>issue2204: do not send mail by default (Eric Kow)</li><li>issue2237: prevent patch index creation for non-hashed repos (Owen Stephens)</li><li>issue2235: Accept RFC2822 dates (Dave Love)</li><li>issue2246: add default boring entry for emacs session save files (Owen Stephens)</li><li>issue2253: attempting to use the patch index shouldn't create it on OF repos (Owen Stephens)</li><li>Issue2278: Document default value for --keep-date / --no-keep-date (Mark Stosberg)</li><li>issue2199: getMatchingTag needs to commute for dirty tags (Ganesh Sittampalam)</li><li>issue2247: move patch index creation into the job running code (Ganesh Sittampalam)</li><li>issue2238: let optsModifier remove all occurrences of LookForAdds (Gian Piero Carrubba)</li><li>issue2236: make 'n' an alias for 'q' in lastregret questions (Gian Piero Carrubba)</li><li>issue2155: Expurgate the non-functional annotate --xml-output option (Dave Love)</li><li>issue2248: always clean up rebase-in-progress state (Ganesh Sittampalam)</li><li>issue2270: fixed darcs changes -i --only-to-files (Sebastian Fischer)</li><li>issue2282: don't allow remote operations to copy the rebase patch (Ganesh Sittampalam)</li><li>issue2287: obliterate -O doesn't overwrite existing file. (Radoslav Dorcik)</li><li>issue2227: move the rebase patch to the end before an amend-record (Ganesh Sittampalam)</li><li>issue2277: rebase suspend and unsuspend supports --summary. (Radoslav Dorcik)</li><li>issue2311: posthook for 'get' should run in created repo (Sebastian Fischer)</li><li>issue2312: posthooks for 'record' and 'amend-record' should receive DARCS_PATCHES (Sebastian Fischer)</li><li>issue2163: new option for amend, select author for patch stealing. (Radoslav Dorcik)</li><li>issue2321: when no patch name given, directly invoke text editor (Jose Neder)</li><li>issue2320: save prompted author name in ~/.darcs/author instead of ./_darcs/prefs/author (Jose Neder)</li><li>issue2250: tabbing in usageHelper - pad by max length of command name (BSRK Aditya)</li><li>issue2309: annotate includes line numbers (Owen Stephens)</li><li>issue2334: fix win32 build removing file permission functions (Guillaume Hoffmann)</li><li>issue2343: darcs amend-record does not record my change (Jose Neder)</li><li>issue2335: one liner when adding tracked files if not verbose (Guillaume Hoffmann)</li><li>issue2313: whatsnew -l: Stack space overflow (Jose Neder)</li><li>issue2347: fix amend-record --prompt-long-comment (Guillaume Hoffmann)</li><li>issue2348: switch to cabal's test framework (Ryan Desfosses)</li><li>issue2209: Automatically detect replace (Jose Neder)</li><li>issue2332: ignore case of characters in prompt (Guillaume Hoffmann)</li><li>issue2263: Option --set-scripts-executable is not properly documented (Ale Gadea)</li><li>issue2367: rename amend-record to amend, make --unrecord more visible (Guillaume Hoffmann)</li><li>issue2345: solution using cabal's checkForeignDeps (Dan Frumin)</li><li>issue2357: switching to regex-compat-tdfa for unicode support (Dan Frumin)</li><li>issue2379: only use packs to copy pristine when up-to-date (Guillaume Hoffmann)</li><li>issue2365: correctly copy pristine in no-working-dir clones (Guillaume Hoffmann)</li><li>issue2244: darcs tag should warn about duplicate tags (Ale Gadea)</li><li>issue2364: don't break list of 'bad sources' (Sergei Trofimovich)</li><li>issue2361: optimize --reorder runs forever with one repository (Ale Gadea)</li><li>issue2364: fix file corruption on double fetch (Sergei Trofimovich)</li><li>issue2394: make optimize a supercommand (Guillaume Hoffmann)</li><li>issue2396: make convert a supercommand and enhance help strings (Guillaume Hoffmann)</li><li>issue2314: output-auto-name in defaults file (Ben Franksen)</li><li>issue2388: check if inventories dir has been created (Owen Stephens)</li><li>issue2249: Rename isFile to isValidLocalPath and WorkRepoURL to WorkRepoPossibleURL (Mateusz Lenik)</li><li>issue2153: allow skipping backwards through depended-upon patches (Andreas Brandt)</li><li>issue2380: allow darcs mv into known, but deleted in working, file (Owen Stephens)</li><li>issue2403: need to avoid moving the rebase patch to the end (Ganesh Sittampalam)</li><li>issue2409: implement darcs rebase apply (Ganesh Sittampalam)</li><li>issue2385: invoke pager without temporary file (Guillaume Hoffmann)</li><li>issue2333: better error message when pushing and darcs not in path (Ben Franksen)</li></ul><h2 id="known-issues">Known issues</h2>These are known new issues in darcs 2.10.0:<br /><ul><li>issue2269: rebase should warn about stolen patches at suspend, not unsuspend</li><li>issue2272: darcs rebase unsuspend should automate or semi-automate handling unrecorded changes</li><li>issue2276: darcs rebase unsuspend needs UI improvements for "You are not... Amend anyway?"</li><li>issue2359: convert --export mishandles Unicode filenames</li><li>issue2372: Please remove "HINT: I could not reach..." message</li><li>issue2423: diff only respecting --diff-command when a diff.exe is present</li><li>issue2436: rollback --patches takes ages before first prompt</li><li>issue2445: internal error if suspended patch is pulled into repository again</li><li>issue2449: test harness/shelly: need to handle mis-encoded/binary data</li></ul>guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: Darcs News #110tag:blogger.com,1999:blog-819021106854702432.post-78229513531174920122015-03-04T12:18:07+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>The Darcs 2.10 release is near! Please test the release branch and tell us if you find a bug.<br /> <ul><li><a class="uri" href="http://darcs.net/Releases/2.10">http://darcs.net/Releases/2.10</a></li><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2015-March/027105.html">http://lists.osuosl.org/pipermail/darcs-users/2015-March/027105.html</a></li></ul></li><li>Joachim Breitner has shut down his darcswatch service after 7 years of activity:<br /> <ul><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2015-February/027102.html">http://lists.osuosl.org/pipermail/darcs-users/2015-February/027102.html</a></li><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2015-February/027104.html">http://lists.osuosl.org/pipermail/darcs-users/2015-February/027104.html</a></li><li><a href="http://www.joachim-breitner.de/blog/672-DarcsWatch_End-Of-Life%E2%80%99d">http://www.joachim-breitner.de/blog/672-DarcsWatch_End-Of-Life%E2%80%99d</a></li></ul></li></ol><h3 id="issues-resolved-11">Issues resolved (11)</h3><dl><dt>issue822 Ernesto Rodriguez</dt><dd><ul><li>Generalized the IO Type for better error messages and exception handling</li><li><a class="uri" href="http://bugs.darcs.net/issue822">http://bugs.darcs.net/issue822</a></li></ul></dd><dt>issue2260 Ganesh Sittampalam</dt><dd><ul><li>skip internal patches when counting </li><li><a class="uri" href="http://bugs.darcs.net/issue2260">http://bugs.darcs.net/issue2260</a></li></ul></dd><dt>issue2385 Guillaume Hoffmann</dt><dd><ul><li>invoke pager without temporary file </li><li><a class="uri" href="http://bugs.darcs.net/issue2385">http://bugs.darcs.net/issue2385</a></li></ul></dd><dt>issue2410 Guillaume Hoffmann</dt><dd><ul><li>detect replaces even with tokens of different lengths </li><li><a class="uri" href="http://bugs.darcs.net/issue2410">http://bugs.darcs.net/issue2410</a></li></ul></dd><dt>issue2411 Guillaume Hoffmann</dt><dd><ul><li>ignore swap moves with --look-for-moves </li><li><a class="uri" href="http://bugs.darcs.net/issue2411">http://bugs.darcs.net/issue2411</a></li></ul></dd><dt>issue2414 Guillaume Hoffmann</dt><dd><ul><li>use parseFlags instead of toMatchFlags where needed </li><li><a class="uri" href="http://bugs.darcs.net/issue2414">http://bugs.darcs.net/issue2414</a></li></ul></dd><dt>issue2418 Guillaume Hoffmann</dt><dd><ul><li>add and check on-disk patch index version </li><li><a class="uri" href="http://bugs.darcs.net/issue2418">http://bugs.darcs.net/issue2418</a></li></ul></dd><dt>issue2422 Ganesh Sittampalam</dt><dd><ul><li>drop unneeded LambdaCase extension </li><li><a class="uri" href="http://bugs.darcs.net/issue2422">http://bugs.darcs.net/issue2422</a></li></ul></dd><dt>issue2427 Ben Franksen</dt><dd><ul><li>start conversion from intermediate tree state </li><li><a class="uri" href="http://bugs.darcs.net/issue2427">http://bugs.darcs.net/issue2427</a></li></ul></dd><dt>issue2431 Ben Franksen</dt><dd><ul><li>rollback Control.Monad.Catch generalizations </li><li><a class="uri" href="http://bugs.darcs.net/issue2431">http://bugs.darcs.net/issue2431</a></li></ul></dd><dt>issue2432 Ganesh Sittampalam</dt><dd><ul><li>use the merged version of the local patches </li><li><a class="uri" href="http://bugs.darcs.net/issue2432">http://bugs.darcs.net/issue2432</a></li></ul></dd><dt>issue2437 Guillaume Hoffmann</dt><dd><ul><li>fix cloning to ssh by forgetting source repo later </li><li><a class="uri" href="http://bugs.darcs.net/issue2437">http://bugs.darcs.net/issue2437</a></li></ul></dd></dl><h3 id="patches-applied-111">Patches applied (111)</h3>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2015-03-04">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: Darcs News #107tag:blogger.com,1999:blog-819021106854702432.post-13557396481316010052014-11-18T03:45:50+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>Darcs has received two grants from the Google Summer of Code program, as part of the umbrella organization Haskell.org. Alejandro Gadea will work on history reordering:<br /> <ul><li><a href="http://alegdarcs.blogspot.com.ar/2014/05/google-summer-of-code-2014-darcs.html">http://alegdarcs.blogspot.com.ar/2014/05/google-summer-of-code-2014-darcs.html</a></li></ul></li><li>Marcio Diaz will work on the cache system:<br /> <ul><li><a href="http://marcioodiaz.blogspot.com.ar/2014/04/gsoc-project-accepted.html">http://marcioodiaz.blogspot.com.ar/2014/04/gsoc-project-accepted.html</a></li><li><a href="http://marcioodiaz.blogspot.com.ar/2014/04/gsoc-progress-report-1-complete.html">http://marcioodiaz.blogspot.com.ar/2014/04/gsoc-progress-report-1-complete.html</a></li></ul></li><li>Repository cloning to remote ssh hosts has been present for years as <code>darcs put</code>. This feature has now a more efficient implementation:<br /> <ul><li><a href="http://hub.darcs.net/darcs/darcs-reviewed/patch/20140425060647-5ef8f">http://hub.darcs.net/darcs/darcs-reviewed/patch/20140425060647-5ef8f</a></li></ul></li></ol><h3 id="issues-resolved-11">Issues resolved (11)</h3><dl><dt>issue851 Dan Frumin</dt><dd><ul><li>interactive mode for whatsnew</li><li><a href="http://bugs.darcs.net/issue851">http://bugs.darcs.net/issue851</a></li></ul></dd><dt>issue1066 Guillaume Hoffmann</dt><dd><ul><li>clone to ssh URL by locally cloning then copying by scp</li><li><a href="http://bugs.darcs.net/issue1066">http://bugs.darcs.net/issue1066</a></li></ul></dd><dt>issue1268 Guillaume Hoffmann</dt><dd><ul><li>enable to write darcs init x</li><li><a href="http://bugs.darcs.net/issue1268">http://bugs.darcs.net/issue1268</a></li></ul></dd><dt>issue1416 Ale Gadea</dt><dd><ul><li>put log files in tempdir instead of in working dir.</li><li><a href="http://bugs.darcs.net/issue1416">http://bugs.darcs.net/issue1416</a></li></ul></dd><dt>issue1987 Marcio Diaz</dt><dd><ul><li>Garbage collection for inventories and patches.</li><li><a href="http://bugs.darcs.net/issue1987">http://bugs.darcs.net/issue1987</a></li></ul></dd><dt>issue2263 Ale Gadea</dt><dd><ul><li>Option --set-scripts-executable is not properly documented</li><li><a href="http://bugs.darcs.net/issue2263">http://bugs.darcs.net/issue2263</a></li></ul></dd><dt>issue2345 Dan Frumin</dt><dd><ul><li>solution using cabal's checkForeignDeps</li><li><a href="http://bugs.darcs.net/issue2345">http://bugs.darcs.net/issue2345</a></li></ul></dd><dt>issue2357 Dan Frumin</dt><dd><ul><li>switching to regex-compat-tdfa for unicode support</li><li><a href="http://bugs.darcs.net/issue2357">http://bugs.darcs.net/issue2357</a></li></ul></dd><dt>issue2365 Guillaume Hoffmann</dt><dd><ul><li>correctly copy pristine in no-working-dir clones</li><li><a href="http://bugs.darcs.net/issue2365">http://bugs.darcs.net/issue2365</a></li></ul></dd><dt>issue2367 Guillaume Hoffmann</dt><dd><ul><li>rename amend-record to amend, make --unrecord more visible</li><li><a href="http://bugs.darcs.net/issue2367">http://bugs.darcs.net/issue2367</a></li></ul></dd><dt>issue2379 Guillaume Hoffmann</dt><dd><ul><li>only use packs to copy pristine when up-to-date</li><li><a href="http://bugs.darcs.net/issue2379">http://bugs.darcs.net/issue2379</a></li></ul></dd></dl><h3 id="patches-applied-41">Patches applied (41)</h3><dl></dl>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2014-05-05">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: Darcs News #109tag:blogger.com,1999:blog-819021106854702432.post-44184429218417314852014-11-18T03:45:30+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>We are in the feature freeze period of darcs 2.10:</li></ol><ul><li><a class="uri" href="http://lists.osuosl.org/pipermail/darcs-users/2014-November/027056.html">http://lists.osuosl.org/pipermail/darcs-users/2014-November/027056.html</a></li></ul><ol start="2"><li>Our two Summer of Code projects ended up two months ago. Marcio and Ale's code will be part of the upcoming new stable version of darcs. In case you missed them, here are the latest posts of Marcio for his project:</li></ol><ul><li><a class="uri" href="http://marcioodiaz.blogspot.com.ar/2014/07/gsoc-progress-report-3-bucketed-global_23.html">http://marcioodiaz.blogspot.com.ar/2014/07/gsoc-progress-report-3-bucketed-global_23.html</a></li><li><a class="uri" href="http://marcioodiaz.blogspot.com.ar/2014/07/gsoc-progress-report-4-garbage.html">http://marcioodiaz.blogspot.com.ar/2014/07/gsoc-progress-report-4-garbage.html</a></li><li><a class="uri" href="http://marcioodiaz.blogspot.com.ar/2014/07/gsoc-progress-report-5-starting.html">http://marcioodiaz.blogspot.com.ar/2014/07/gsoc-progress-report-5-starting.html</a></li></ul><ol start="3"><li>Ale's posts:</li></ol><ul><li><a class="uri" href="http://alegdarcs.blogspot.com.ar/2014/07/month-of-june.html">http://alegdarcs.blogspot.com.ar/2014/07/month-of-june.html</a></li><li><a class="uri" href="http://alegdarcs.blogspot.com.ar/2014/07/some-week-14-19-july.html">http://alegdarcs.blogspot.com.ar/2014/07/some-week-14-19-july.html</a></li><li><a class="uri" href="http://alegdarcs.blogspot.com.ar/2014/07/other-week-21-26-july.html">http://alegdarcs.blogspot.com.ar/2014/07/other-week-21-26-july.html</a></li><li><a class="uri" href="http://alegdarcs.blogspot.com.ar/2014/08/last-few-weeks.html">http://alegdarcs.blogspot.com.ar/2014/08/last-few-weeks.html</a></li></ul><h3 id="issues-resolved-7">Issues resolved (7)</h3><dl><dt>issue1514 Guillaume Hoffmann</dt><dd><ul><li>send --minimize-context flag for send</li><li><a class="uri" href="http://bugs.darcs.net/issue1514">http://bugs.darcs.net/issue1514</a></li></ul></dd><dt>issue1624 Marcio Diaz</dt><dd><ul><li>bucketed cache.</li><li><a class="uri" href="http://bugs.darcs.net/issue1624">http://bugs.darcs.net/issue1624</a></li></ul></dd><dt>issue2153 Andreas Brandt</dt><dd><ul><li>allow skipping backwards through depended-upon patches</li><li><a class="uri" href="http://bugs.darcs.net/issue2153">http://bugs.darcs.net/issue2153</a></li></ul></dd><dt>issue2249 Mateusz Lenik</dt><dd><ul><li>Rename isFile to isValidLocalPath and WorkRepoURL to WorkRepoPossibleURL</li><li><a class="uri" href="http://bugs.darcs.net/issue2249">http://bugs.darcs.net/issue2249</a></li></ul></dd><dt>issue2380 Owen Stephens</dt><dd><ul><li>allow darcs mv into known, but deleted in working, file</li><li><a class="uri" href="http://bugs.darcs.net/issue2380">http://bugs.darcs.net/issue2380</a></li></ul></dd><dt>issue2403 Ganesh Sittampalam</dt><dd><ul><li>need to avoid moving the rebase patch to the end</li><li><a class="uri" href="http://bugs.darcs.net/issue2403">http://bugs.darcs.net/issue2403</a></li></ul></dd><dt>issue2409 Ganesh Sittampalam</dt><dd><ul><li>implement darcs rebase apply</li><li><a class="uri" href="http://bugs.darcs.net/issue2409">http://bugs.darcs.net/issue2409</a></li></ul></dd></dl><h3 id="patches-applied-118">Patches applied (118)</h3><dl></dl>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2014-11-18">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Ale Gadea: Last Few Weekstag:blogger.com,1999:blog-3030171199136064832.post-21535561491202623442014-08-19T05:44:02+00:00In the last three weeks I was working in a couple of things, unfortunately I couldn't complete any to 100% :<br /><br />- Finishing the command minimize-context.<br />- Implement the "show dependencies" for darcsden.<br />- Solve the <a href="http://bugs.darcs.net/issue2405" target="_blank">issue2405</a>.<br /><br /><b>Finish the command minimize-context</b><br /><br />I can start telling that the command itself is implemented, but making tests I find out a case when making <b>minimize-context</b> fails to update correctly the files of repository. I comment the problem in <a href="http://lists.osuosl.org/pipermail/darcs-devel/2014-August/015955.html" target="_blank">here</a>, however here goes a little summary.<br /><br />Some "preconditions" to take into account:<br />1. If exist a tag, I search for dependencies in the patchs after the tag.<br />2. If happends that not exist dependencies after the tag, the only patch in the context of the bundle to send is the tag. This helps the command <b>darcs apply</b> to merge the patches and seems good to have at least a "tag patch" dependency.<br />3. (In relation with 1) If not exist a tag, the search is made in all the repository. One problem here is that with repositories that have <u>huge amount</u> of patches (darcs for example with 11000~ patches) the command maybe not finish of calculate the dependencies. Hopefully, having so many patches without tags seems a little odd. Nevertheless, I suppose that even the search in 700~ patches of 10~ patches to send should have a decent performance.<br /><br />Well, passing to comment the problem. In some older post I mention the way we calculate the dependencies, so with that in mind, suppose we have to repositories $r_1$, $r_2$ with the following patches, where $m_x$ and $a_x$ represents the $x$-th modification and adding respectively.<br /><div><br /></div>$r_1$,$r_2$ = $m_2$ $tag$ $m_1$ $a_1$<br /><br />suppose now that $r_2$ makes a third modification $m_3$ that adds lines without touch any existing line in the only file adding for $a_1$ and sequentially modified for $m_x$. With the idea of send a bundle to $r_1$. Now if we compute the dependencies to find out what is the context to send. For (1) we need to try to commute $m_2$ with $m_3$, which success but of course the end result is a $m'_3$ and a $m'_2$ because the lines which modifies every one now are different. But beyond that for our definition of dependency we can throw $m_2$, so the final context of the bundle with minimize context is the patch $tag$.<br /><div><br /></div><span style="font-family: inherit; white-space: pre-wrap;">The problem now is that if we make <b>darcs apply</b> of the <i>minimized bundle</i> the merge is made not considering $m_2$ and the final state of the file isn't right. For example, if we are talking about that $m_3$ adds a function in some <i>empty</i> place, this could end in $m_3$ adding the function in the middle of an existing function.</span><br /><span style="font-family: inherit; white-space: pre-wrap;"><br /></span>My, more or less, mature thought is something like have Direct Dependency and Indirect Dependency (the names could be differents $\smile$). The Direct Dependency is a dependency as already we know it and the Indirect Dependency is that if we have,<br /><div><br /></div>$p_1$ and $p_2$ patches, and $p'_1$ and $p'_2$ are the results of commute the patches, then if $p_1 \ne p'_1$ we conclude that $p_1$ <i>indirectly</i> depends of $p_2$.<br /><br />I have almost implemented this idea, but I change task and still missing a couple of details. In particular, I'm not so sure of a couple of things,<br /><div><br /></div>- How to correctly compare the patches ($p_1 \ne p'_1$)<br />- In my <i>unclean</i> implementation I have to carry on $MyEq$ for all over the code and it's very ugly I think.<br /><br />Finishing with this topic, here is a script (improved by Guillaume) that shows the problem:<br /><pre style="white-space: pre-wrap;"><span style="font-family: inherit;">Link: <a href="http://hub.darcs.net/alegadea/ExamplesRepos">http://hub.darcs.net/alegadea/ExamplesRepos</a><br />SH: getDepsDoesntAlwaysWork.sh</span></pre><br /><b>Implement the "show dependencies" for darcsden</b><br /><br />An idea that quickly comes up to my mind is that, considering the last part of the previous topic, since we have two types of dependencies it would be nice generate the graph of dependencies with two types of arrows to differentiate the type of dependency between patches. Talking about the implementation itself, I advanced in the drawing of the graph and some different presentations, but very little about the integration with darcsden, which I think is more or less direct having implemented the $js$ that draw the graph. Would have been nice have more time for finish this but I swap to the task of the following topic.<br /><br />I hope be able to work in the last two topics in the next few months outside of the GSoC.<br /><div class="g-unit" id="gt-src-c"><div id="gt-src-p"><div class="" id="gt-src-wrap"><div style="width: 100%;"></div><div id="gt-src-tools"><div id="gt-src-tools-l"><div id="gt-input-tool" style="display: inline-block;"><div id="itamenu"><span class="ita-kd-inputtools-div"></span></div></div></div><div id="gt-src-tools-r"></div></div></div><div class="translit" dir="ltr" id="src-translit"></div></div></div><div class="g-unit" id="gt-res-c"><div id="gt-res-p"><div id="gt-res-data"><div id="gt-res-wrap"><div class="almost_half_cell" id="gt-res-content"><div dir="ltr"><div id="tts_button"></div></div></div></div></div></div></div><b><br /></b><b>Solve the <a href="http://bugs.darcs.net/issue2405" target="_blank">issue2405</a></b><br /><br />I would like to start saying, "what a shame...". I can't solve the issue, I improve a little bit the memory but nothing too much significant. Maybe the good news is that, more o less, I found the "place" in the code where the memory triggers "to the sky" :)<br /><div><br /></div>Now, the reality is that I tried so many things that I'm a little bit confused about everything. So, I gonna comment the last feelings and tests that I make and, any question(or idea) for the future person (maybe me) that would try to solve the issue, it would well received.<br /><div><br /></div>So things that I tried to change:<br /><br />- Strict version of Map, Monad, etc.<br />- More strict version of mapM_, gets and modify.<br />- Some partials changes in the data type PatchIndex.<br />- Using darcs as library; differents uses of the functions...<br /><br />The "place" that I suspect the code has the memory glitch is in <i><b>$applyPatchMods \rightarrow go (pid, PTouch fn)$</b>. </i>I think that my lack of experience dealing with this kind of problem comes to light :) the<br />bright side is that I learn many things on the way of understand the problem and try different solutions.<br /><br />Closing, maybe this could be my last post in a long time. I would like to thanks Guillaume and the darcs community in general. It was great to contribute to the development of darcs!<br /><br />Again, I hope be able to work a little outside the GSoC, in particular in the "dependency problems and tasks".<br /><br /><b>Thanks!</b>Ale Gadea (noreply@blogger.com)http://alegdarcs.blogspot.com/search/label/darcsAle Gadea: Other Week (21-26 July)tag:blogger.com,1999:blog-3030171199136064832.post-49741420748688943792014-08-01T07:13:26+00:00Good news!<br /><br />I almost finish to implement the option <b>minimize-context</b> for the command <b>darcs send</b>, I say almost because making some examples I find out that somethings could go wrong. But before entering in that, I will comment a little the <i>main</i> the test that without <b>minimize-context</b> doesn't work and with the option passes(when the implementation is ready the most likely is I will upload the example and some more in <a href="http://hub.darcs.net/alegadea/ExamplesRepos" target="_blank">ExamplesRepos</a>), and some "tentatives options" for <b>darcs send </b>that I think could be useful.<br /><br />So, the <i>minimal e</i>xample:<br /><br />Suppose we have repositories $r_1$, $r_2$ and $r_3$; $r_2$ a direct clone of $r_1$ where<br /><span class="short_text" id="result_box" lang="en">originally $r_1$ has only one patch, </span><br /><span class="short_text" lang="en"><br /></span>$r_1$,$r_2$ $=$ $p_0$<br /><br />now, we add a patch with a new file in $r_1$ and make a clone, $r_3$ which leave the repositories like this,<br /><br />$r_1$,$r_3$ $=$ $p_0$ $p_1$<br /><br />Suppose that we make a modification in the file that add $p_0$ and make a patch $p'_0$ in $r_1$ and we send a bundle (with <b>darcs send</b>) to $r_2$ and $r_3$. What ends up happening is what one imagine,<br />the bundle can be applied to $r_3$ but not to $r_2$, this because the bundle has de following "shape":<br /><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;">Some message</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Verdana, sans-serif; font-size: x-small;">patch [Some hash]</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;">Author: ...</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;">Date: ...</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;"> * [The modification to $p_0$]</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Verdana, sans-serif; font-size: x-small;">New patches:</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Verdana, sans-serif; font-size: x-small;">$p'_0$</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Verdana, sans-serif; font-size: x-small;">Context:</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Verdana, sans-serif;"><span style="font-size: x-small;">$p_1$</span></span><br /><span style="font-family: Verdana, sans-serif;"><span style="font-size: x-small;">$p_0$</span></span><br /><span style="font-family: Verdana, sans-serif;"><span style="font-size: x-small;"><br /></span></span><span style="font-size: x-small;"><span style="font-family: Verdana, sans-serif;">Patch bundle hash: </span><span style="font-family: Verdana, sans-serif;">[Some hash]</span></span><br /><br /><div>and $r_2$ doesn't have the patch $p_1$ despite the fact that $p_1$ nothing has to do with $p'_0$. Using the option <b>minimize-context</b> the bundle is the same but the "Context" is:</div><div><br /></div><div><span style="font-family: Verdana, sans-serif; font-size: x-small;">Context:</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;"><br /></span><span style="font-family: Verdana, sans-serif; font-size: x-small;">$p_0$</span><br /><span style="font-family: Verdana, sans-serif; font-size: x-small;"><br /></span><span style="font-family: inherit;">and now there is no problem.</span><br /><span style="font-family: inherit;"><br /></span>Now, I find out that reducing the context is not always the "best option" for send a bundle. Here I will expose something that could go wrong. Take for example the darcs-screened repository, in total has 11000~ patches, suppose we add a file and make a bundle (using minimize-context) with only the patch that make the add, the context then is empty. So, if we try to apply this bundle to, say the remote repository, this could never end...<br />What go wrong?; because the context is empty, making darcs apply [TheBundle] in some point try to merge the entire repository versus the "set" of patches to apply, this is very costly if we have 11000~ patches.</div><div><span style="font-family: inherit;"><br /></span></div><div><span style="font-family: inherit;">I write "best option" before because with my current solution is not always is better reduce the context, but the final idea is that always be the best option. So, I think <span class="hps alt-edited">is necessary to have</span> <span class="hps">some care for example in the last implementation if exist a tag, this tag is added to the context. This simple solution solves the problem and seems correct, on the other hand having more than 600~ or 1000~ patches without a tag seem a little extreme :)</span></span></div><div><span style="font-family: inherit;"><span class="hps"><br /></span></span></div><div><span style="font-family: inherit;"><span class="hps">Ending, </span></span>I'm making some tests of two interesting options that came to mind:</div><div><br /></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">. --last-deps=NUMBER</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">. --deps-from-tag=REGEXP</span></div><div><br /></div><div><div>The first searches dependencies in the first N patches, and the second search since a given tag.</div><div><br /></div><div>In conclusion, I'm still doubtful about how solve that problem. More if I have consider the two options. For the end of the week I hope have all this solved.</div></div>Ale Gadea (noreply@blogger.com)http://alegdarcs.blogspot.com/search/label/darcsAle Gadea: Some Week (14-19 July)tag:blogger.com,1999:blog-3030171199136064832.post-14363488618670084672014-07-24T04:43:21+00:00Hi all!<br /><br />I was finishing understanding and implementing the command <b>darcs send --minimize-context</b> using "<b>optimize reorder</b>" when I begin to suspect that doesn't solve the problem described in <a href="http://darcs.net/GSoC/2014-History-Reordering-Performance-and-Features#contextproblem" target="_blank">here</a>. The thing is, despite the fact that the context in the bundle to send is reduced if before we send we make "<b>optimize reorder</b>", this doesn't solve the problem of dependencies. Guillaume finished of <a href="http://bugs.darcs.net/msg17625" target="_blank">evacuate my doubts</a>, and so after read:<br /><br />- <a href="http://lists.osuosl.org/pipermail/darcs-users/2012-March/026397.html" target="_blank">[darcs-users] darcs cannot apply some patch bundles</a><br />- <a href="http://irclog.perlgeek.de/darcs/2011-05-12#i_3723753" target="_blank">irclog</a><br />- <a href="http://bugs.darcs.net/issue1514" target="_blank">issue1514</a> (which is the issue which "replace" <a href="http://bugs.darcs.net/issue2044" target="_blank">issue2044 darcs send should do optimize --reorder</a>)<br /><br />I convince myself of what needs to be done, and it's calculate the "exact" dependencies of the patches to send so such dependencies be the context in the bundle to send. "Exact" because for big repositories can be very costly and calculate till certain tag seem appropriate.<br /><br />Now, one concern is the cost of doing the search of dependencies. About this I can first comment some of the things I was doing during the week and later show, what I think are, encouraging examples. So first, maybe the most relevant thing of the week it's the implementation of the command <b>darcs show dependencies</b> with the following "description":<br /><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">Usage: darcs show dependencies [OPTION]... </span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">Generate the graph of dependencies.</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">Options:</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> --from-match=PATTERN select changes starting with a patch matching PATTERN</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> --from-patch=REGEXP select changes starting with a patch matching REGEXP</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> --from-tag=REGEXP select changes starting with a tag matching REGEXP</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> --last=NUMBER select the last NUMBER patches</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> --matches=PATTERN select patches matching PATTERN</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> -p REGEXP --patches=REGEXP select patches matching REGEXP</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> -t REGEXP --tags=REGEXP select tags matching REGEXP</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> --disable disable this command</span><br /><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> -h --help shows brief description of command and its arguments</span><br /><div class="g-unit" id="gt-src-c"><div id="gt-src-p"><div class="" id="gt-src-wrap"><div style="width: 100%;"></div><div id="gt-src-tools"><div id="gt-src-tools-l"><div id="gt-input-tool" style="display: inline-block;"><div id="itamenu"><span class="ita-kd-inputtools-div"></span></div></div></div><div id="gt-src-tools-r"></div></div></div><div class="translit" dir="ltr" id="src-translit"></div></div></div><div class="g-unit" id="gt-res-c"><div id="gt-res-p"><div id="gt-res-data"><div id="gt-res-wrap"><div class="almost_half_cell" id="gt-res-content"><div dir="ltr"><div id="tts_button"></div></div></div></div></div></div></div><br />till the moment the command returns a graph described in <a href="http://www.graphviz.org/content/dot-language" target="_blank">dot language</a>, this can eventually change. But with the current returned value one can do:<br /><br />$\$$ darcs show dep | dot -Tpdf -o deps.pdf<br /><br />to draw the graph in a pdf. Finally, in summary to calculate the dependencies I use more or less the idea which describes Ganesh in <a href="http://lists.osuosl.org/pipermail/darcs-users/2012-March/026406.html" target="_blank">here</a>.<br /><br /><span class="short_text" id="result_box" lang="en" tabindex="-1"><span class="hps alt-edited">Moving to</span> <span class="hps">the examples is interesting, thinking in the performance of the implementation of </span></span><b>darcs send --minimize-context</b> using this approach, to see the followings results:<br /><br />1. Show the dependencies after the tag 2.9.9 (75 patches)<br />$ time darcs show dep --from-tag=2.9.9<br />real<span class="Apple-tab-span" style="white-space: pre;"> </span>0m0.397s<br />user<span class="Apple-tab-span" style="white-space: pre;"> </span>0m0.373s<br />sys<span class="Apple-tab-span" style="white-space: pre;"> </span>0m0.026s<br /><a href="https://drive.google.com/file/d/0BxppuRzGjr66ZFZrbzRQc2tNVzA/edit?usp=sharing" target="_blank">darcsDesps299.pdf</a><br /><div><br /></div><div>2. Show the dependencies after the tag 2.9.8 (133 patches)</div><div>$ time darcs show dep --from-tag=2.9.8</div>real<span class="Apple-tab-span" style="white-space: pre;"> </span>0m2.951s<br />user<span class="Apple-tab-span" style="white-space: pre;"> </span>0m2.865s<br />sys<span class="Apple-tab-span" style="white-space: pre;"> </span>0m0.082s<br /><a href="https://drive.google.com/file/d/0BxppuRzGjr66aDh0aklGX3c5R1E/edit?usp=sharing" target="_blank">darcsDesps298.pdf</a><br /><br />3. Show the dependencies after the tag 2.9.7 (288 patches)<br />$ time darcs show dep --from-tag=2.9.7<br />real<span class="Apple-tab-span" style="white-space: pre;"> </span>0m26.654s<br />user<span class="Apple-tab-span" style="white-space: pre;"> </span>0m26.003s<br />sys<span class="Apple-tab-span" style="white-space: pre;"> </span>0m0.511s<br /><a href="https://drive.google.com/file/d/0BxppuRzGjr66NEUtN250WnU5Wjg/edit?usp=sharing" target="_blank">darcsDesps297.pdf</a><br /><br />4. Show the dependencies after the tag 2.9.6 (358 patches)<br />$ time darcs show dep --from-tag=2.9.6<br />real<span class="Apple-tab-span" style="white-space: pre;"> </span>0m39.019s<br />user<span class="Apple-tab-span" style="white-space: pre;"> </span>0m38.302s<br />sys<span class="Apple-tab-span" style="white-space: pre;"> </span>0m0.666s<br /><a href="https://drive.google.com/file/d/0BxppuRzGjr66a3ItRnJBYmpHMTQ/edit?usp=sharing" target="_blank">darcsDesps296.pdf</a><br /><div><br /></div>5. Show the dependencies after the tag 2.9.5 (533 patches)<br />$ time darcs show dep --from-tag=2.9.5<br />real<span class="Apple-tab-span" style="white-space: pre;"> </span>1m53.730s<br />user<span class="Apple-tab-span" style="white-space: pre;"> </span>1m51.343s<br />sys<span class="Apple-tab-span" style="white-space: pre;"> </span>0m1.939s<br /><a href="https://drive.google.com/file/d/0BxppuRzGjr66M3FhTVRDU0RReFU/edit?usp=sharing" target="_blank">darcsDesps295.pdf</a><br /><div><br /></div><div><span class="short_text" id="result_box" lang="en" tabindex="-1"><span class="hps alt-edited">Rushed</span> <span class="hps">conclusion, seems the performance is quite good even more if we think that for compute the graph dependencies we calculate the dependencies of "all the selected patches against all the selected patches" and in the case of the option for send would only require to calculate "patches to send against all the selected patches".</span></span></div>Ale Gadea (noreply@blogger.com)http://alegdarcs.blogspot.com/search/label/darcsAle Gadea: Month of Junetag:blogger.com,1999:blog-3030171199136064832.post-18855235046122119982014-07-15T01:43:32+00:00<div style="text-align: center;"><div style="text-align: left;"><span style="font-family: inherit;">Here goes a little summary of what I been doing between late june (9~21) and early july (1~11).</span></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><span style="font-family: inherit;">First and easy, I have been documenting <a href="http://hub.darcs.net/darcs/darcs-screened/browse/src/Darcs/Repository/Internal.hs" target="_blank">Darcs.</a>misplacedPatches (old name chooseOrder), </span><a href="http://hub.darcs.net/darcs/darcs-screened/browse/src/Darcs/Patch/Witnesses/Ordered.hs" target="_blank">D.P.W.Ordered</a> and <a href="http://hub.darcs.net/darcs/darcs-screened/browse/src/Darcs/Patch/Witnesses/Sealed.hs" target="_blank">D.P.W.Sealed</a>. Something to comment is that the semantics of misplacedPatches, not always can clean a tag doing darcs optimize reorder. For example; Suppose we have a repository, $r_1$ with the following patches;<br /><br /> $r_1$ $=$ $t_{1,0}$ $p_{1,0}$ $t_{1,1}$<br /><span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">here all tags are clean, but if we make another repository, say $r_2$, and we pull from $r_1$ of the</span><br /><span style="font-family: inherit;">following way</span><br /><span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">$\$$ darcs pull -a -p $p_{1,0}$ $r_1$ (we want to pull the patch $p_{1,0}$, we assume that the name of the patch is $p_{1,0}$ for the matching with -p option)</span><br />$\$$ darcs pull -a $r_1$<br /><span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">so now we have,</span><br /><span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">$r_2$ $=$ </span>$p_{1,0}$ $t_{1,0}$ $t_{1,1}$<br /><br />and we see that $t_{1,0}$ is dirty. Doing <b>darcs optimize reorder</b> not reorder nothing. What is going on is that to know what reorder, misplacePatches takes the first tag, in our case $t_{1,1}$, and<br />"search" for what patches he don't tag. But $p_{1,0}$ and $t_{1,0}$ are tagged by $t_{1,1}$ so there is nothing to reorder despite $t_{1,0}$ is dirty. Therefore there is no way of clean $t_{1,0}$ because misplacePatches always takes the first tag, so if a tag is tagging one or more dirty tags, this tags never be available to get clean.<br /><br />"Second", using the implementation of "reorder" one can get almost for free the option <b>--reorder</b> for the commands <b>pull</b>, <b>apply</b> and <b>rebase pull</b>. The behavior for the case of <b>pull</b> (for the others commands is the same basic idea) is that our local patches remain on top after a pull from a remote repository, e.i. suppose we have the followings $l$(ocal) and $r$(emote) repositories,<br /><br />$l$ $=$ $p_1$ $p_2$ $\ldots$ $p_n$ $lp_{n+1}$ $\ldots$ $lp_m$<br /><br />$r$ $=$ $p_1$ $p_2$ $\ldots$ $p_n$ $rp_{n+1}$ $\ldots$ $rp_k$<br /><br />where $lp$ are the local patches that don't belong to $r$, and vice versa for $rp$. Make <b>darcs pull</b>, leaves $l$ as follow,<br /><br />$l$ $=$ $p_1$ $p_2$ $\ldots$ $p_n$ $lp_{n+1}$ $\ldots$ $lp_m$ $rp_{n+1}$ $\ldots$ $rp_k$<br /><br />meanwhile make <b>darcs pull</b> <b>--reorder</b>, leaves $l$,<br /><br />$l$ $=$ $p_1$ $p_2$ $\ldots$ $p_n$ $rp_{n+1}$ $\ldots$ $rp_k$ $lp_{n+1}$ $\ldots$ $lp_m$<br /><br />making more easy to send the $lp$ patches later.<br /><br />"Third", beginning a new task, implement option <a href="http://darcs.net/GSoC/2014-History-Reordering-Performance-and-Features#minimize" style="font-weight: bold;" target="_blank">minimize-context</a> for command darcs send. Still no much to comment, I have almost finished implementing the option but with some doubts, I hope that for the end of the week have a more "prettier" implementation as well as a better understanding.</div></div>Ale Gadea (noreply@blogger.com)http://alegdarcs.blogspot.com/search/label/darcsDarcs News: darcs news #104tag:blogger.com,1999:blog-819021106854702432.post-57099073948930579902014-06-25T04:59:20+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>Google Summer of Code 2013 has begun! BSRK and José will post updates on their blogs:<br /> <ul><li><a href="http://bsrkaditya.blogspot.com/search/label/darcs"><code class="url">http://bsrkaditya.blogspot.com/search/label/darcs</code></a></li><li><a href="http://blog.jlneder.com.ar/search/label/darcs"><code class="url">http://blog.jlneder.com.ar/search/label/darcs</code></a></li></ul></li></ol><h3 id="issues-resolved-8">Issues resolved (8)</h3><dl><dt>issue2163 Radoslav Dorcik</dt><dd><ul><li>new option for amend, select author for patch stealing.</li><li><a href="http://bugs.darcs.net/issue2163"><code class="url">http://bugs.darcs.net/issue2163</code></a></li></ul></dd><dt>issue2227 Ganesh Sittampalam</dt><dd><ul><li>move the rebase patch to the end before an amend-record</li><li><a href="http://bugs.darcs.net/issue2227"><code class="url">http://bugs.darcs.net/issue2227</code></a></li></ul></dd><dt>issue2248 Ganesh Sittampalam</dt><dd><ul><li>always clean up rebase-in-progress state</li><li><a href="http://bugs.darcs.net/issue2248"><code class="url">http://bugs.darcs.net/issue2248</code></a></li></ul></dd><dt>issue2250 BSRK Aditya</dt><dd><ul><li>tabbing in usageHelper - pad by max length of command name</li><li><a href="http://bugs.darcs.net/issue2250"><code class="url">http://bugs.darcs.net/issue2250</code></a></li></ul></dd><dt>issue2311 Sebastian Fischer</dt><dd><ul><li>posthook for 'get' should run in created repo</li><li><a href="http://bugs.darcs.net/issue2311"><code class="url">http://bugs.darcs.net/issue2311</code></a></li></ul></dd><dt>issue2312 Sebastian Fischer</dt><dd><ul><li>posthooks for 'record' and 'amend-record' should receive DARCS_PATCHES</li><li><a href="http://bugs.darcs.net/issue2312"><code class="url">http://bugs.darcs.net/issue2312</code></a></li></ul></dd><dt>issue2320 Jose Luis Neder</dt><dd><ul><li>save prompted author name in ~/.darcs/author instead of ./_darcs/prefs/author</li><li><a href="http://bugs.darcs.net/issue2320"><code class="url">http://bugs.darcs.net/issue2320</code></a></li></ul></dd><dt>issue2321 Jose Luis Neder</dt><dd><ul><li>when no patch name given, directly invoke text editor</li><li><a href="http://bugs.darcs.net/issue2321"><code class="url">http://bugs.darcs.net/issue2321</code></a></li></ul></dd></dl><h3 id="patches-applied-20">Patches applied (20)</h3><dl></dl>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2013-06-30">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: darcs news #105tag:blogger.com,1999:blog-819021106854702432.post-58750274049308655122014-06-25T04:58:48+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>This year's Google Summer of Code projects brought a lot of improvements to darcs and its ecosystem!<br /> <ul><li>BSRK Aditya: Darcsden improvements:<br /> <ul><li><a href="http://joyful.com/blog/2013-09-26-darcsden-darcs-hub-gsoc-complete.html">http://joyful.com/blog/2013-09-26-darcsden-darcs-hub-gsoc-complete.html</a></li><li><a href="http://bsrkaditya.blogspot.com.ar/2013/09/darcsden-gsoc-final-blog-post.html">http://bsrkaditya.blogspot.com.ar/2013/09/darcsden-gsoc-final-blog-post.html</a></li></ul></li><li>José Neder: patience diff, file move detection, token replace detection:<br /> <ul><li><a href="http://lists.osuosl.org/pipermail/darcs-users/2013-October/026945.html">http://lists.osuosl.org/pipermail/darcs-users/2013-October/026945.html</a></li><li><a href="http://blog.jlneder.com.ar/search/label/darcs">http://blog.jlneder.com.ar/search/label/darcs</a></li></ul></li></ul></li><li>Gian Piero Carrubba asked why adjacent hunks could not commute:<br /> <ul><li><a href="http://lists.osuosl.org/pipermail/darcs-users/2013-November/026958.html">http://lists.osuosl.org/pipermail/darcs-users/2013-November/026958.html</a></li></ul></li><li>We listed the changes that occurred between version 2.8.4 and the current development branch into a 2.10 release page:<br /> <ul><li><a href="http://darcs.net/Releases/2.10?revision=20131028184855-5ef8f-ba33870773ad9ee010a470ac8536b5c7ae331b50">http://darcs.net/Releases/2.10?revision=20131028184855-5ef8f-ba33870773ad9ee010a470ac8536b5c7ae331b50</a></li></ul></li></ol><h3 id="issues-resolved-8">Issues resolved (8)</h3><dl><dt>issue346 Jose Luis Neder</dt><dd><ul><li>implement "patience diff" from bzr</li><li><a href="http://bugs.darcs.net/issue346">http://bugs.darcs.net/issue346</a></li></ul></dd><dt>issue1828 Guillaume Hoffmann</dt><dd><ul><li>file listing and working --dry-run for mark-conflicts</li><li><a href="http://bugs.darcs.net/issue1828">http://bugs.darcs.net/issue1828</a></li></ul></dd><dt>issue2181 Guillaume Hoffmann</dt><dd><ul><li>put cache in $XDG_CACHE_HOME (~/.cache by default)</li><li><a href="http://bugs.darcs.net/issue2181">http://bugs.darcs.net/issue2181</a></li></ul></dd><dt>issue2309 Owen Stephens</dt><dd><ul><li>annotate includes line numbers</li><li><a href="http://bugs.darcs.net/issue2309">http://bugs.darcs.net/issue2309</a></li></ul></dd><dt>issue2313 Jose Luis Neder</dt><dd><ul><li>whatsnew -l: Stack space overflow</li><li><a href="http://bugs.darcs.net/issue2313">http://bugs.darcs.net/issue2313</a></li></ul></dd><dt>issue2334 Guillaume Hoffmann</dt><dd><ul><li>fix win32 build removing file permission functions</li><li><a href="http://bugs.darcs.net/issue2334">http://bugs.darcs.net/issue2334</a></li></ul></dd><dt>issue2343 Jose Luis Neder</dt><dd><ul><li>darcs amend-record does not record my change</li><li><a href="http://bugs.darcs.net/issue2343">http://bugs.darcs.net/issue2343</a></li></ul></dd><dt>issue2347 Guillaume Hoffmann</dt><dd><ul><li>fix amend-record --prompt-long-comment</li><li><a href="http://bugs.darcs.net/issue2347">http://bugs.darcs.net/issue2347</a></li></ul></dd></dl><h3 id="patches-applied-39">Patches applied (39)</h3><dl></dl>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2013-11-24">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: Darcs News #106tag:blogger.com,1999:blog-819021106854702432.post-16102024461372241502014-06-25T04:58:23+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>Darcs is participating once again to the Google Summer of Code, through the umbrella organization Haskell.org. Deadline for student application is Friday 21st:<br /> <ul><li><a href="http://darcs.net/GSoC">http://darcs.net/GSoC</a></li><li><a href="https://www.google-melange.com/gsoc/document/show/gsoc_program/google/gsoc2014/help_page">https://www.google-melange.com/gsoc/document/show/gsoc_program/google/gsoc2014/help_page</a></li></ul></li><li>It is now possible to donate stock to darcs through the Software Freedom Conservancy organization. Donations by Paypal, Flattr, checks and wire transfer are still possible:<br /> <ul><li><a href="http://lists.osuosl.org/pipermail/darcs-users/2013-December/026977.html">http://lists.osuosl.org/pipermail/darcs-users/2013-December/026977.html</a></li><li><a href="http://darcs.net/Donations">http://darcs.net/Donations</a></li></ul></li><li>Dan Licata wrote a presentation about Darcs as a higher inductive type:<br /> <ul><li><a href="http://lists.osuosl.org/pipermail/darcs-users/2014-January/026985.html">http://lists.osuosl.org/pipermail/darcs-users/2014-January/026985.html</a></li></ul></li><li>Darcs now directly provides import and export commands with Git. This code was adapted from Petr Rockai's darcs-fastconvert, with some changes by Owen Stephen from his Summer of Code project "darcs-bridge":<br /> <ul><li><a href="http://hub.darcs.net/darcs/darcs-screened/patch/20140125154537-5ef8f">http://hub.darcs.net/darcs/darcs-screened/patch/20140125154537-5ef8f</a></li></ul></li></ol><h3 id="issues-resolved-6">Issues resolved (6)</h3><dl><dt>issue642 Jose Luis Neder</dt><dd><ul><li>Automatic detection of file renames</li><li><a href="http://bugs.darcs.net/issue642">http://bugs.darcs.net/issue642</a></li></ul></dd><dt>issue2209 Jose Luis Neder</dt><dd><ul><li>Automatically detect replace</li><li><a href="http://bugs.darcs.net/issue2209">http://bugs.darcs.net/issue2209</a></li></ul></dd><dt>issue2319 Guillaume Hoffmann</dt><dd><ul><li>make changes non-interactive if fed to a pipe</li><li><a href="http://bugs.darcs.net/issue2319">http://bugs.darcs.net/issue2319</a></li></ul></dd><dt>issue2332 Guillaume Hoffmann</dt><dd><ul><li>ignore case of characters in prompt</li><li><a href="http://bugs.darcs.net/issue2332">http://bugs.darcs.net/issue2332</a></li></ul></dd><dt>issue2335 Guillaume Hoffmann</dt><dd><ul><li>one liner when adding tracked files if not verbose</li><li><a href="http://bugs.darcs.net/issue2335">http://bugs.darcs.net/issue2335</a></li></ul></dd><dt>issue2348 Ryan</dt><dd><ul><li>switch to cabal's test framework</li><li><a href="http://bugs.darcs.net/issue2348">http://bugs.darcs.net/issue2348</a></li></ul></dd></dl><h3 id="patches-applied-34">Patches applied (34)</h3><dl></dl>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2014-03-17">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/Darcs News: Darcs News #108tag:blogger.com,1999:blog-819021106854702432.post-56251804019647491822014-06-25T04:57:21+00:00<h3 id="news-and-discussions">News and discussions</h3><ol><li>We have a few updates from the Google Summer of Code projects. Alejandro Gadea about history reordering:<br /> <ul><li><a href="http://alegdarcs.blogspot.com.ar/2014/05/first-week-19-23-may.html">http://alegdarcs.blogspot.com.ar/2014/05/first-week-19-23-may.html</a></li><li><a href="http://alegdarcs.blogspot.com.ar/2014/06/second-week-26-30-may.html">http://alegdarcs.blogspot.com.ar/2014/06/second-week-26-30-may.html</a></li><li><a href="http://alegdarcs.blogspot.com.ar/2014/06/third-week-02-06-june.html">http://alegdarcs.blogspot.com.ar/2014/06/third-week-02-06-june.html</a></li></ul></li><li>Marcio Diaz about the cache system:<br /> <ul><li><a href="http://marcioodiaz.blogspot.com.ar/2014/06/gsoc-progress-report-2-bucketed-global.html">http://marcioodiaz.blogspot.com.ar/2014/06/gsoc-progress-report-2-bucketed-global.html</a></li></ul></li><li>Incremental fast-export is now provided to ease maintenance of git mirrors:<br /> <ul><li><a href="http://hub.darcs.net/darcs/darcs-screened/patch/20140609190214-5ef8f">http://hub.darcs.net/darcs/darcs-screened/patch/20140609190214-5ef8f</a></li></ul></li></ol><h3 id="issues-resolved-8">Issues resolved (8)</h3><dl><dt>issue2244 Ale Gadea</dt><dd><ul><li>darcs tag should warn about duplicate tags</li><li><a href="http://bugs.darcs.net/issue2244">http://bugs.darcs.net/issue2244</a></li></ul></dd><dt>issue2314 Benjamin Franksen</dt><dd><ul><li>output-auto-name in defaults file</li><li><a href="http://bugs.darcs.net/issue2314">http://bugs.darcs.net/issue2314</a></li></ul></dd><dt>issue2361 Ale Gadea</dt><dd><ul><li>optimize --reorder runs forever with one repository</li><li><a href="http://bugs.darcs.net/issue2361">http://bugs.darcs.net/issue2361</a></li></ul></dd><dt>issue2364 Sergei Trofimovich</dt><dd><ul><li>fix file corruption on double fetch</li><li><a href="http://bugs.darcs.net/issue2364">http://bugs.darcs.net/issue2364</a></li></ul></dd><dt>issue2364 Sergei Trofimovich</dt><dd><ul><li>don't break list of 'bad sources'</li><li><a href="http://bugs.darcs.net/issue2364">http://bugs.darcs.net/issue2364</a></li></ul></dd><dt>issue2388 Owen Stephens</dt><dd><ul><li>check if inventories dir has been created</li><li><a href="http://bugs.darcs.net/issue2388">http://bugs.darcs.net/issue2388</a></li></ul></dd><dt>issue2394 Guillaume Hoffmann</dt><dd><ul><li>make optimize a supercommand</li><li><a href="http://bugs.darcs.net/issue2394">http://bugs.darcs.net/issue2394</a></li></ul></dd><dt>issue2396 Guillaume Hoffmann</dt><dd><ul><li>make convert a supercommand and enhance help strings</li><li><a href="http://bugs.darcs.net/issue2396">http://bugs.darcs.net/issue2396</a></li></ul></dd></dl><h3 id="patches-applied-39">Patches applied (39)</h3>See <a href="http://wiki.darcs.net/DarcsWeeklyNews/2014-06-25">darcs wiki entry</a> for details.guillaume (noreply@blogger.com)http://blog.darcs.net/