assistant: Make --autostart --foreground wait for the children it starts.
Before, the --foreground was ignored when autostarting. This commit was sponsored by Denis Dzyubenko on Patreon.
This commit is contained in:
		
					parent
					
						
							
								571eca4680
							
						
					
				
			
			
				commit
				
					
						3439f3cc87
					
				
			
		
					 3 changed files with 38 additions and 14 deletions
				
			
		| 
						 | 
					@ -28,6 +28,8 @@ git-annex (6.20170102) UNRELEASED; urgency=medium
 | 
				
			||||||
    case, this change will need to be cherry-picked into the git-annex in
 | 
					    case, this change will need to be cherry-picked into the git-annex in
 | 
				
			||||||
    Debian stable, or its wormhole pairing will break.
 | 
					    Debian stable, or its wormhole pairing will break.
 | 
				
			||||||
  * Fix build with aws 0.16. Thanks, aristidb.
 | 
					  * Fix build with aws 0.16. Thanks, aristidb.
 | 
				
			||||||
 | 
					  * assistant: Make --autostart --foreground wait for the children it
 | 
				
			||||||
 | 
					    starts. Before, the --foreground was ignored when autostarting.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 -- Joey Hess <id@joeyh.name>  Fri, 06 Jan 2017 15:22:06 -0400
 | 
					 -- Joey Hess <id@joeyh.name>  Fri, 06 Jan 2017 15:22:06 -0400
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
{- git-annex assistant
 | 
					{- git-annex assistant
 | 
				
			||||||
 -
 | 
					 -
 | 
				
			||||||
 - Copyright 2012-2015 Joey Hess <id@joeyh.name>
 | 
					 - Copyright 2012-2017 Joey Hess <id@joeyh.name>
 | 
				
			||||||
 -
 | 
					 -
 | 
				
			||||||
 - Licensed under the GNU GPL version 3 or higher.
 | 
					 - Licensed under the GNU GPL version 3 or higher.
 | 
				
			||||||
 -}
 | 
					 -}
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,8 @@ import qualified Build.SysConfig
 | 
				
			||||||
import Utility.HumanTime
 | 
					import Utility.HumanTime
 | 
				
			||||||
import Assistant.Install
 | 
					import Assistant.Install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import Control.Concurrent.Async
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cmd :: Command
 | 
					cmd :: Command
 | 
				
			||||||
cmd = dontCheck repoExists $ notBareRepo $
 | 
					cmd = dontCheck repoExists $ notBareRepo $
 | 
				
			||||||
	noRepo (startNoRepo <$$> optParser) $
 | 
						noRepo (startNoRepo <$$> optParser) $
 | 
				
			||||||
| 
						 | 
					@ -68,6 +70,7 @@ startNoRepo o
 | 
				
			||||||
	| autoStopOption o = autoStop
 | 
						| autoStopOption o = autoStop
 | 
				
			||||||
	| otherwise = giveup "Not in a git repository."
 | 
						| otherwise = giveup "Not in a git repository."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Does not return
 | 
				
			||||||
autoStart :: AssistantOptions -> IO ()
 | 
					autoStart :: AssistantOptions -> IO ()
 | 
				
			||||||
autoStart o = do
 | 
					autoStart o = do
 | 
				
			||||||
	dirs <- liftIO readAutoStartFile
 | 
						dirs <- liftIO readAutoStartFile
 | 
				
			||||||
