I thought this might be a lock conflict that explains the deadlock when
built with -threaded, but it seems not.. it still locks! It even locks
without the committer thread.
Indeed, it locks when running "git annex add"! -threaded is exposing some
other problem.
Still, this seems conceptually cleaner and did not add any inneficiencies.
Also added some high-level documentation about the threads used.
The existing `sed | find | perl` hack in the Makefile was not
including the man pages in the generated git-annex.cabal. I couldn't
figure out why it didn't work; running the `find | perl` part of the
command *did* list the man pages ...
So, I set up a new hack. It produces a cleaner .cabal file and
includes the man pages in the sdist. I changed git-annex.cabal and
its generation as follows:
- git-annex.cabal is now generated by a here document in
git-annex.cabal.template.sh. The here document has inline file list
insertion, whereas before the file lists were inserted with sed.
- The 'Extra-Source-Files:' field now only includes the non-source
files: the man pages, plain text documentation, and license.
- The source dependencies are now listed in 'Other-Modules' sections
in the 'Executable' and 'Test-Suite' sections. The list of
dependencies is generated by `gen-other-modules.sh`.
- The ./debian and ./doc are no longer included in the sdist package.
These were not installed anywhere by `cabal install`. A user that
wants them could clone the git repo.
Running the tests with cabal is not yet working, i.e.
cabal configure --enable-tests && cabal build && cabal test
and
cabal install --enable-tests
fail to find Utility.Touch. However, I did not break this: it doesn't
work for the git-annex package on Hackage either. Next step is to
figure out how to deal with HSC in cabal ... or not bother, because
`make test` works. I'm worried this is a cabal bug.
To test building from sdist, I've been running
cd ../.. ; cabal sdist ; cd dist ; tar xf git-annex-3.20120605.tar.gz && cd git-annex-3.20120605 && rm -fr /tmp/git-annex && cabal install --prefix=/tmp/git-annex && tree -A /tmp/git-annex
in the dist directory. Using `cabal-dev install` is a better test,
but is very slow.
The commit thread now has access to a channel containing the times of
all uncommitted changes. This lets it be smart about detecting busy times
when a batch job is running (such as rm -rf, or untarring something, etc),
and avoid committing until it's done. While at the same time, instantly
committing one-off changes that the user is going to expect to see
immediately.
I had to use STM to implement the channel, because of
http://hackage.haskell.org/trac/ghc/ticket/4154
While this adds a dependency, I always wanted to use STM, so this actually
makes me happy. ;)
Also happy that shouldCommit is a pure function, so other commit smartness
strategies can easily be played with. Although the current one seems pretty
good.
There is one bug, for some reason it does double commits, every time.
Fixes build breakage when both 'mtl' and 'monads-tf' are present:
$ make git-annex
> ghc -O2 -Wall -ignore-package monads-fd -outputdir tmp -IUtility -DWITH_S3 --make git-annex Utility/libdiskfree.o
>
> Common.hs:6:8:
> Ambiguous module name `Control.Monad.State.Strict':
> it was found in multiple packages: monads-tf-0.1.0.0 mtl-2.1.1
> make: *** [git-annex] Error 1
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
The Haskell code uses tabs for indentation, and displays well with
tab-width set to 2. So, I created a .dir-locals.el (applies to all
files opened in emacs at or below ./), which sets 'tab-width' to 2,
turns on 'indent-tabs-mode', and highlights leading spaces in
'haskell-mode'.
The creation of the 'git-annex-shell' symlink was in 'postInst' hook.
I combined it with the man-page installation in a 'postInst' hook and
a 'postCopy' hook. I don't understand how to use the `cabal copy`
command, but the examples I looked at defined both hooks.
Relevant comments from the source:
* man-page installation:
See http://www.haskell.org/haskellwiki/Cabal/Developer-FAQ#Installing_manpages.
Based on pandoc's and lhs2tex's 'Setup.installManpages' and
'postInst' hooks.
My understanding: 'postCopy' is run for `cabal copy`, 'postInst' is
run for `cabal inst`, and copy is not a generalized install, so you
have to write two nearly identical hooks.
Summary of hooks:
http://www.haskell.org/cabal/release/cabal-latest/doc/API/Cabal/Distribution-Simple-UserHooks.htm--
Other people are also confused:
* Bug: 'postCopy' and 'postInst' are confusing:
http://hackage.haskell.org/trac/hackage/ticket/718
* A cabal maintainer suggests using 'postCopy' instead of
'postInst', because `cabal install` is `cabal copy` followed by
`cabal register`:
http://www.haskell.org/pipermail/libraries/2008-March/009416.html
Although that sounds desirable, it's not true, as the reply and
experiments indicate.
* the `cabal copy` command:
???: Not sure how you're supposed to use this. E.g., when I do
cabal install --prefix=/tmp/git-annex-install
cabal copy --deistdir=/tmp/git-annex-copy
I get the copy under
/tmp/git-annex-copy/tmp/git-annex-install
Also, `cabal install` fails when given a relative --prefix.