aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Assistant/NamedThread.hs5
-rw-r--r--Assistant/Threads/Watcher.hs41
-rw-r--r--Config.hs2
-rw-r--r--Git/Config.hs4
-rw-r--r--Types/GitConfig.hs2
-rw-r--r--debian/changelog3
-rw-r--r--doc/git-annex.mdwn5
7 files changed, 59 insertions, 3 deletions
diff --git a/Assistant/NamedThread.hs b/Assistant/NamedThread.hs
index fbb7da4c2..fd710cf54 100644
--- a/Assistant/NamedThread.hs
+++ b/Assistant/NamedThread.hs
@@ -73,6 +73,11 @@ startNamedThread urlrenderer namedthread@(NamedThread name a) = do
, buttonAction = Just close
}
+namedThreadId :: NamedThread -> Assistant (Maybe ThreadId)
+namedThreadId (NamedThread name _) = do
+ m <- startedThreads <$> getDaemonStatus
+ return $ asyncThreadId . fst <$> M.lookup name m
+
{- Waits for all named threads that have been started to finish.
-
- Note that if a named thread crashes, it will probably
diff --git a/Assistant/Threads/Watcher.hs b/Assistant/Threads/Watcher.hs
index 2c61b50f5..9c0439231 100644
--- a/Assistant/Threads/Watcher.hs
+++ b/Assistant/Threads/Watcher.hs
@@ -5,8 +5,11 @@
- Licensed under the GNU GPL version 3 or higher.
-}
+{-# LANGUAGE DeriveDataTypeable #-}
+
module Assistant.Threads.Watcher (
watchThread,
+ WatcherException(..),
checkCanWatch,
needLsof,
stageSymlink,
@@ -38,9 +41,12 @@ import Annex.Content.Direct
import Annex.CatFile
import Git.Types
import Config
+import Utility.ThreadScheduler
import Data.Bits.Utils
+import Data.Typeable
import qualified Data.ByteString.Lazy as L
+import qualified Control.Exception as E
checkCanWatch :: Annex ()
checkCanWatch
@@ -58,8 +64,21 @@ needLsof = error $ unlines
, "Be warned: This can corrupt data in the annex, and make fsck complain."
]
+{- A special exception that can be thrown to pause or resume the watcher. -}
+data WatcherException = PauseWatcher | ResumeWatcher
+ deriving (Show, Eq, Typeable)
+
+instance E.Exception WatcherException
+
watchThread :: NamedThread
-watchThread = namedThread "Watcher" $ do
+watchThread = namedThread "Watcher" $
+ ifM (liftAnnex $ annexAutoCommit <$> Annex.getGitConfig)
+ ( runWatcher
+ , waitFor ResumeWatcher runWatcher
+ )
+
+runWatcher :: Assistant ()
+runWatcher = do
startup <- asIO1 startupScan
direct <- liftAnnex isDirect
addhook <- hook $ if direct then onAddDirect else onAdd
@@ -74,11 +93,29 @@ watchThread = namedThread "Watcher" $ do
, delDirHook = deldirhook
, errHook = errhook
}
- void $ liftIO $ watchDir "." ignored hooks startup
+ handle <- liftIO $ watchDir "." ignored hooks startup
debug [ "watching", "."]
+
+ {- Let the DirWatcher thread run until signalled to pause it,
+ - then wait for a resume signal, and restart. -}
+ waitFor PauseWatcher $ do
+ liftIO $ stopWatchDir handle
+ waitFor ResumeWatcher runWatcher
where
hook a = Just <$> asIO2 (runHandler a)
+waitFor :: WatcherException -> Assistant () -> Assistant ()
+waitFor sig next = do
+ r <- liftIO $ (E.try pause :: IO (Either E.SomeException ()))
+ case r of
+ Left e -> case E.fromException e of
+ Just s
+ | s == sig -> next
+ _ -> noop
+ _ -> noop
+ where
+ pause = runEvery (Seconds 86400) noop
+
{- Initial scartup scan. The action should return once the scan is complete. -}
startupScan :: IO a -> Assistant a
startupScan scanner = do
diff --git a/Config.hs b/Config.hs
index f2f12a266..ad67a9a0d 100644
--- a/Config.hs
+++ b/Config.hs
@@ -83,7 +83,7 @@ isDirect = annexDirect <$> Annex.getGitConfig
setDirect :: Bool -> Annex ()
setDirect b = do
- setConfig (annexConfig "direct") $ if b then "true" else "false"
+ setConfig (annexConfig "direct") (Git.Config.boolConfig b)
Annex.changeGitConfig $ \c -> c { annexDirect = b }
{- Gets the http headers to use. -}
diff --git a/Git/Config.hs b/Git/Config.hs
index 52a9dafb5..adc75a208 100644
--- a/Git/Config.hs
+++ b/Git/Config.hs
@@ -147,5 +147,9 @@ isTrue s
where
s' = map toLower s
+boolConfig :: Bool -> String
+boolConfig True = "true"
+boolConfig False = "false"
+
isBare :: Repo -> Bool
isBare r = fromMaybe False $ isTrue =<< getMaybe "core.bare" r
diff --git a/Types/GitConfig.hs b/Types/GitConfig.hs
index f93ef1529..30214bc29 100644
--- a/Types/GitConfig.hs
+++ b/Types/GitConfig.hs
@@ -33,6 +33,7 @@ data GitConfig = GitConfig
, annexDelayAdd :: Maybe Int
, annexHttpHeaders :: [String]
, annexHttpHeadersCommand :: Maybe String
+ , annexAutoCommit :: Bool
}
extractGitConfig :: Git.Repo -> GitConfig
@@ -51,6 +52,7 @@ extractGitConfig r = GitConfig
, annexDelayAdd = getmayberead "delayadd"
, annexHttpHeaders = getlist "http-headers"
, annexHttpHeadersCommand = getmaybe "http-headers-command"
+ , annexAutoCommit = getbool "autocommit" True
}
where
get k def = fromMaybe def $ getmayberead k
diff --git a/debian/changelog b/debian/changelog
index df3021d69..d7b89c2dd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,6 +4,9 @@ git-annex (3.20130125) UNRELEASED; urgency=low
* Adjust debian package to only build-depend on DAV on architectures
where it is available.
* addurl --fast: Use curl, rather than haskell HTTP library, to support https.
+ * annex.autocommit: New setting, can be used to disable autocommit
+ of changed files by the assistant, while it still does data syncing
+ and other tasks.
-- Joey Hess <joeyh@debian.org> Sat, 26 Jan 2013 15:48:40 +1100
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 7294fb277..e55f97fc2 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -802,6 +802,11 @@ Here are all the supported configuration settings.
are accessed directly, rather than through symlinks. Note that many git
and git-annex commands will not work with such a repository.
+* `annex.autocommit`
+
+ Set to false to prevent the git-annex assistant from automatically
+ committing changes to files in the repository.
+
* `remote.<name>.annex-cost`
When determining which repository to