set oneshot mode on a per-command basis

Avoids ugly (and test suite failing) hack in Command.Version
This commit is contained in:
Joey Hess 2012-02-14 12:40:40 -04:00
parent 33e03d58ae
commit 90a8b38ac0
11 changed files with 19 additions and 16 deletions

View file

@ -28,8 +28,8 @@ type Params = [String]
type Flags = [Annex ()]
{- Runs the passed command line. -}
dispatch :: Bool -> Params -> [Command] -> [Option] -> String -> IO Git.Repo -> IO ()
dispatch oneshot args cmds commonoptions header getgitrepo = do
dispatch :: Params -> [Command] -> [Option] -> String -> IO Git.Repo -> IO ()
dispatch args cmds commonoptions header getgitrepo = do
setupConsole
r <- E.try getgitrepo :: IO (Either E.SomeException Git.Repo)
case r of
@ -39,7 +39,7 @@ dispatch oneshot args cmds commonoptions header getgitrepo = do
(actions, state') <- Annex.run state $ do
sequence_ flags
prepCommand cmd params
tryRun state' cmd $ [startup] ++ actions ++ [shutdown oneshot]
tryRun state' cmd $ [startup] ++ actions ++ [shutdown $ cmdoneshot cmd]
where
(flags, cmd, params) = parseCmd args cmds commonoptions header

View file

@ -8,6 +8,7 @@
module Command (
command,
noRepo,
oneShot,
withOptions,
next,
stop,
@ -39,7 +40,11 @@ import Annex.CheckAttr
{- Generates a normal command -}
command :: String -> String -> [CommandSeek] -> String -> Command
command = Command [] Nothing commonChecks
command = Command [] Nothing commonChecks False
{- Makes a command run in oneshot mode. -}
oneShot :: Command -> Command
oneShot c = c { cmdoneshot = True }
{- Adds a fallback action to a command, that will be run if it's used
- outside a git repository. -}

View file

@ -12,7 +12,7 @@ import Command
import Annex.UUID
def :: [Command]
def = [command "configlist" paramNothing seek
def = [oneShot $ command "configlist" paramNothing seek
"outputs relevant git configuration"]
seek :: [CommandSeek]

View file

@ -14,7 +14,7 @@ import Logs.Location
import Annex.Content
def :: [Command]
def = [command "dropkey" (paramRepeating paramKey) seek
def = [oneShot $ command "dropkey" (paramRepeating paramKey) seek
"drops annexed content for specified keys"]
seek :: [CommandSeek]

View file

@ -12,7 +12,7 @@ import Command
import Annex.Content
def :: [Command]
def = [command "inannex" (paramRepeating paramKey) seek
def = [oneShot $ command "inannex" (paramRepeating paramKey) seek
"checks if keys are present in the annex"]
seek :: [CommandSeek]

View file

@ -14,7 +14,7 @@ import Annex.Content
import Utility.RsyncFile
def :: [Command]
def = [command "recvkey" paramKey seek
def = [oneShot $ command "recvkey" paramKey seek
"runs rsync in server mode to receive content"]
seek :: [CommandSeek]

View file

@ -13,7 +13,7 @@ import Annex.Content
import Utility.RsyncFile
def :: [Command]
def = [command "sendkey" paramKey seek
def = [oneShot $ command "sendkey" paramKey seek
"runs rsync in server mode to send content"]
seek :: [CommandSeek]

View file

@ -11,10 +11,9 @@ import Common.Annex
import Command
import qualified Build.SysConfig as SysConfig
import Annex.Version
import CmdLine
def :: [Command]
def = [noRepo showPackageVersion $ dontCheck repoExists $
def = [oneShot $ noRepo showPackageVersion $ dontCheck repoExists $
command "version" paramNothing seek "show version info"]
seek :: [CommandSeek]
@ -29,9 +28,7 @@ start = do
putStrLn $ "default repository version: " ++ defaultVersion
putStrLn $ "supported repository versions: " ++ vs supportedVersions
putStrLn $ "upgrade supported from repository versions: " ++ vs upgradableVersions
-- avoid normal cleanup
_ <- shutdown True
liftIO exitSuccess
stop
where
vs = join " "

View file

@ -129,4 +129,4 @@ header :: String
header = "Usage: git-annex command [option ..]"
run :: [String] -> IO ()
run args = dispatch False args cmds options header Git.Construct.fromCurrent
run args = dispatch args cmds options header Git.Construct.fromCurrent

View file

@ -36,6 +36,7 @@ data Command = Command
{ cmdoptions :: [Option] -- command-specific options
, cmdnorepo :: Maybe (IO ()) -- an action to run when not in a repo
, cmdcheck :: [CommandCheck] -- check stage
, cmdoneshot :: Bool -- don't save state after running
, cmdname :: String
, cmdparamdesc :: String -- description of params for usage
, cmdseek :: [CommandSeek] -- seek stage

View file

@ -82,7 +82,7 @@ builtins = map cmdname cmds
builtin :: String -> String -> [String] -> IO ()
builtin cmd dir params = do
checkNotReadOnly cmd
dispatch True (cmd : filterparams params) cmds options header $
dispatch (cmd : filterparams params) cmds options header $
Git.Construct.repoAbsPath dir >>= Git.Construct.fromAbsPath
external :: [String] -> IO ()