# planet

## April 29, 2016

### Darcs News

#### darcs 2.12.0 release

April 29, 2016 03:20 PM UTC

The Darcs team is pleased to announce the release of Darcs 2.12.0.

One way of installing Darcs 2.12.0 is with stack:

$stack install darcs-2.12.0 Or first install the Haskell Platform (http://www.haskell.org/platform) and install Darcs with cabal-install:$ cabal update
$cabal install darcs-2.12.0 You can also download the tarball from http://darcs.net/releases/darcs-2.12.0.tar.gz and build it by hand. The 2.12 branch is also available as a darcs repository from http://darcs.net/releases/branch-2.12 ### What's new #### Patch dependency graph export 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: #### whatsnew output and third-party VC frontend support 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 was reintroduced in meld 3.15.2 . #### improvements for Git repository imports 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. #### repository Weak Hashes The command darcs show repo now shows a hash that is the XOR of all hashes of the patches metadata of the repository. Being a XOR, it does not depend on the patches' ordering. Also it is quite fast to calculate. This Weak Hash can be useful to quickly check whether two repositories of a single proyect have the same patches. ## April 15, 2016 ### Darcs News #### Darcs News #113 April 15, 2016 03:02 PM UTC ### News and discussions 1. We will release Darcs 2.12 by the end of this month: 2. On May 6th-8th in Helsinki, a joint sprint Pijul/Darcs is organized: ### Issues resolved (5) issue1807 Guillaume Hoffmann issue2258 Guillaume Hoffmann issue2393 Guillaume Hoffmann issue2486 Ben Franksen issue2494 Ben Franksen ### Patches applied (96) 2016-04-14 Guillaume Hoffmann • move network-related tests to network dir, update command names • resolve issue2393: remove whatsnew functionality from annotate • add log --machine-readable to see patch dependencies non-interactively • help of log 2016-04-01 Ganesh Sittampalam • add some doc comments to RepoType 2016-03-29 Guillaume Hoffmann • merge Repository.Util into Repository.State • use B and BC instead of BS and BSC in Repository.State • fix prelude import in Repository.State • move maybeApplyToTree to Darcs.Patch.Apply • move getRecursiveDarcsRepos to UI.Commands.Optimize • move patchSetfMap to Darcs.Patch.Set • move functions from Repository.Util to Patch.TokenReplace • comment in Repository.Util • refactor similar functions in Darcs.Repository.State • use readUnrecordedFiltered in getReplaces • inline a function in Clone • no longer move index to index.old on mingw32 os • clarify comments in Darcs.Repository.State • hlint Darcs.Repository.State • move External module from Repository to Util • move Compat and Lock modules from Repository to Util • merge Darcs.Repository.Ssh into Darcs.Util.Ssh • remove Darcs.Repository.Read by moving readRepo back to Internal • add comments and remove checks of optimize commands wrt repo formats • make all optimize subcommands require hashed except upgrade • move copySources from HashedRepo to Clone • move Storage.Hashed modules to Darcs.Util • remove unused function from Storage.Hashed.Plain • fix compile error in Storage.Hashed.Test • remove Storage.Hashed.Utils, move functions to Darcs.Utils.ByteString • move index-related functions from Utils to Index • removed unused or redundant functions from Storage.Hashed.Utils • remove unused functions from Storage.Hashed.Hash • hlint Storage.Hashed.Darcs • reuse functions from Darcs.Util.Path • remove unused Storage.Hashed.Packs 2016-03-09 Ben Franksen • revert command: be quiet when requested • accept issue2480: display unicode in patch content • slightly improved chaotic indentations and import lists • refactor: use maybeRestrictSubpaths • refactor: use Darcs.Util.English.capitalize • replace Darcs.Util.Printer.<> with <> from Data.Monoid; restructured haddocks • small code layout fix in whatsnew command • fixed Darcs.Util.English.andClauses and orClauses • two simple refactorings in the conflict resolution code • cleanup in revert command: use debugMessage for debug messages • cleanup: break over-long line in D.R.Merge • accept issue2494: output of darcs record with file arguments • resolve issue2494: output of darcs record with file arguments • refactored some, added readUnrecordedFiltered and maybeRestrictSubpaths • several fixes and refactorings in fixSubPaths and maybeFixSubPaths • add Darcs.Util.Printer.quoted and Darcs.Util.Text.pathlist • added missing hsep function to D.Util.Printer • added missing Eq and Show instances for ScanKnown • added Darcs.Util.Printer.ePutDocLn • add new type IncludeBoring for includeBoring option (was Bool) • announceFiles only if verbosity /= Quiet 2016-03-05 Guillaume Hoffmann • rm hashed-storage changelog • put copyright headers in hashed-storage modules • add Storage/Hashed dir to checkdeps contrib script • merge Storage.Hashed.AnchoredPath into Darcs.Util.Path • explicit exports for Storage.Hashed.Utils • list and comment exports of Storage.Hashed.Darcs and Plain • remove Storage.Hashed • resolve issue2258: improve patch index error message with suggestion • resolve issue1807: clarify help of PAGER, DARCS_PAGER • fix extra-source-file path in darcs.cabal 2016-03-07 Ben Franksen • Darcs.UI.Commands.Unrecord: honor quiet option everywhere • resolve issue2486: obliterate --not-in-remote -q should be more quiet 2016-02-25 Ganesh Sittampalam • print the rebase status even after an error • in runJob, pull repojob out to first-level decision • refactor displaying suspended status a bit • inline repoJobOnRebaseRepo • use helper types to elide more cases in runJob • elide some common cases in runJob • reorder runJob cases by job type • flatten runJob case statements • add a helper type for flags needed for Rebase • lift the runJob debugMessage call outside the case • lift 'therepo' outside the runJob case statement • express the V1/V2 patch type switch via a GADT too • use SRepoType to control the rebase type in runJob • remove commented-out cases for old TreeJob • drop unnecessary constraints • break out a runJob function • drop CarrierType - it can't ever be Rebasing p now • drop RecontextRebase • drop NameHack • inline MaybeInternal module into Named.Wrapped • make the Rebase import qualified • Introduce RebaseP to replace Rebasing type • add 'activecontents' to replace 'patchcontents' for use in conflict resolution • stop Convert using Wrapped.patchcontents • add nullary RepoType • flip dependency between Named.Wrapped and Rebase.Container • add wrapper type around 'Named' See darcs wiki entry for details. ## April 03, 2016 ### Darcs News #### Darcs News #112 April 03, 2016 08:29 PM UTC ### News and discussions 1. 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: 2. The release process of Darcs 2.12 will start when GHC 8 is released: 3. We had two new minor releases of Darcs 2.10, and in spite of being minor, they contain a few interesting changes and optimizations: 4. 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: 5. Finally, Pierre-Étienne Meunier announced a Pijul sprint in may in Finland. Darcs hackers are welcome! ### Issues resolved (7) issue2269 Eric Kow issue2276 Eric Kow issue2400 Ben Franksen issue2459 Ben Franksen issue2479 Ben Franksen issue2481 Ganesh Sittampalam issue2489 Guillaume Hoffmann ### Patches applied (176) 2016-03-26 Sergei Trofimovich • allow zip-archive-0.3 2016-03-22 Guillaume Hoffmann • remove failing-issue1609 from testsuite as property we don't want 2016-03-06 Ben Franksen • move command: fixed punctuation of error messages and added a comment • use bug from impossible.h instead of error • cleanup in Darcs.Patch.Merge: use case instead of fromJust (do return ...) 2016-02-12 Ganesh Sittampalam • Get rid of the need for DummyPatch in Darcs.Patch.Match 2016-03-05 Guillaume Hoffmann • move runHLint.sh to root and update to run outside of testsuite 2016-02-12 Ganesh Sittampalam • drop re-exports from Darcs.Patch.Rebase • abstract out checking whether a Named is internal • add versions of simplifyPush[es] for Suspended • move addFixup to Rebase.Container and give it a clearer name • add Repair instance for Suspended • Ignore the rebase internal patch when showing dependencies • simplify instance ShowPatchBasic (RebaseSelect p) • break out PatchInspect instance for Suspended • rename mkSuspended to mkRebase and make it work on 'Suspended' • use Suspended instead of FL RebaseItem in takeRebase • break out RepairToFL instance for Suspended • break out ReadPatch instance for Suspended • break out Check instance for Suspended • break out Show instances for Suspended • break out Conflict instance for Suspended • break out Effect instance for Suspended • add PrimPatchBase instance for Suspended • break out ShowPatch instance for Suspended • break out Apply instance for Suspended • refactor instance ShowPatch Rebasing a bit • inline a couple of defaults to simplify future refactoring • abstract out an instance ShowPatchBasic Suspended • Introduce a 'Suspended' type to encapsulate 'FL RebaseItem' 2016-03-18 Ben Franksen • skip ssh tests if ssh server is down • made network ssh tests more robust by passing --skip-long-comment • fix ssh network tests so they work in the test harness • skip http network tests when server does not respond • run network tests by default • resolve issue2479: root dir most not be among the sources of a move • accept issue2479: bug descending in modifyTree 2016-03-08 Guillaume Hoffmann • update failing-issue2219 • acknowledge that issue1196 is solved • acknowledge a working case in failing-index-argument.sh • merge HACKING into README.md 2016-02-17 Ganesh Sittampalam • get rid of a couple of trailing newlines 2016-02-05 Guillaume Hoffmann • remove unused executable and testsuite dependencies • comment in cabal file workaround • group all non-optional build-depends • remove unused darcs-test dependencies • comment use of flag REENTRANT • drop definition of HAVE_SIGINFO_H unused since 2009 • hlint Darcs.Util.Diff.Patience • format patch names within 20 characters in dependencies output • show dependencies up to last tag by default • further merge hashed-storage code and tests into darcs code • bump second html dependency • darcs show dependencies • implement function getDeps 2016-01-28 Ganesh Sittampalam • fix git test involving deletions 2016-01-25 Guillaume Hoffmann • handle file moves and copies when importing from git • recommend using -M flag on git fast-export • tests related to git import of file moves • use F and T instead of From and To in whatsnew --machine-readable • bump dependencies lower bounds implied by requiring ghc 7.6 • 2.10.3 changelog 2016-01-29 Ganesh Sittampalam • support transformers-compat 0.5.x 2016-01-25 Guillaume Hoffmann • avoid irrefutable pattern when importing unnamed commit • test for deleting empty directories on git import • delete empty directories on git import • rollback filename dequoting on import since now done during parsing • quoting and escaping of filenames in convert export and import • test for checking filepaths consistency with git • resolve issue2489: dequote filepaths while importing from git 2016-01-28 Ganesh Sittampalam • fix tests that use "git commit" • applyToTree is just a specialisation of applyToState • drop unnecessary constraint • simplify type • drop unused (and never defined) putApplyState • move the ObjectMap related code to the FileUUID patch type • disentangle the state-specific ApplyMonad methods • swap argument order to ApplyMonad/ApplyMonadTrans • Rename Prim.V3 to Prim.FileUUID • move listConflictedFiles out of Conflict class • Get rid of default implementation of conflictedEffect • Add some tests for how conflicts are reported • Drop an unnecessary call to patchcontents in applyAndFix • Drop unnecessary use of patchcontents in hunkmatch and touchmatch 2016-01-16 Guillaume Hoffmann • rename Patch and RealPatch to RepoPatchV1 and RepoPatchV2 in harness • rename Patch and RealPatch to RepoPatchV1 and RepoPatchV2 in darcs code • do not open patches uselessly when no file restriction given • add Darcs.Test.Patch.Selection and one unit test • convert import should be a RepoJob, not a V2Job • replace TaggedPatch by LabelledPatch in a comment • whatsnew --machine-readable help string update on file moves • --machine-readable flag for more parseable whatsnew • fix code inside of a comment 2016-01-16 Ganesh Sittampalam • resolve conflicts between changes to splitters and to hijacking • capture diffAlgorithm in splitters instead of passing it to SelectChanges unconditionally • drop unneeded export • simplify the PatchInspect (Rebasing p) instance • implement hunkMatches for PatchInfoAnd • move Rebasing out into its own module • break RebaseItem out into its own file • bump async dependency • conditionalise a couple of orphan instances • resolve conflict in build-tools removal • drop build-tools restriction • Bump time, HTTP dependencies 2016-01-15 Guillaume Hoffmann • set use-time-1point5 flag default to True to please stack • disable interfering env variable in issue1739 test • rename README to README.md to get it properly rendered 2016-01-15 Ganesh Sittampalam • resolve conflict between binary version bump and containers dep • bump binary, transformers and tar upper bounds 2016-01-14 Guillaume Hoffmann • make commit an alias for record • implement repoXor and show it in "show repo" output as "Weak Hash" 2015-12-28 Ganesh Sittampalam • Portability fix - #type nl_item isn't always Int32 • add test that lost deps during rebase are reported on • remove unused fmapPIAP 2015-12-22 Guillaume Hoffmann • fix repo upgrade help string 2015-12-02 Ganesh Sittampalam • resolve issue2481: expose API for 'darcs diff' command 2015-11-20 Guillaume Hoffmann • remove a flag needed only for GHC < 7 • remove -fno-warn-dodgy-imports from modules that were still using it • no longer hide catch from Prelude since we require ghc>=7.6 • acknowledge -fno-warn-dodgy-imports is always needed • merge Darcs.Patch.ConflictMarking into Darcs.Patch.Conflict 2015-11-29 Ganesh Sittampalam • bump dependencies on vector, process, HUnit • force grep to treat output of locale as text 2015-11-20 Guillaume Hoffmann • Rename Darcs.Repository.LowLevel to Darcs.Repository.Pending 2012-08-09 Eric Kow • Haddock the pending patch parts of Darcs.Repository.State. • Make Darcs.Repository.isSimple apply over a whole list. 2015-11-09 Guillaume Hoffmann • rename NEWS to CHANGELOG to please hackagedb • fix release date of 2.10.2 • update NEWS for 2.10.1 and 2.10.2 • fix two tests after stopping using the word changes in pull message • shorter README with quickstart instructions 2015-11-06 Ganesh Sittampalam • add comments about the rejected 'hasDuplicate' cases • "Fix" some intermittent QuickCheck failures • disambiguate imports in some test code • Add an option to control the number of QuickCheck iterations • make test-framework imports explicit 2015-11-05 Guillaume Hoffmann • refactor breakAfterNthNewline and breakBeforeNthNewline • refactor clone code • download patches pack asynchronously • ignore meta- files in packs when cloning • comment in doOptimizeHTTP 2015-06-28 Ben Franksen • remove race from D.R.Packs, further simplify the code 2015-10-31 Guillaume Hoffmann • replace changes by log in release.sh • remove darcs.spec.in file from 2008 • replace changes by log in Setup.lhs • update upload.cgi with new command names • update buildbot-try.sh with new command names • update cygwin-wrapper file with new commands names and flags • remove annotate xml schema no longer needed • remove patch index correctness and timing scripts from contrib • adapt tests to using patches word instead of changes • update commands names in help strings 2015-10-28 Ganesh Sittampalam • split issue1932 test up into a network and non-network part • Avoid subshells in amend-unrecord test • disable issue2086 test on Windows - umasks don't really work there • using mmap on Windows was causing test failures • warn when suspending "hijacked" patches in rebase pull and apply • be a bit clearer about patch names in hijack test 2015-09-20 Eric Kow • resolve issue2269: push hijack test to suspend time • resolve issue2276: Keep track of patch hijack decisions • Generalise hijack warning to support use in other commands • Helper to capitalize a sentence 2015-06-24 Ben Franksen • resolve issue2459: fall back to writing the file if createLink fails • resolve issue2400: use async package to keep track of unpack threads • removed special handling of --to-match from cloneRepository 2015-10-16 Guillaume Hoffmann • remove redundant import 2015-10-15 Ganesh Sittampalam • drop sandi lower bound to support GHC 7.4 and add an upper bound 2015-10-03 Daniil Frumin • Switch from dataenc (deprecated) to sandi 2015-10-09 Guillaume Hoffmann • replace changes by log in two help strings 2015-09-18 Eric Kow • Refactor darcs send patch count text snippet • Tidy darcs send msg code (shorter lines) • Fix typo in darcs send message 2015-09-19 Guillaume Hoffmann • make patch selection lazier in presence of matchers • get rid of selectChanges • inline patchSetToPatches in the only place where it is used See darcs wiki entry for details. ## January 18, 2016 ### Darcs News #### darcs hacking sprint 10 report January 18, 2016 04:57 PM UTC Last weekend we had our tenth Darcs sprint, and our first one in Spain. This time indeed, the sprint was organised in the University of Seville, ETSII (Technical Superior School of Informatics Engineering), on January 15th to 17th. We were 3 participants: Florent Becker, Guillaume Hoffmann and Ganesh Sittampalam. We also had Pierre-Étienne Meunier on video call and Simon Michael on IRC. #### Darcs and Pijul integration One major topic during the whole sprint was the possible integration of Darcs with Pijul. Pijul 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 announced its first release last October. 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. We had many conversations with Florent to understand the internals of Pijul and how it manages patches. 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). 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.  Ganesh and Florent with Pierre-Étienne on video call #### Renaming Patch/RealPatch to RepoPatchV1/RepoPatchV2 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 patch to rename these types into something less confusing: RepoPatchV1 and RepoPatchV2. #### Interactive selection performance and refactoring Even if we wrote a patch that improved greatly performance during the last sprint (and we now have a unit test for it), 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. #### User manual and developer handbook 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. #### Darcs on Stackage 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 was added to stackage for easier building. #### Cleanup, fixes and refactorings Ganesh tracked down bugs in rebase and sent a few cleanup patches. 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. #### What happens next 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. This year we hope to have another sprint, and to have more developers participating. Please consult the How to Help, Developer's Getting Started and Projects page on the wiki to get involved!  Ganesh, Florent and Guillaume ## September 24, 2015 ### Darcs News #### darcs hacking sprint 9 report September 24, 2015 03:35 PM UTC After a one year and a half absence, the Darcs Hacking Sprint returned! Once again, the event occurred at the IRILL (Innovation and Research Initiative for Free Software) in Paris, on September 18th to 20th. The sprint had 7 participants: Danill Frumin, Eric Kow, Florent Becker, Ganesh Sittampalam, Guillaume Hoffmann, Thomas Miedema and Vinh Dang. #### Darcs and GHC 8 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 GHC 8 that got triggered by Darcs: a bug with the PatternSynonyms extension. Fortunately it seems that the bug will be fixed in GHC HEAD. (First release candidate is planned for December).  Thomas explaining PatternSynonyms to Eric and Ganesh #### Diving into SelectChanges and PatchChoices code On the first day I (Guillaume) claimed the "rollback takes ages" bug, 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, which I could fix easily. Internally, there are two interesting patch types when it comes to matching: • NamedPatch: represent the contents of a patch file in _darcs/patches, that is, its info and its contents • 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. 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, 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. 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.  Eric, Guillaume and Vinh Now, the real source of the "rollback -p ." slowness is that patch selection is done on FL's (Forward List), 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. #### Ganesh's new not-yet-officially-named stash command 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. The sprinters (IRL and on IRC) discussed 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 :-) 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. #### Dan's den  Dan demonstrating den (on the left: Florent) Daniil Frumin was this years Google Summer of Code student for Darcs. Mentored by Ganesh, he brought improvements to Darcsden, many of them being already deployed. Among them, it is possible to launch a local instance of Darcsden (using an executable called den), not unlike Mercurial's "serve" command. Dan tells more about his work and this sprint in his latest blog post. #### A better website and documentation 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! #### Florent's projects For this sprint, Florent was more an external visitor than a Darcs hacker. He talked about one of his current projects: Pijul, a version control system with another approach. Check out their website! #### Conclusion and the next sprint 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.  Avenue d'Italie, Paris We would like to thank the IRILL people for hosting the sprint for the third time and our generous donators to make travelling to sprints easier. We already have a time and a place for the next sprint: Sevilla, Spain in January 2016! The exact moment will be announced later, but you can already start organizing yourself and tell us if you're going.  Thomas, Eric and Ganesh  From left to right: Vinh, Florent, Dan, Ganesh and Eric ### Dan Frumin #### Darcsden improvements and Darcs sprint September 24, 2015 01:06 PM UTC This post is intended to be a short summary of my SoC project, as well as my recent trip to Darcs sprint. ## Introduction I am finishing up this post on the train back from the Autumn 2015 Darcs sprint. 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 • 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 DataKinds are used in the darcs codebase; • Florent Becker gave a presentation about Pijul and the theory behind it — A Categorical Theory of Patches by Samuel Mimram and Cinzia Di Giusto, see arXiv:1311.3903; • Vinh Dang talked about his improvements on the darcs wiki (it’s about time to organize the website), his goal was to make it more accessible to the newcomers; • Yours truly gave a small presentation, outline of which you will find below: ## Looking back I have spent this summer hacking on DarcsDen as part of the Google Summer of Code program. 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. 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 den for a quick way of browsing the repositories. 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 cabal install darcsden or brew install darcsden. As for now, one could do the following: 1. darcs get --lazy http://hub.darcs.net/co-dan/darcsden-local 2. cabal install . or stack install This should install the darcsden binary and all the related css/js files. You can start darcsden by running darcsden --local. If you open your web browser you should see a list of repositories in the current directory. 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 ~/.darcs directory. You can manage that list either by hand, or using the command-line den tool: • den$PATH — add $PATH to the list of repositories in ~/.darcs/darcsden_repos (if it’s not already present there), start darcsden server in the background and launch the browser pointing to$PATH;
• den — the same as den .;
• den --add $PATH — add$PATH to the list of repositories in ~/.darcs/darcsden_repos;
• den --remove $PATH — remove$PATH from the list of repositories in ~/.darcs/darcsden_repos.

In order to further customize darcsden, one can tweak the configuration file located at ~/.darcs/darcsden.conf. Apart from the usual darcsden settings one may pay attention to the following variables:

• homeDir (default .), points to the "root" directory with repositories. If the list file ~/.darcs/darcsden_repos is not present darcsden will recursively search repositories in that directory
• unLocal, pwLocal: the username and the password of the "local" user

The user/password credentials are required for editing the repositories and recording new patches. However, the den binary should automatically pick them up from the config file and log you in.

Once you are logged in, and you have unrecorded changes in the repository, you can use darcsden UI to record a new patch.

Below you can see an example of recording and merging patches from a branch.

Darsden allows you to create forks/branches of your repositories, and it keeps track of the patch dependencies in your branches.

More "internal" changes:

• 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
• The flag actually choose what are called instances — something that a bit less fine-grained than settings. Instances allow you to pick backend, overwrite settings, modify the looks of the front page.
• HTTP-testing using wreq. The previous test suite used selenium and it got bit-rotten. The wreq-based is easier to run and perhaps slightly easier to maintain.
• HTTP auth, which is used as part of the local instance; the den tool utilizes it to log the user in automatically.
• Support for repositories inside directories and nested repositories.
• All the backend code that is used for handling repositories and meta-data on the file system.
• Assorted mini-fixes

## What now?

During the sprint I hacked together some code for viewing suspended patches along the regular ones. The next step would be to have a similar interface for managing the suspended patches.

We have also discussed the possibility of adding rewrite rules implementing short-cut fusion for the directed types 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!).

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, très bien. The next darcs sprint will probably be in January, and probably in Europe, again.

