Interface for versioning file stores.

Latest on Hackage:

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow to host generated Haddocks.

BSD3 licensed by John MacFarlane, Gwern Branwen, Sebastiaan Visser
Maintained by

The filestore library provides an abstract interface for a versioning file store, and modules that instantiate this interface. Currently Git, Darcs, and Mercurial modules are provided, and other VCSs or databases could be added.


Version released 14 May 2018

* Use build-type Simple (hvr).

Version released 10 Apr 2018

* Update version bounds for dependencies.
* Tweaked tests. We no longer run darcs tests; they seem to
depend too much on the details of the system and the darcs

Version released 13 Feb 2017

* Bump to, raise directory upper bound.
* Fix false-positive on travis.
* Fix bug in 'revision' for git (changes were not obtained).

Version 0.6.3 released 23 Jan 2017

* Handle git rename changes (as a Deleted+Added) (#10, Kevin Quick).

Version 0.6.2 released 13 Jun 2016

* Set committer name and email when committing (#19, Phil Ruffwind).

* Fixes for compatibility with ghc 8 (Sergei Trofimovich).

Version 0.6.1 released 27 July 2015

* Create `.git/hooks` directory if missing on initialize

* Set git username, email.

* Added preliminary symlink handling (Jeffrey David Johnson).

Version released 2 April 2015

* Added compatibility module Data.FileStore.Compat.Locale
so that filestore will compile against time 1.5.

Version released 2 April 2015

* Mark post-update as a bash script (not a generic shell script).

* Bump version bounds for dependencies.

Version released 31 Oct 2014

* Fixed test suite so that it returns error status if tests fail (#16).

Version released 26 Jul 2014

* Disable the broken mercurial command server on Windows, falling back
on direct running of each command (Alan Brooks).

* Added a script demonstrating use of filestore to query darcs repositories

Version released 08 Apr 2014

* Bumped version for process so it will compile with GHC 7.8.1.

Version released 20 Mar 2013

* runProcess now allows access to the current environment, instead of
running in a bare environment. This fixes problems for those who have
git in a nonstandard path. (Jochen Keil)

* Allow latest Diff.

* Reconfigured cabal file to use new Cabal test framework. Run tests with
`cabal configure --enable-tests && cabal build && cabal test`.

* Set environment variable HGENCODING for mercurial. Closes #6.

Version 0.6 released 31 Dec 2012

* Updated to use Diff 0.2. This involves an API change:
diff now returns [Diff [String]] rather than [(DI, String)].
Thanks to markwright for the patch.

* Test revDescription more thoroughly (Ben Millwood).

* Fixed error handling in withVerifyDir.

Version released 21 Oct 2012

* Bumped version limits on dependencies.

* Upgraded Utils to use Control.Exception.

Version 0.5 released 30 Apr 2012

* Added 'limit' parameter to 'history', so that in large repositories
you don't need to generate and parse the entire log.

* Revised the git log parser, so it is faster and lazy. This is
helpful for applications where we may not need to parse the whole
history. It would be good to make similar modifications to the hg
and darcs log parsers in the future.

Version released 26 Sep 2010

* runShellCommand: reverted to older version with temp files.
The new version caused lazy-IO related problems with large
files. Thanks to Pavel Perikov diagnosing the problem.

Version released 03 Aug 2010

* gitInit: Set up repository to allow push to the current
branch. This is needed for recent versions of git,
which don't allow a push to the master branch. Resolves
Issue #104.

* New version of runShellCommand that does not require
temp files, using runInteractiveProcess.

* Suppress "unused do bind" warnings in build.

Version released 22 Jan 2010

* Rewrote splitEmailAuthor with list fns not regexes.
Also removed regex-posix from cabal build-depends.

* Corrected error message for richDirectory

* Improved git search:
+ Previously git search would fail in some cases, with an error
in parseMatchLine (for example, with unicode search term).
+ We replaced the regex with a simpler match-line parser using
Preface functions.
+ We also now use --null to force a NUL separator in git grep.
+ The test case that previously failed now passes.

Version 0.3.4 released 10 Dec 2009

* Added Mercurial module and associated tests.
Thanks to John Lenz for the patch.

* Added test case for nonascii directory name

* gitLatestRevId - added check to make sure resource hasn't been removed.
Without this, you get a ResourceExists error when creating a file
that has been previously deleted from the repo.

* Use -z with git ls-tree. This resolves Issue #77.
When 'git ls-tree' is used with -z, it prints regular UTF8 instead of
octal encoding it. So we can avoid the problem we were having with
filenames like Foo\230\331/Bar.

* Use -z for 'git whatchanged'. This allows us to remove the kludgy
'convertEncoded' function, which parsed encoded filenames.

Version released 22 Nov 2009

* Raise an IllegalResourceName error if the user tries to
delete a file inside .git or _darcs subdirectory.

* Have gitSearch return no matches, instead of raising an error,
if error status = 1. Recent versions of git-grep return 1 if
no matches found.

* Fix git log parsing so that it allows log comments to start with ':'
Thanks to thorben for uncovering the bug.

Version 0.3.3 released 06 Nov 2009

* isInsideDir is again exported.

Version released 06 Nov 2009

* Raise an IllegalResourceName error if the user tries to create
a file inside the .git or _darcs subdirectory. Previously the
file would be written (or overwritten) before the error was caught
in the add/commit phase. This introduced the risk of corrupting
the repository or, worse, overwriting hooks.

* isInsideDir is no longer exported.

* checkAndWriteFile has been replaced with withSanityCheck, to avoid
code duplication between create and rename functions.

Version released 24 Oct 2009

* Convert pathname to UTF8 in withVerifyDir.

Version 0.3.2 released 22 Aug 2009

* Made maxcount default to True, as '--max-count' is supported by
the latest released version of darcs (2.3.0). Print an informative
error message if the version of darcs being used does not support

* Made 'initialize' throw RepoExists error only if the repo
exists; catch permission or other errors separately. (Thomas Hartmann)

* Made 'index' throw an error if the directory is not present or
there are insufficient permissions. (Thomas Hartmann)

* Improved error message for search match helper.

Version 0.3.1 released 04 Jul 2009

* Added -I flag to grep in regSearchFiles. Ignore binary files
in the repository when searching.

* Added maxcount Cabal flag, defaulting to False. When true,
this flag causes 'latest' to run 'darcs changes' with the
flag '--max-count=1', which dramatically increases performance.
(Without this, filestore has to retrieve the entire changelog
just to get the latest revision ID.) '--max-count' is at this
point only in development versions of darcs.

* Removed quoting from --match=hash in Darcs module (since it doesn't
go through /bin/sh). Thanks to Ganesh Sittampalam.

* Efficiency improvements and refactoring in Darcs module.

* Moved darcs utility functions to Util module.

Version 0.3 released 08 Apr 2009

* Added new 'directory' function, which returns a list of resources given
a directory name. Resources are marked as either FSFile or
FSDirectory. Thanks to Thomas Hartman for showing the need for
'directory', and for distinguishing explicitly between files and
directories. In 'index' the distinction was previously left implicit,
which worked for git but not darcs: 'index' provided no way of
distinguishing an empty directory from a file.

* In 'directory' and 'index', git ls-tree is used instead of git ls-files;
this guarantees that only files that have been committed are returned.
'index' now lists only files, and no longer includes empty directories
even in darcs.

* Added new richDirectory function to Data.FileStore.Generic.
richDirectory returns a directory that includes information
about the latest revision of each file. Thanks to Thomas Hartman for
the patch.

* Replaced ResourceName type with FilePath.

* Added repository information to cabal file.

Version 0.2 released 08 Feb 2009

* Changed diff to do a line-by-line rather than word-by-word diff.
The word-by-word diff led to excessive memory usage and confusing
output in some cases. NOTE: diff now returns lists of lines,
not including newlines. So calling programs may need to be changed.

diff also now skips calling getGroupedDiff when the left document
is empty, for better performance.

* Added ghc-prof-options to cabal file.

* Clean up code in gitRetrieve.

* Added ensureFileExists to Darcs module. Added checks to ensure that file
exists in darcsLatestRevId and darcsRetrieve. If not, return

* gitRetrieve: check to make sure object is a file before retrieving.
Also, if Nothing is the revision ID, use gitLatestRevId rather than
going directly to the file system. This is a step in the direction of
making filestore compatible with bare repositories.

* Test suite has been wired into Setup.lhs: 'cabal test' now runs tests.

* Added new test case for attempting to retrieve a subdirectory,
and for creating a second file in a subdirectory.

* Minor code cleanup.

* Added CHANGES.

Version 0.1 released 24 Jan 2009

* Initial release.
comments powered byDisqus