Monday, September 5, 2016

darcs 2.12.1 release

The Darcs team is pleased to announce the release of Darcs 2.12.1!

The most important changes are:
  • fixes for building with GHC 8
  • drop support for GHC 7.6 and 7.8, i.e., require GHC 7.10
  • improvements in `darcs whatsnew` output with irrelevant files (Ben Franksen)
This release can be installed via cabal or (soon) stack. The 2.12 branch is also available as a darcs repository from .

Friday, April 29, 2016

darcs 2.12.0 release

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 (
and install Darcs with cabal-install:

$ cabal update
$ cabal install darcs-2.12.0

You can also download the tarball from and build it by hand.

The 2.12 branch is also available as a darcs repository from

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.

Friday, April 15, 2016

Darcs News #113

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.

Friday, April 1, 2016

Darcs News #112

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 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
  • merge HACKING into
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 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
  • remove file from 2008
  • replace changes by log in Setup.lhs
  • update upload.cgi with new command names
  • update 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.

Monday, January 18, 2016

darcs hacking sprint 10 report

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