## September 20, 2015

### Dan Frumin

#### Darcs internals, part 1: typesafe directed datastructures

September 20, 2015 10:22 AM UTC

I am editing this post from IRILL, where the darcs sprint is taking place

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.

In this post I would like to discuss the representation of patches and the use of type witnesses in darcs.

# A word about patches and contexts

This post is intended for people interested in patch theory and its implementation in darcs. A passing familiarity with patches, contexts, inverses, etc is useful, but not required, as we restate some basic definitions in this section.

A primitive patch 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:

• Removing a file from the repository
• Adding file to the repository
• Changing a line n in a file in the repository
• Identity patch, i.e. an empty/non-existing change that does not modify the state of the repository at all

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 before the change was made, and of the post-context as the full state of the repository after the change was applied. We write (x)-A->(y) for a patch A with a pre-context x and a post-context y.

If a primitive patch A has a pre-context a, a post-context o, and a primitive patch B has a pre-context o, a post-context b, then we can combine two patches to obtain a sequential patch AB with the pre-context a and the post-context b.

Every primitive patch (x)-A->(y) has an inverse (y)-A^{-1}->(x), such that (x)-A->(y)-A^{-1}->(x) is equivalent to the identity patch (x)-1->(x).

In the next sections we will see how those things are implemented in darcs.