| 
						 | 
					@ -76,28 +79,47 @@ autoStart o = do
 | 
				
			||||||
		giveup $ "Nothing listed in " ++ f
 | 
							giveup $ "Nothing listed in " ++ f
 | 
				
			||||||
	program <- programPath
 | 
						program <- programPath
 | 
				
			||||||
	haveionice <- pure Build.SysConfig.ionice <&&> inPath "ionice"
 | 
						haveionice <- pure Build.SysConfig.ionice <&&> inPath "ionice"
 | 
				
			||||||
	forM_ dirs $ \d -> do
 | 
						pids <- forM dirs $ \d -> do
 | 
				
			||||||
		putStrLn $ "git-annex autostart in " ++ d
 | 
							putStrLn $ "git-annex autostart in " ++ d
 | 
				
			||||||
		ifM (catchBoolIO $ go haveionice program d)
 | 
							mpid <- catchMaybeIO $ go haveionice program d
 | 
				
			||||||
 | 
							if foregroundDaemonOption (daemonOptions o)
 | 
				
			||||||
 | 
								then return mpid
 | 
				
			||||||
 | 
								else do
 | 
				
			||||||
 | 
									case mpid of
 | 
				
			||||||
 | 
										Nothing -> putStrLn "failed"
 | 
				
			||||||
 | 
										Just pid -> ifM (checkSuccessProcess pid)
 | 
				
			||||||
						( putStrLn "ok"
 | 
											( putStrLn "ok"
 | 
				
			||||||
						, putStrLn "failed"
 | 
											, putStrLn "failed"
 | 
				
			||||||
						)
 | 
											)
 | 
				
			||||||
 | 
									return Nothing
 | 
				
			||||||
 | 
						-- Wait for any foreground jobs to finish and propigate exit status.
 | 
				
			||||||
 | 
						ifM (all (== True) <$> mapConcurrently checkSuccessProcess (catMaybes pids))
 | 
				
			||||||
 | 
							( exitSuccess
 | 
				
			||||||
 | 
							, exitFailure
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
  where
 | 
					  where
 | 
				
			||||||
	go haveionice program dir = do
 | 
						go haveionice program dir = do
 | 
				
			||||||
		setCurrentDirectory dir
 | 
							setCurrentDirectory dir
 | 
				
			||||||
		-- First stop any old daemon running in this directory, which
 | 
							-- First stop any old daemon running in this directory, which
 | 
				
			||||||
		-- might be a leftover from an old login session. Such a
 | 
							-- might be a leftover from an old login session. Such a
 | 
				
			||||||
		-- leftover might be left in an environment where it is
 | 
							-- leftover might be left in an environment where it is
 | 
				
			||||||
		-- unavble to use the ssh agent or other login session
 | 
							-- unable to use the ssh agent or other login session
 | 
				
			||||||
		-- resources.
 | 
							-- resources.
 | 
				
			||||||
		void $ boolSystem program [Param "assistant", Param "--stop"]
 | 
							void $ boolSystem program [Param "assistant", Param "--stop"]
 | 
				
			||||||
		if haveionice
 | 
							(Nothing, Nothing, Nothing, pid) <- createProcess p
 | 
				
			||||||
			then boolSystem "ionice" (Param "-c3" : Param program : baseparams)
 | 
							return pid
 | 
				
			||||||
			else boolSystem program baseparams
 | 
					 | 
				
			||||||
	  where
 | 
						  where
 | 
				
			||||||
		baseparams =
 | 
							p
 | 
				
			||||||
			[ Param "assistant"
 | 
								| haveionice = proc "ionice"
 | 
				
			||||||
			, Param $ "--startdelay=" ++ fromDuration (fromMaybe (Duration 5) (startDelayOption o))
 | 
									(toCommand $ Param "-c3" : Param program : baseparams)
 | 
				
			||||||
 | 
								| otherwise = proc program
 | 
				
			||||||
 | 
									(toCommand baseparams)
 | 
				
			||||||
 | 
							baseparams = catMaybes
 | 
				
			||||||
 | 
								[ Just $ Param "assistant"
 | 
				
			||||||
 | 
								, Just $ Param $ "--startdelay=" ++ fromDuration (fromMaybe (Duration 5) (startDelayOption o))
 | 
				
			||||||
 | 
								, if foregroundDaemonOption (daemonOptions o)
 | 
				
			||||||
 | 
									then Just $ Param "--foreground"
 | 
				
			||||||
 | 
									else Nothing
 | 
				
			||||||
			]
 | 
								]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
autoStop :: IO ()
 | 
					autoStop :: IO ()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,4 +32,4 @@ It seems to be connected to the autostart option, without --autostart it does no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
 | 
					### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> Made it support this combination of switches. [[done]] --[[Joey]]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue