summaryrefslogtreecommitdiff
path: root/Assistant
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-06-15 18:56:23 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-06-15 19:00:06 -0400
commit679ef4c85896b6830bc6ae335995558577f4e435 (patch)
tree3f168039538e5b032d0aea7b317445df90ad3109 /Assistant
parentc27c751b34af993a67e04e079d6f860a69f25038 (diff)
continued work on deferred addding
Diffstat (limited to 'Assistant')
-rw-r--r--Assistant/Committer.hs25
1 files changed, 12 insertions, 13 deletions
diff --git a/Assistant/Committer.hs b/Assistant/Committer.hs
index 6e56c2235..64ea300e2 100644
--- a/Assistant/Committer.hs
+++ b/Assistant/Committer.hs
@@ -91,18 +91,18 @@ handleAdds :: ThreadState -> ChangeChan -> [Change] -> IO ()
handleAdds st changechan cs
| null added = noop
| otherwise = do
- numadded <- length . filter id <$>
- runThreadState st (forM added add)
- waitforlinkchanges numadded
+ r <- forM added $ catchBoolIO . runThreadState st . add
+ let numadded = length $ filter id r
+ handleAdds st changechan =<< waitforlinkchanges [] numadded
where
- added = filter isPendingAdd cs
+ added = map changeFile $ filter isPendingAdd cs
isPendingAdd (Change { changeType = PendingAddChange }) = True
isPendingAdd _ = False
isLinkChange (Change { changeType = LinkChange }) = True
isLinkChange _ = False
- add (Change { changeFile = file }) = do
+ add file = do
showStart "add" file
handle file =<< Command.Add.ingest file
@@ -114,14 +114,13 @@ handleAdds st changechan cs
showEndOk
return True
- waitforlinkchanges 0 = noop
- waitforlinkchanges n = do
- c <- runChangeChan $ readTChan changechan
- if (isLinkChange c)
- then waitforlinkchanges (n-1)
- else do
- handleAdds st changechan [c]
- waitforlinkchanges n
+ waitforlinkchanges c n
+ | n < 1 = return $ concat c
+ | otherwise = do
+ (done, rest) <- partition isLinkChange
+ <$> getChanges changechan
+ let n' = (n - length done)
+ waitforlinkchanges (rest:c) n'
commitStaged :: Annex ()
commitStaged = do