# Primitive patches and witnesses

A primitive patch, which constitutes a single fine grained change, can be represented as a (G)ADT:

data Prim where
Move :: FileName -> FileName -> Prim
RmFile :: FileName -> Prim
Hunk :: FileName -> Int -> ByteString -> ByteString -> Prim
RmDir :: FileName -> Prim
…

We can represent complex patches as sequences of primitive patches:

data Patch where
NilP :: Patch
PrimP :: Prim -> Patch
SeqP :: Patch -> Patch -> Patch

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.

data Prim x y where
Move :: FileName -> FileName -> Prim x y
RmFile :: FileName -> Prim x y
AddFile :: FileName -> Prim x y
Hunk :: FileName -> Int -> ByteString -> ByteString -> Prim x y
RmDir :: FileName -> Prim x y
…

data Patch x y where
NilP :: Patch x x
PrimP :: Prim x y -> Patch x y
SeqP :: Patch x y -> Patch y z -> Patch x z

We call the types with witnesses representing pre- and post-contexts directed types. Intuitively, the directed type D x y has a “direction” from x to y, written as (x)->(y). The Prim datatype looks pretty much like the type actually used in Darcs. The Patch datatype, however, is completely artificial. We will see in the next sections how Darcs really models complex patches.

# Directed programming

