aboutsummaryrefslogtreecommitdiff
path: root/Assistant
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-04-24 13:04:46 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-04-24 13:04:46 -0400
commit68363880a0a1abe4edab005031c3c050c6ff589c (patch)
tree4ef3a7a7b008c6c1590117099c98927ee19aeea3 /Assistant
parent1b38f6aced8bb739c33fc410dd6b171aebd1fcd5 (diff)
show one alert when bulk adding files
Turns out that a lot of the time spent in a bulk add was just updating the add alert to rotate through each file that was added. Showing one alert makes for a significant speedup. Also, when the webapp is open, this makes it take quite a lot less cpu during bulk adds. Also, it lets the user know when a bulk add happened, which is sorta nice..
Diffstat (limited to 'Assistant')
-rw-r--r--Assistant/Alert.hs2
-rw-r--r--Assistant/Threads/Committer.hs47
2 files changed, 32 insertions, 17 deletions
diff --git a/Assistant/Alert.hs b/Assistant/Alert.hs
index f412e6232..da22d6031 100644
--- a/Assistant/Alert.hs
+++ b/Assistant/Alert.hs
@@ -233,7 +233,7 @@ fileAlert msg file = (activityAlert Nothing [f])
render fs = tenseWords $ msg : fs
combiner new old = take 10 $ new ++ old
-addFileAlert :: FilePath -> Alert
+addFileAlert :: String -> Alert
addFileAlert = fileAlert (Tensed "Adding" "Added")
{- This is only used as a success alert after a transfer, not during it. -}
diff --git a/Assistant/Threads/Committer.hs b/Assistant/Threads/Committer.hs
index 04f94143b..8fe48bfb7 100644
--- a/Assistant/Threads/Committer.hs
+++ b/Assistant/Threads/Committer.hs
@@ -231,9 +231,10 @@ handleAdds delayadd cs = returnWhen (null incomplete) $ do
refillChanges postponed
returnWhen (null toadd) $ do
- added <- catMaybes <$> if direct
- then adddirect toadd
- else forM toadd add
+ added <- addaction toadd $
+ catMaybes <$> if direct
+ then adddirect toadd
+ else forM toadd add
if DirWatcher.eventsCoalesce || null added || direct
then return $ added ++ otherchanges
else do
@@ -256,19 +257,13 @@ handleAdds delayadd cs = returnWhen (null incomplete) $ do
| otherwise = a
add :: Change -> Assistant (Maybe Change)
- add change@(InProcessAddChange { keySource = ks }) =
- alertWhile' (addFileAlert $ keyFilename ks) $
- liftM ret $ catchMaybeIO <~> do
- sanitycheck ks $ do
- key <- liftAnnex $ do
- showStart "add" $ keyFilename ks
- Command.Add.ingest $ Just ks
- maybe (failedingest change) (done change $ keyFilename ks) key
- where
- {- Add errors tend to be transient and will be automatically
- - dealt with, so don't pass to the alert code. -}
- ret (Just j@(Just _)) = (True, j)
- ret _ = (True, Nothing)
+ add change@(InProcessAddChange { keySource = ks }) =
+ catchDefaultIO Nothing <~> do
+ sanitycheck ks $ do
+ key <- liftAnnex $ do
+ showStart "add" $ keyFilename ks
+ Command.Add.ingest $ Just ks
+ maybe (failedingest change) (done change $ keyFilename ks) key
add _ = return Nothing
{- In direct mode, avoid overhead of re-injesting a renamed
@@ -336,6 +331,26 @@ handleAdds delayadd cs = returnWhen (null incomplete) $ do
void $ liftIO $ tryIO $ removeFile $ contentLocation keysource
return Nothing
+ {- Shown an alert while performing an action to add a file or
+ - files. When only one file is added, its name is shown
+ - in the alert. When it's a batch add, the number of files added
+ - is shown.
+ -
+ - Add errors tend to be transient and will be
+ - automatically dealt with, so the alert is always told
+ - the add succeeded.
+ -}
+ addaction [] a = a
+ addaction toadd a = alertWhile' (addFileAlert msg) $
+ (,)
+ <$> pure True
+ <*> a
+ where
+ msg = case toadd of
+ (InProcessAddChange { keySource = ks }:[]) ->
+ keyFilename ks
+ _ -> show (length toadd) ++ " files"
+
{- Files can Either be Right to be added now,
- or are unsafe, and must be Left for later.
-