summaryrefslogtreecommitdiff
path: root/Command/Assistant.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-08-02 00:42:33 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-08-02 00:42:33 -0400
commit60da0d6ad28bff7c601ba631a8ec65030f940367 (patch)
tree56b137977c3f88c46e406859db8457a08fb80371 /Command/Assistant.hs
parent23fe661d37ceb6c7bf754e9dc8fd5dda89793b63 (diff)
full autostart support
git annex assistant --autostart will start separate daemons in each listed autostart repo running the webapp outside any git-annex repo will open it on the first listed autostart repo
Diffstat (limited to 'Command/Assistant.hs')
-rw-r--r--Command/Assistant.hs58
1 files changed, 56 insertions, 2 deletions
diff --git a/Command/Assistant.hs b/Command/Assistant.hs
index 60eac5d21..24cc3ec6c 100644
--- a/Command/Assistant.hs
+++ b/Command/Assistant.hs
@@ -7,12 +7,66 @@
module Command.Assistant where
+import Common.Annex
import Command
+import qualified Option
import qualified Command.Watch
+import Init
+import Locations.UserConfig
+
+import System.Environment
+import System.Posix.Directory
def :: [Command]
-def = [withOptions [Command.Watch.foregroundOption, Command.Watch.stopOption] $
+def = [noRepo checkAutoStart $ dontCheck repoExists $
+ withOptions [Command.Watch.foregroundOption, Command.Watch.stopOption, autoStartOption] $
command "assistant" paramNothing seek "automatically handle changes"]
+autoStartOption :: Option
+autoStartOption = Option.flag [] "autostart" "start in known repositories"
+
seek :: [CommandSeek]
-seek = Command.Watch.mkSeek True
+seek = [withFlag Command.Watch.stopOption $ \stopdaemon ->
+ withFlag Command.Watch.foregroundOption $ \foreground ->
+ withFlag autoStartOption $ \autostart ->
+ withNothing $ start foreground stopdaemon autostart]
+
+start :: Bool -> Bool -> Bool -> CommandStart
+start foreground stopdaemon autostart
+ | autostart = do
+ liftIO $ autoStart
+ stop
+ | otherwise = do
+ ensureInitialized
+ Command.Watch.start True foreground stopdaemon
+
+{- Run outside a git repository. Check to see if any parameter is
+ - --autostart and enter autostart mode. -}
+checkAutoStart :: IO ()
+checkAutoStart = ifM (any (== "--autostart") <$> getArgs)
+ ( autoStart
+ , error "Not in a git repository."
+ )
+
+autoStart :: IO ()
+autoStart = do
+ autostartfile <- autoStartFile
+ let nothing = error $ "Nothing listed in " ++ autostartfile
+ ifM (doesFileExist autostartfile)
+ ( do
+ dirs <- lines <$> readFile autostartfile
+ programfile <- programFile
+ program <- catchDefaultIO (readFile programfile) "git-annex"
+ when (null dirs) nothing
+ forM_ dirs $ \d -> do
+ putStrLn $ "git-annex autostart in " ++ d
+ ifM (catchBoolIO $ go program d)
+ ( putStrLn "ok"
+ , putStrLn "failed"
+ )
+ , nothing
+ )
+ where
+ go program dir = do
+ changeWorkingDirectory dir
+ boolSystem program [Param "assistant"]