## FL & RL

Two particularly useful directed types used in darcs are directed lists: forwards lists of the type FL a x y and reverse lists RL a x y. Forward lists “go” from the head to the tail; reverse lists “go” from the tail to the head. The lists are polymorphic over a just like regular lists.

data FL a x y where
NilFL :: FL a x x    {- The empty list stays at (x) -}
(:>:) :: a x y -> FL a y z -> FL a x z
infixr 5 :>:

For myself, I visualise forward lists like this:

(x) —a—> (y) —b—> (z) ——Nil——> (z)
a :: Patch x y
b :: Patch y z
(a :>: b :>: NilFL) :: FL Patch x z

The reverse lists are “going” from tail to head1

data RL a x y where
NilRL :: RL a x x
(:<:) :: RL a x y -> a y z -> RL a x z
infixl 5 :<:

(Mnemonically, the the head is always “greater” than the tail)

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 = Move "foo" "bar"

-- [[(x) --Nil--> (x) -p-> (y)] -id-> (y)] -p^{-1}-> (x)
example :: RL Patch x x
example = NilRL :<: p :<: Identity :<: inverse p

-- (x) -p-> [(y) -p^{-1}-> (x) --Nil--> (x)]
example2 :: FL Patch x x
example2 = p :>: inverse p :>: NilFL

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).

We can reassociate the lists easily, and verify that the two representations are isomoprhic:2

reverseRL :: RL a wX wY -> 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 -> RL a wX wZ -> FL a wX wY
r a NilRL = a
r a (xs :<: x) = r (x :>: a) xs

For example,

-- [[(x) --Nil--> (x) -p-> (y1)] -q-> (y2)] -r-> (z)

Turns into

-- (x) -p-> [(y1) -q-> (y2) -r-> [(z) --Nil--> (z)]]

Exercise: write a function reverseFL :: FL a wX wY -> RL a wX wY

We can write a lot of directed analogues of familiar list functions. For example, here is a directed append:

infixl 5 +<+
(+<+) :: RL a wX wY -> RL a wY wZ -> RL a wX wZ
xs +<+ NilRL = xs
xs +<+ (ys :<: y) = (xs +<+ ys) :<: y

Exercise: write directed append for forward lists: (+>+) :: FL a wX wY -> FL a wY wZ -> FL a wX wZ

### Type witnesses

So we wrote a bunch of standard list functions for directed lists; what about some of the other functions? Can we, for example, implement filter for directed lists. Can it look like filterFL :: (a wX wY -> Bool) -> FL a wX wY? Well, we can try writing

filterFL :: (a wX wY -> Bool) -> FL a wX wY
filterFL p NilFL = NilFL
filterFL p (x :>: xs) | p x = filterFL p xs
| otherwise = x :>: filterFL p xs

However, under closer scrutiny we realize that it does not typecheck! In the second clause of filterFL we have the following information:

x :: a x y, xs :: FL a y z
filterFL xs :: FL a y z

Thus, in the first case (in which p x holds) we try to return something of the type FL a wY wZ, when FL a wX wZ was expected. It is clear that generally we can do this only if x :: a wX wX, i.e. wY = wX. But a simple predicate of the type p :: a wX wZ -> Bool won’t tell us anything about that. We need an additional type witness in our system telling us that if p x holds, then x :: a wX wX. For that purpose we introdue the EqCheck datatype.

data EqCheck wX wY where
IsEq :: EqCheck wX wX
NotEq :: EqCheck wX wY

then the type of a predicate would be

type Pred a = forall wX wY. a wX wY -> EqCheck wX wY

If (p x) = IsEq, then the typechecker will know that x :: a wX wX. We can then finally write

filterFL :: Pred a -> FL a wX wY -> FL a wX wY
filterFL p NilFL = NilFL
filterFL p (x :>: xs) | IsEq <- p x = filterFL p xs
| otherwise   = x :>: filterFL p xs

EqCheck is used this way in the darcs source code to e.g., filter our internal patches. Sometimes darcs stores information — like suspended patches — in the so called internal patches. Every patch type implements the internal patch checker (code slightly adapted):

-- |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 -> EqCheck wX wY)
patchInternalChecker = Nothing

When the user runs darcs tag 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 tag command uses the following function (slightly adapted):

filterNonInternal :: MaybeInternal p => PatchSet p wX wY -> PatchSet p wX wY
filterNonInternal =
case patchInternalChecker of
Nothing -> id
Just f -> \l -> PatchSet (filterRL (f . patchcontents . hopefully) (unPatchSet l))

where a PatchSet is the list of PatchInfoAnd patches — patches together with the meta-information.

It is worth noting that EqCheck x y is isomorphic Maybe (x :~: y), but the propositional equality datatype has only been added to base since 4.7.0.0. In the future versions darcs will probably switch to using Data.Type.Equality.

# Conclusion

We’ve briefly touched upon patch representation in darcs and talked about directed types and directed programming.

A good if a bit outdated reference is Jason Dagit’s master thesis (specifically the bits from chapter 4). The wiki is currently lacking in material, but I hope to improve the situation eventually.

Next time we will probably discuss either directed pairs and their use in darcs, or sealed datatypes, or both.

1. Essentially, a reverse list is a directed version of a snoc-list.

2. 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.

## September 01, 2015

### Darcs News

#### Darcs News #111

September 01, 2015 10:26 PM UTC

### News and discussions

1. The next Darcs Sprint will take place in Paris on September 18-20th. Please add yourself to the wiki page if you're going!
2. Darcs 2.10.1 has been released (bugfixes, dependency versions bump):

### Issues resolved (19)

issue2102 Guillaume Hoffmann
issue2307 Daniil Frumin
issue2308 Ben Franksen
issue2327 Alain91
issue2420 Ben Franksen
issue2421 Guillaume Hoffmann
issue2423 Alain91
issue2433 Guillaume Hoffmann
issue2438 Guillaume Hoffmann
issue2444 Ben Franksen
issue2446 Guillaume Hoffmann
issue2447 Ben Franksen
issue2448 Gian Piero Carrubba
issue2449 Ganesh Sittampalam
issue2451 Ben Franksen
issue2457 Ben Franksen
issue2461 Ben Franksen
issue2461 Ben Franksen
issue2463 Joachim Breitner

### Patches applied (145)

See darcs wiki entry for details.

## July 28, 2015

### Dan Frumin

#### Darcs rebase by example

July 28, 2015 10:40 AM UTC

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 darcs rebase comes in handy. To put it in the words of the implementor “Rebase is a workaround for cases where commutation doesn’t do enough”.

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 patch1 if you have unrecorded changes in the repository. In light of this, I suggest recording a temporary patch with current changes

darcs record -am DRAFT

You can suspend that patch at the beginning of your rebase process and apply it at the end.

# General overview of rebase

darcs rebase 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 rebase to work is the fact that since darcs 2.10 patches can be suspended. When one performs any of the darcs rebase 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 suspended patches. Suspended patches are not active in the repository — that is, they are not applied.

Let’s go over the rebase subcommands

## rebase log/rebase changes

This is simple: list the suspended patches

## rebase suspend

Moves selected patches into the suspended state. Once the patch is suspended it is no longer active in the repository.

Note: once you suspend a patch, it changes its identity. That means that even if you suspend a patch and unsuspend it immediately, you will 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.

> cat file
test
123
> darcs rebase suspend
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
> darcs rebase log
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
> cat file
test

## rebase unsuspend

Does the opposite of suspend: applies a suspended patch to the repository and changes its state to normal.

> darcs rebase unsuspend
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!

## rebase apply

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 local 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.

## rebase pull

Sort of like rebase apply, but instead of a patch bundle it obtains the patches from a remote repository.

Specifically, rebase pull applies all the remote patches, one-by-one, suspending any local patches that conflict. We will see more of rebase pull in the second example.

# Example 1: suspending local changes

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.

The contents of the configuration file after patch A:

port = 6667
host = irc.freenode.net
password = awesomevcs 

Patch B, diff:

@@ -1,3 +1,4 @@
-port = 6667
+port = 6697
+usessl = True
host = irc.freenode.net
password = awesomevcs

You cannot just amend patch A, because the patch B depends on A:

> 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.

What we will have to do is temporarily suspend patch B, amend patch A, and then unsuspend B.

> 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

At this point, the state of our repository is the following: there is one (active) patch A, and one suspended patch B.

> 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
> darcs changes -a
patch 21f56dfb425e4c49787bae5db4f8869e96787fb2
Author: Daniil Frumin
Date:   Tue Jul 21 13:28:49 MSK 2015
* A

Rebase in progress: 1 suspended patches
> cat config
port = 6667
host = irc.freenode.net
> $EDITOR config # remove the password bit > 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 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) > 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! And that’s done! > cat config port = 6697 usessl = True host = irc.freenode.net 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. # Example 2: developing against a changing upstream – rebase pull 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.  S / \ / \ L1 U1 Note: if you run darcs rebase pull 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’. The way to solve this would be to first do darcs rebase pull, 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. Consider a concrete example with two repositories rep1 and rep1_0. rep1_0 > 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 > 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 > cd ../rep1 rep1 > 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 > 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 The patch commit2 from rep1_0 conflicts with commit2’ from rep1. rep1 > 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 Now we have one patch — commit2’ — in the suspended state. We want to resolve the conflict by amending commit2’. We will do that by unsuspending it and manually editing out the conflicting lines. This will also make it depend on commit2. rep1 > 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 > cat dir1/file2 v v v v v v v ============= double whatsup ************* touch file2 ^ ^ ^ ^ ^ ^ ^ rep1 >$EDITOR dir1/file2
rep1 > 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 > darcs mark-conflicts
No conflicts to mark.

Another repository saved from conflicting patches, yay!

1. See this discussion for details

## July 12, 2015

### Dan Frumin

#### Darcs 2.10.1 (Mac OSX build)

July 12, 2015 06:13 PM UTC

Darcs 2.10.1 has been released!

Citing the official release notes

> The darcs team is pleased to announce the release of darcs 2.10.1 !
> ..
>
> # What's new in 2.10.1 (since 2.10.0) #
>
> - generalized doFastZip for darcsden support
> - support terminfo 0.4, network 2.6, zlib 0.6, quickcheck 2.8 and
> attoparsec 0.13
> - errorDoc now prints a stack trace (if profiling was enabled) (Ben Franksen)
> - beautified error messages for command line and default files (Ben Franksen)
> - fixed the following bugs:
>       - issue2449: test harness/shelly: need to handle
> mis-encoded/binary data (Ganesh Sittampalam)
>       - issue2423: diff only respecting --diff-command when a diff.exe
> is present (Alain91)
>       - issue2447: get contents of deleted file (Ben Franksen)
> 'darcs help markdown' (Dan Frumin)
>       - issue2461: darcs log --repo=remoterepo creates and populates
> _darcs (Ben Franksen)
>       - issue2459: cloning remote repo fails to use packs if cache is
> on a different partition (Ben Franksen)
>
> # Feedback #
>
> If you have an issue with darcs 2.10.0, you can report it on
> http://bugs.darcs.net/ . You can also report bugs by email to
> bugs at darcs.net, or come to #darcs on irc.freenode.net.


I’ve updated Mac OS to version 2.10.1. You can install it with

brew install http://darcs.covariant.me/darcs.rb

## July 11, 2015

### Dan Frumin

#### HTTP Basic auth in Snap

July 11, 2015 09:27 AM UTC

Recently, I’ve implemented HTTP Basic auth for darcsden and wrote a simple wreq test for it. In this post I would like to outline the main technical details.

# Server side

## Transient storage

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 DarcsDen.Backend.Transient, but if we abstract away from the details we have a Session datatype. Authorization and authentication information is handled by sessions using functions setUser :: (BTIO bt) => Maybe User -> Session -> Snap Session, notice :: (BTIO bt) => String -> Session -> Snap () (display a message to the user) and others. The BTIO bt part is just a synonym for

type BTIO bt = (BackendTransient bt, ?backendTransient :: bt, MonadIO (BackendTransientM bt))

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.

## Running sessions

If we have a piece of Snap code that we want to “sessionify” we use the following interface:

withSession :: (BTIO bt) => (Session -> Snap ()) -> Snap ()

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.

If we have a page of a type Session -> Snap (), we might want to give user an option to do HTTP authentication on that page. We introduce another function

withBasicAuth :: (BP bp, BTIO bt)
=> (Session -> Snap ())
-> (Session -> Snap ())
withBasicAuth act s = do
rq  do
rawHeader <- maybe throwChallenge return $getHeader “Authorization” rq let (Just (usr,pw)) = getCredentials rawHeader c errorPage “Unknown user” Just u -> if checkPassword (fromBS pw) u then doLogin (fromBS usr) else errorPage “Bad password” _ -> act s 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. throwChallenge :: Snap a throwChallenge = do modifyResponse$ (setResponseStatus 401 “Unauthorized”) .
getResponse >>= finishWith

If the response header is present, it is of a form Basic x, where x is a base64 encoded string user:password. We can extract the credentials from the header like this:

import qualified Data.ByteString          as B
import qualified Data.ByteString.Base64   as B
…
getCredentials :: B.ByteString  — ^ Header
then fmap extract (hush (B.decode (B.drop 6 header)))
else Nothing
where
extract cred = case (B.breakByte (c2w ‘:’) cred) of
(usr, pw) -> (usr, safeTail pw)

# On the client

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.

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:

getSafeOpts :: Options -> String -> 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

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:

getWithAuth :: (String, String) -> String -> IO (Either Status (Response ByteString))
getWithAuth (username,pw) url = getSafeOpts opts url
where
opts = defaults & auth ?~ basicAuth (toBS username) (toBS pw)
& param “login” .~ [“true”]

In that snippet we use lenses to set up an auth header and an HTTP parameter (?login=true).

Finally, after obtaining a Response ByteString, we can parse it with taggy-lens:

parsed :: Fold (Response L.ByteString) Text.Taggy.Node
parsed = responseBody
. to (decodeUtf8With lenientDecode)
. html

We can then play with it in GHCi

*Main> 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”),…

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

logoutButton :: HasElement e => Fold e Text
logoutButton = allAttributed (ix “class” . only “logout”)
. allNamed (only “a”)
. contents

logoutButton searches for <div class=“logout”> and returns the text in the link inside the div. There might be many such links inside the node, hence we use a fold.

*Main> r ^.. parsed . logoutButton
[“log out”]

In this case, since we only care if such link is present, we can use a preview

*Main> r ^? parsed . logoutButton
Just “log out”

# Conclusion

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 wiki.

## July 09, 2015

### Darcs News

#### darcs 2.10.1 release

July 09, 2015 05:10 PM UTC

Hi all,

The darcs team is pleased to announce the release of darcs 2.10.1 !

The easiest way to install darcs 2.10.1 from source is by first installing the Haskell Platform (http://www.haskell.org/platform). If you have installed the Haskell Platform or cabal-install, you can install this release by doing:

$cabal update$ cabal install darcs-2.10.1

Alternatively, you can download the tarball from http://darcs.net/releases/darcs-2.10.1.tar.gz and build it by hand as explained in the README file.

The 2.10 branch is also available as a darcs repository from http://darcs.net/releases/branch-2.10

## What's new in darcs 2.10.1 (since darcs 2.10.0)

• support terminfo 0.4, network 2.6, zlib 0.6, quickcheck 2.8 and attoparsec 0.13
• errorDoc now prints a stack trace (if profiling was enabled) (Ben Franksen)
• beautified error messages for command line and default files (Ben Franksen)
• generalized doFastZip for darcsden support
• fixed the following bugs:
• issue2449: test harness/shelly: need to handle mis-encoded/binary data (Ganesh Sittampalam)
• issue2423: diff only respecting --diff-command when a diff.exe is present (Alain91)
• issue2447: get contents of deleted file (Ben Franksen)
• issue2307: add information about 'darcs help manpage' and 'darcs help markdown' (Dan Frumin)
• issue2461: darcs log --repo=remoterepo creates and populates _darcs (Ben Franksen)
• issue2459: cloning remote repo fails to use packs if cache is on a different partition (Ben Franksen)

## Feedback

If you have an issue with darcs 2.10.1, you can report it on http://bugs.darcs.net/ . You can also report bugs by email to bugs@darcs.net, or come to #darcs on irc.freenode.net.

## June 22, 2015

### Dan Frumin

#### Darcs binaries for OSX with Homebrew

June 22, 2015 12:33 PM UTC

Recently I’ve updated my Darcs homebrew build to Darcs 2.10. You can install it with

brew install http://darcs.covariant.me/darcs.rb

The formula contains a context (--exact-version) and it is a static binary.

## May 13, 2015

### Dan Frumin

#### Hoogle inside the sandbox

May 13, 2015 09:54 PM UTC

# Introduction

This is my first post from the (hopefuly fruitful!) series of blog posts as part of my Haskell SoC 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 my DarcsHub.

This particular post will be about my working environment.

# The problem

Hoogle 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 local copy.

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 without using sandboxing.

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.

# Using hoogle inside a Cabal sandbox

The presumed setup: a user is working on a package X using the cabal sandboxes. The source code is located in the directory X and the path to the cabal sandbox is X/.cabal-sandbox.

Step 1: Install hoogle inside the sandbox. This is simply a matter of running cabal install hoogle inside X. If you want to have a standard database alongside the database for your packages in development, now is the time to do .cabal-sandbox/bin/hoogle data.

Step 2: Generate haddocks for the packages Y,Z you want to use with hoogle. In my case, I wanted to generate haddocks for darcs and darcsden. This is just a matter of running cabal haddock --hoogle in the correct directory.

Step 3: Convert haddocks to .hoo files. Run the following commands in X/:

.cabal-sandbox/bin/hoogle convert /path/to/packageY/dist/doc/html/*/*.txt

You should see something like

Converting /path/to/packageY/dist/doc/html/Y/Y.txt
Converting Y... done

after which the file Y.hoo appears in /path/to/packageY/dist/doc/html/Y/

Step 4: Moving and combining databases. The hoogle database should be stored in .cabal-sandbox/share/*/hoogle-*/databases. Create such directory, if it’s not present already. Then copy the ‘default’ database to that folder:

cp .cabal-sandbox/hoogle/databases/default.hoo .cabal-sandbox/share/*/hoogle-*/databases

Finally, you can combine your Y.hoo with the default database.

.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

And you are done! You can test your installation

$.cabal-sandbox/bin/hoogle rOwner DarcsDen.State.Repo rOwner :: Simple Lens (Repository bp) String For additional usability, consider adding .cabal-sandbox/bin to your$PATH.

## April 20, 2015

### Simon Michael

#### ssh, Darcs Hub vulnerability

April 20, 2015 11:10 PM UTC

I recently learned of a serious undocumented vulnerability in the ssh package. This is a minimal ssh server implementation used by darcsden 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.

darcsden is of course the basis for Darcs Hub. Here’s the announcement I sent to users there a few days ago, with more details.

Hello darcs hub users,

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.

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 joyful.com.

This email is to announce a recently patched security vulnerability in darcs hub’s SSH server.

Timeline:

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.

3/21-: I discuss the issue with a small number of core darcs developers and the ssh author.

3/25: A preliminary fix is deployed. We believe this closed the vulnerability.

4/6: A more comprehensive and tested fix is deployed.

4/15: This announcement is sent to current darcs hub users with valid email addresses (714 of 765 users).

4/20: Public disclosure via blog, haskell mail lists and the issue tracker (darcsden #130).

Impact and current status:

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.

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.

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).

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).

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.

Future plans:

• Public announcement on 4/20

• I’ll add a security section to the darcs hub FAQ

• Ganesh has stepped up to be maintainer of the ssh package, and will make a new release soon

• I’ll do a darcsden release not too long after that

• 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.

Also:

Some logistical things to be aware of:

• this announcement has been sent via MailChimp, and as yet there’s no automatic integration between MailChimp and your settings on hub.darcs.net.

• remember that darcs hub’s issue tracker is here, and that it does not yet send email notifications - to see replies to an issue, you must visit the issue page.

• darcs hub’s password recovery emails may not always reach you - if you’re experiencing this, please contribute to #123.

Needless to say, I regret the vulnerability and am pleased to have it closed. Of course we are not alone, eg github had their own incident. 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.

## April 19, 2015

### Darcs News

#### darcs 2.10.0 release

April 19, 2015 10:01 PM UTC

Hi all,

The darcs team is pleased to announce the release of darcs 2.10.0.

The easiest way to install darcs 2.10.0 from source is by first installing the Haskell Platform (http://www.haskell.org/platform). If you have installed the Haskell Platform or cabal-install, you can install this release by doing:

$cabal update$ cabal install darcs-2.10.0

Alternatively, you can download the tarball from http://darcs.net/releases/darcs-2.10.0.tar.gz and build it by hand as explained in the README file.

The 2.10 branch is also available as a darcs repository from http://darcs.net/releases/branch-2.10

## Feedback

If you have an issue with darcs 2.10.0, you can report it via the web on http://bugs.darcs.net/ . You can also report bugs by email to bugs at darcs.net, or come to #darcs on irc.freenode.net.

# What's new since darcs 2.8.5

## New features

• darcs rebase: enable deep amending of history (Ganesh Sittampalam)
• darcs pull --reorder: keep local-only patches on top of mainstream patches (Ale Gadea, Ganesh Sittampalam)
• darcs dist --zip: generate a zip archive from a repository (Guillaume Hoffmann)
• patch bundle contexts are minimized by default. Enables bundles to be applied to more repositories. (Guillaume Hoffmann)
• darcs convert export/import for conversion to/from VCSes supporting the fast-export protocol (Petr Rockai, Owen Stephens, Guillaume Hoffmann, Lele Gaifax, Ben Franksen)
• darcs test --backoff: exponential backoff test strategy, faster than bisect on big repositories (Michael Hendricks)
• work normally on sshfs-mounted repositories (Nathaniel Filardo)
• automatic detection of file/directory moves, and of token replaces (Jose Neder)
• patience diff algorithm by default (Jose Neder)
• interactive mode for whatsnew (Dan Frumin)
• tag --ask-deps to create tags that may not include some patches (Ganesh Sittampalam)

## User Interface

• add a last question after all patches have been selected to confirm the whole selection (Florent Becker)
• command names:
• clone is the new name of get and put
• log is the new name of changes
• amend is the new name of amend-record
• show output of log into a pager by default (Guillaume Hoffmann)
• the output of log is more similar to git's:
• show patch hash in UI (hash of the patch's metadata)
• put author and date on separate lines (Guillaume Hoffmann)
• enable to match on patch hash prefix with -h and --hash (Guillaume Hoffmann, Gian Piero Carrubba)
• better messages:
• better error messages for http and ssh errors (Ernesto Rodriguez)
• init, add, remove, move and replace print confirmation messages (Guillaume Hoffmann)
• rollback only happens in the working copy (Florent Becker, Guillaume Hoffmann)
• darcs send no longer tries to send a mail by default (Eric Kow)
• when no patch name given, directly invoke text editor (Jose Neder, Guillaume Hoffmann)
• use nano as default text editor instead of vi (Guillaume Hoffmann)
• keep log files for patch name and mail content in _darcs (Ale Gadea)
• optimize and convert are now supercommands (Guillaume Hoffmann)
• improve darcs help environment and darcs help markdown (Radoslav Dorcik, Guillaume Hoffmann)
• warn about duplicate tags when creating a new one (Ale Gadea)
• allow darcs mv into known, but deleted in working, file (Owen Stephens)
• improve--not-in-remote, allowing multiple repos and use default (Owen Stephens)

## Performance

• faster darcs diff (Petr Rockai)
• faster log and annotate thanks to patch index data structure (BSRK Aditya, Benedikt Schmidt, Eric Kow, Guillaume Hoffmann, Ganesh Sittampalam)
• faster push via ssh by using compression (Ben Franksen)
• cloning to an ssh destination (formerly darcs put) is more efficient (Guillaume Hoffmann)
• faster internal representation of patch hashes (Guillaume Hoffmann)
• when cloning from http, use packs in a more predictable way (Guillaume Hoffmann)
• store global cache in bucketed format (Marcio Diaz)
• require and support GHC 7.4 to 7.10 (Ganesh Sittampalam)
• replace type witness CPP macros with plain Haskell (Eric Kow)
• hashed-storage is bundled into darcs (Ganesh Sittampalam)
• replace C SHA256 bindings with external libraries (Ganesh Sittampalam)
• move the bits of the datetime package we need into Darcs.Util.DateTime (Ganesh Sittampalam)
• build Darcs once rather than thrice. (Eric Kow)
• run tests through cabal test (Ryan Desfosses)
• run fewer darcs-1 related tests in testsuite (Ganesh Sittampalam)
• Use custom replHook to fix cabal repl (Owen Stephens)
• darcs.cabal: make Haskell2010 the default-language for all stanzas (Ben Franksen)
• always compile with mmap support (Ganesh Sittampalam)
• new options subsystem (Ben Franksen)
• various cleanups, code restructurations and refactoring, haddocks (Will Langstroth, Owen Stephens, Florent Becker, Guillaume Hoffmann, Michael Hendricks, Eric Kow, Dan Frumin, Ganesh Sittampalam)

## Issues resolved in Darcs 2.10

• issue346: implement "patience diff" from bzr (Jose Neder)
• issue642: Automatic detection of file renames (Jose Neder)
• issue822: generalized the IO Type for better error messages and exception handling (Ernesto Rodriguez)
• issue851: interactive mode for whatsnew (Dan Frumin)
• issue904: Fix record on Linux/FUSE/sshfs (fall back to sloppy locks automatically) (Nathaniel Filardo)
• issue1066: clone to ssh URL by locally cloning then copying by scp (Guillaume Hoffmann)
• issue1268: enable to write darcs init x (Radoslav Dorcik)
• issue1416: put log files in tempdir instead of in working dir (Ale Gadea)
• issue1514: send --minimize-context flag for send (Guillaume Hoffmann)
• issue1624: bucketed cache (Marcio Diaz)
• issue1828: file listing and working --dry-run for mark-conflicts (Guillaume Hoffmann)
• issue1987: Garbage collection for inventories and patches (Marcio Diaz)
$\$$darcs pull -a$r_1$so now we have,$r_2=p_{1,0}t_{1,0}t_{1,1}$and we see that$t_{1,0}$is dirty. Doing darcs optimize reorder 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 "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. "Second", using the implementation of "reorder" one can get almost for free the option --reorder for the commands pull, apply and rebase pull. The behavior for the case of pull (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,$l=p_1p_2\ldotsp_nlp_{n+1}\ldotslp_mr=p_1p_2\ldotsp_nrp_{n+1}\ldotsrp_k$where$lp$are the local patches that don't belong to$r$, and vice versa for$rp$. Make darcs pull, leaves$l$as follow,$l=p_1p_2\ldotsp_nlp_{n+1}\ldotslp_mrp_{n+1}\ldotsrp_k$meanwhile make darcs pull --reorder, leaves$l$,$l=p_1p_2\ldotsp_nrp_{n+1}\ldotsrp_klp_{n+1}\ldotslp_m$making more easy to send the$lp$patches later. "Third", beginning a new task, implement option minimize-context 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. ## June 25, 2014 ### Darcs News #### darcs news #104 June 25, 2014 04:59 AM UTC ### News and discussions 1. Google Summer of Code 2013 has begun! BSRK and José will post updates on their blogs: ### Issues resolved (8) issue2163 Radoslav Dorcik issue2227 Ganesh Sittampalam issue2248 Ganesh Sittampalam issue2250 BSRK Aditya issue2311 Sebastian Fischer issue2312 Sebastian Fischer issue2320 Jose Luis Neder issue2321 Jose Luis Neder ### Patches applied (20) See darcs wiki entry for details. #### darcs news #105 June 25, 2014 04:58 AM UTC ### News and discussions 1. This year's Google Summer of Code projects brought a lot of improvements to darcs and its ecosystem! • BSRK Aditya: Darcsden improvements: • José Neder: patience diff, file move detection, token replace detection: 2. Gian Piero Carrubba asked why adjacent hunks could not commute: 3. We listed the changes that occurred between version 2.8.4 and the current development branch into a 2.10 release page: ### Issues resolved (8) issue346 Jose Luis Neder issue1828 Guillaume Hoffmann issue2181 Guillaume Hoffmann issue2309 Owen Stephens issue2313 Jose Luis Neder issue2334 Guillaume Hoffmann issue2343 Jose Luis Neder issue2347 Guillaume Hoffmann ### Patches applied (39) See darcs wiki entry for details. #### Darcs News #106 June 25, 2014 04:58 AM UTC ### News and discussions 1. Darcs is participating once again to the Google Summer of Code, through the umbrella organization Haskell.org. Deadline for student application is Friday 21st: 2. 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: 3. Dan Licata wrote a presentation about Darcs as a higher inductive type: 4. 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": ### Issues resolved (6) issue642 Jose Luis Neder issue2209 Jose Luis Neder issue2319 Guillaume Hoffmann issue2332 Guillaume Hoffmann issue2335 Guillaume Hoffmann issue2348 Ryan ### Patches applied (34) See darcs wiki entry for details. #### Darcs News #108 June 25, 2014 04:57 AM UTC ### News and discussions 1. We have a few updates from the Google Summer of Code projects. Alejandro Gadea about history reordering: 2. Marcio Diaz about the cache system: 3. Incremental fast-export is now provided to ease maintenance of git mirrors: ### Issues resolved (8) issue2244 Ale Gadea issue2314 Benjamin Franksen issue2361 Ale Gadea issue2364 Sergei Trofimovich issue2364 Sergei Trofimovich issue2388 Owen Stephens issue2394 Guillaume Hoffmann issue2396 Guillaume Hoffmann ### Patches applied (39) See darcs wiki entry for details. ## June 12, 2014 ### Ale Gadea #### Third Week (02-06 june) June 12, 2014 04:58 PM UTC Well, well... Now with the solution already implemented here are a couple of time tests that show the improvement. For the repository of the issue2361: Before patch1169 "let it run for 2 hours and it did not finish" After patch1169 real 0m5.929s user 0m5.683s sys 0m0.260s For the repository generated by forever.sh, that in summarize has 12600~ patches, a bundle unrevert and doing reorden implies move 1100~ patches forward passing by 11500~ patches. Before patch1169 (Interrupted!) real 73m9.894s user 71m28.256s sys 1m11.439s After patch1169 real 2m23.405s user 2m17.347s sys 0m6.030s The repository generated by bigRepo.sh has 600~ patches, with only one tag and a very small bundle unrevert. Before patch1169 real 0m34.049s user 0m33.386s sys 0m0.665s After patch1169 real 0m1.053s user 0m0.960s sys 0m0.152s One last repository generated by bigUnrevert.sh, has 13 patches and a really big bundle unrevert (~10MB). Before patch1169 real 0m1.304s user 0m0.499s sys 0m0.090s After patch1169 real 0m0.075s user 0m0.016s sys 0m0.011s The repository with more examples is in here: ExamplesRepos. ## June 05, 2014 ### Ale Gadea #### Second Week (26-30 may) June 05, 2014 06:47 PM UTC Luckily, this week with Guillaume we found a "solution" for the issue 2361. But before of entering in details, let's review how the command darcs optimize --reorder does for reorder the patches. So, suppose we have the following repositories than, reading it from left to right we have the first patch till the last patch, besides with$p_{i,j}$we denote the$i$-th patch who belongs to the$j$-th repository, and when we want to specify that a patch$p_{i,j}$is a tag we write$t_{i,j}$.$r_1=p_{1,1}p_{2,1}\ldotsp_{n,1}p_{n+1,1}\ldotsp_{m,1}r_2=p_{1,1}p_{2,1}\ldotsp_{n,1}p_{1,2}\ldotsp_{k,2}t_{1,2}p_{k+1,2}\ldotsp_{l,2}$where the red part represent when$r_2$was cloned from$r_1$, and the rest is how each repository was evolved. Now, suppose we make a merge of$r_1$and$r_2$in$r_1$making a bundle of the patches of$r_2$and appling it in$r_1$. Thus, after the merge we have that$r_1=p_{1,1}p_{2,1}\ldotsp_{n,1}p_{n+1,1}\ldotsp_{m,1}p_{1,2}\ldotsp_{k,2}t_{1,2}p_{k+1,2}\ldotsp_{l,2}$and we found the situation where the tag$t_{1,2}$is dirty because the green part is in the middle. And now we are in conditions of finding out how darcs does the reorder of patches. So, the first task is to select the first tag seeing$r_1$in the reverse way, suppose$t_{1,2}$is the first (ie,$p_{k+1,2}\ldotsp_{l,2}$are not tags), and split the set of patches (the repository) in$ps_{t_{1,2}}=p_{1,1}p_{2,1}\ldotsp_{n,1}p_{1,2}\ldotsp_{k,2}t_{1,2}$and the rest of the patch set,$rest=p_{n+1,1}\ldotsp_{m,1}p_{k+1,2}\ldotsp_{l,2}$this is done by splitOnTag, which I don't totally understand yet, so for the moment... simply do the above :) Then, the part that interest us now is$rest$, we want to delete all the patches of$rest$that exist in$r_1$and then add them again, causing that they show up to the right. This job is done by tentativelyReplacePatches, which first calls tentativelyRemovePatches and then calls tentativelyAddPatches. So, tentativelyRemovePatches of$r_1$and$rest$makes,$r_{1}'=p_{1,1}p_{2,1}\ldotsp_{n,1}p_{1,2}\ldotsp_{k,2}t_{1,2}$and, tentativelyAddPatches of$r_{1}'$and$rest$,$r_{1}''=p_{1,1}p_{2,1}\ldotsp_{n,1}p_{1,2}\ldotsp_{k,2}t_{1,2}p_{n+1,1}\ldotsp_{m,1}p_{k+1,2}\ldotsp_{l,2}$leaving$t_{1,2}$clean. Well, all of this was for understanding the "solution" for the issue, we are almost there but before let's look at the function tentativelyRemovePatches. It attempts to remove patches with one special care: when one does darcs revert, a special file is generated, called unrevert in _darcs/patches, which is used for darcs unrevert in case that one makes a mistake with darcs revert. One important difference with unrevert is that unlike all the other files in _darcs/patches, unrevert in not a patch but a bundle, that contains a patch and a context. This context allows to know if the patch is applicable. So when one removes a patch (running for example oblitarete, unrecord or amend) that patch has to be removed from the bundle-revert (bundle of the file _darcs/patches/unrevert). It's now always possible to adjust the unrevert bundle, in which case, the operation continues only if the user agrees to delete the unrevert bundle. But now a question emerge. Is it necessary to accommodate the bundle-revert in the case of reorder?; the answer is no, and it's because we don't delete any patch of$r_1$so we still can apply the bundle-revert in$r_{1}''$. So, finally! we find out that for reorder we need a special case of removing, which doesn't try to update the unrevert bundle. And this ends up being the "solution" for the issue, since the reorder blocks in that function. But! beyond this solves the issue something weird is happening, that is the reason of the double quotes for solution :) This is more o less the step forward for now. The tasks ahead are, documenting the code in various parts and make the special case for the function tentativelyRemovePatches. On the way I will probably understand more about some of the functions that I mention before so probably I will add more info and rectify whatever is needed. ## June 03, 2014 ### Ale Gadea #### Google Summer of Code 2014 - Darcs June 03, 2014 06:46 PM UTC Hi hi all! I have been accepted in the GSoC 2014 :) , as part of the work I'll be writing about my progress. The original plan is have a summary per week (or at least I hope so jeje). I have already been reading some of the code of darcs and fixing some issues; Issue 2263 ~ Patch 1126 Issue 1416 ~ Patch 1135 - Issue 2244 ~ Patch 1147 (needs-screening) (not any more$\ddot\smile\$)

The details about the project is in History Reordering Performance and Features. Also some issues about the project are;

Issue 2361
Issue 2044

Cheers!