2011-01-16 20:05:05 +00:00
|
|
|
|
{- git-annex command line parsing and dispatch
|
2010-11-02 23:04:24 +00:00
|
|
|
|
-
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
- Copyright 2010-2021 Joey Hess <id@joeyh.name>
|
2010-11-02 23:04:24 +00:00
|
|
|
|
-
|
2019-03-13 19:48:14 +00:00
|
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
2010-11-02 23:04:24 +00:00
|
|
|
|
-}
|
|
|
|
|
|
2010-12-30 19:06:26 +00:00
|
|
|
|
module CmdLine (
|
2010-12-30 20:52:24 +00:00
|
|
|
|
dispatch,
|
2010-12-31 00:08:22 +00:00
|
|
|
|
usage,
|
2019-01-04 17:43:53 +00:00
|
|
|
|
parseCmd,
|
|
|
|
|
prepRunCommand,
|
2010-12-30 19:06:26 +00:00
|
|
|
|
) where
|
2010-11-02 23:04:24 +00:00
|
|
|
|
|
2015-07-08 23:38:56 +00:00
|
|
|
|
import qualified Options.Applicative as O
|
2015-07-09 15:49:52 +00:00
|
|
|
|
import qualified Options.Applicative.Help as H
|
2024-09-26 22:43:59 +00:00
|
|
|
|
import qualified Data.List.NonEmpty as NE
|
2011-11-16 04:49:09 +00:00
|
|
|
|
import Control.Exception (throw)
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
import Control.Monad.IO.Class (MonadIO)
|
|
|
|
|
import System.Exit
|
2010-11-02 23:04:24 +00:00
|
|
|
|
|
2016-01-20 20:36:33 +00:00
|
|
|
|
import Annex.Common
|
2010-11-02 23:04:24 +00:00
|
|
|
|
import qualified Annex
|
2011-06-30 17:16:57 +00:00
|
|
|
|
import qualified Git
|
2012-04-12 19:34:41 +00:00
|
|
|
|
import qualified Git.AutoCorrect
|
2014-08-23 23:51:33 +00:00
|
|
|
|
import qualified Git.Config
|
remove dead nodes when loading the cluster log
This is to avoid inserting a cluster uuid into the location log when
only dead nodes in the cluster contain the content of a key.
One reason why this is necessary is Remote.keyLocations, which excludes
dead repositories from the list. But there are probably many more.
Implementing this was challenging, because Logs.Location importing
Logs.Cluster which imports Logs.Trust which imports Remote.List resulted
in an import cycle through several other modules.
Resorted to making Logs.Location not import Logs.Cluster, and instead
it assumes that Annex.clusters gets populated when necessary before it's
called.
That's done in Annex.Startup, which is run by the git-annex command
(but not other commands) at early startup in initialized repos. Or,
is run after initialization.
Note that is Remote.Git, it is unable to import Annex.Startup, because
Remote.Git importing Logs.Cluster leads the the same import cycle.
So ensureInitialized is not passed annexStartup in there.
Other commands, like git-annex-shell currently don't run annexStartup
either.
So there are cases where Logs.Location will not see clusters. So it won't add
any cluster UUIDs when loading the log. That's ok, the only reason to do
that is to make display of where objects are located include clusters,
and to make commands like git-annex get --from treat keys as being located
in a cluster. git-annex-shell certainly does not do anything like that,
and I'm pretty sure Remote.Git (and callers to Remote.Git.onLocalRepo)
don't either.
2024-06-16 18:35:07 +00:00
|
|
|
|
import Annex.Startup
|
2015-07-31 20:00:13 +00:00
|
|
|
|
import Annex.Action
|
2013-04-22 19:36:34 +00:00
|
|
|
|
import Annex.Environment
|
2010-11-02 23:04:24 +00:00
|
|
|
|
import Command
|
2013-07-31 00:24:27 +00:00
|
|
|
|
import Types.Messages
|
2010-11-02 23:04:24 +00:00
|
|
|
|
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
{- Parses input arguments, finds a matching Command, and runs it. -}
|
|
|
|
|
dispatch :: Bool -> Bool -> CmdParams -> [Command] -> [(String, String)] -> IO Git.Repo -> String -> String -> IO ()
|
2024-08-24 15:49:58 +00:00
|
|
|
|
dispatch addonok fuzzyok allargs allcmds fields getgitrepo progname progdesc = do
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
go addonok allcmds $
|
|
|
|
|
findAddonCommand subcommandname >>= \case
|
2021-02-02 23:06:33 +00:00
|
|
|
|
Just c -> go addonok (c:allcmds) noop
|
|
|
|
|
Nothing -> go addonok allcmds $
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
findAllAddonCommands >>= \cs ->
|
|
|
|
|
go False (cs++allcmds) noop
|
|
|
|
|
where
|
|
|
|
|
go p allcmds' cont =
|
|
|
|
|
let (fuzzy, cmds) = selectCmd fuzzyok allcmds' subcommandname
|
|
|
|
|
in if not p || (not fuzzy && not (null cmds))
|
|
|
|
|
then dispatch' subcommandname args fuzzy cmds allargs allcmds' fields getgitrepo progname progdesc
|
|
|
|
|
else cont
|
|
|
|
|
|
|
|
|
|
(subcommandname, args) = subCmdName allargs
|
|
|
|
|
|
|
|
|
|
dispatch' :: (Maybe String) -> CmdParams -> Bool -> [Command] -> CmdParams -> [Command] -> [(String, String)] -> IO Git.Repo -> String -> String -> IO ()
|
|
|
|
|
dispatch' subcommandname args fuzzy cmds allargs allcmds fields getgitrepo progname progdesc = do
|
2011-03-12 19:30:17 +00:00
|
|
|
|
setupConsole
|
2020-06-05 19:16:57 +00:00
|
|
|
|
go =<< tryNonAsync getgitrepo
|
2015-07-08 16:33:27 +00:00
|
|
|
|
where
|
|
|
|
|
go (Right g) = do
|
2021-04-06 16:22:56 +00:00
|
|
|
|
g' <- Git.Config.read g
|
2022-06-29 17:28:08 +00:00
|
|
|
|
(cmd, seek, annexsetter) <- parsewith False cmdparser
|
2021-04-06 16:22:56 +00:00
|
|
|
|
(\a -> a (Just g'))
|
|
|
|
|
O.handleParseResult
|
2022-06-29 17:28:08 +00:00
|
|
|
|
state <- applyAnnexReadSetter annexsetter <$> Annex.new g'
|
2015-07-08 16:33:27 +00:00
|
|
|
|
Annex.eval state $ do
|
|
|
|
|
checkEnvironment
|
|
|
|
|
forM_ fields $ uncurry Annex.setField
|
2022-06-29 17:28:08 +00:00
|
|
|
|
prepRunCommand cmd annexsetter
|
2015-07-08 16:33:27 +00:00
|
|
|
|
startup
|
2021-06-04 20:43:47 +00:00
|
|
|
|
performCommandAction True cmd seek $
|
avoid flushing keys db queue after each Annex action
The flush was only done Annex.run' to make sure that the queue was flushed
before git-annex exits. But, doing it there means that as soon as one
change gets queued, it gets flushed soon after, which contributes to
excessive writes to the database, slowing git-annex down.
(This does not yet speed git-annex up, but it is a stepping stone to
doing so.)
Database queues do not autoflush when garbage collected, so have to
be flushed explicitly. I don't think it's possible to make them
autoflush (except perhaps if git-annex sqitched to using ResourceT..).
The comment in Database.Keys.closeDb used to be accurate, since the
automatic flushing did mean that all writes reached the database even
when closeDb was not called. But now, closeDb or flushDb needs to be
called before stopping using an Annex state. So, removed that comment.
In Remote.Git, change to using quiesce everywhere that it used to use
stopCoProcesses. This means that uses on onLocal in there are just as
slow as before. I considered only calling closeDb on the local git remotes
when git-annex exits. But, the reason that Remote.Git calls stopCoProcesses
in each onLocal is so as not to leave git processes running that have files
open on the remote repo, when it's on removable media. So, it seemed to make
sense to also closeDb after each one, since sqlite may also keep files
open. Although that has not seemed to cause problems with removable
media so far. It was also just easier to quiesce in each onLocal than
once at the end. This does likely leave performance on the floor, so
could be revisited.
In Annex.Content.saveState, there was no reason to close the db,
flushing it is enough.
The rest of the changes are from auditing for Annex.new, and making
sure that quiesce is called, after any action that might possibly need
it.
After that audit, I'm pretty sure that the change to Annex.run' is
safe. The only concern might be that this does let more changes get
queued for write to the db, and if git-annex is interrupted, those will be
lost. But interrupting git-annex can obviously already prevent it from
writing the most recent change to the db, so it must recover from such
lost data... right?
Sponsored-by: Dartmouth College's Datalad project
2022-10-12 17:50:46 +00:00
|
|
|
|
quiesce $ cmdnocommit cmd
|
2015-07-08 19:39:05 +00:00
|
|
|
|
go (Left norepo) = do
|
2015-09-09 19:55:13 +00:00
|
|
|
|
let ingitrepo = \a -> a =<< Git.Config.global
|
|
|
|
|
-- Parse command line with full cmdparser first,
|
|
|
|
|
-- so that help can be displayed for bad parses
|
|
|
|
|
-- even when not run in a repo.
|
|
|
|
|
res <- parsewith False cmdparser ingitrepo return
|
|
|
|
|
case res of
|
|
|
|
|
Failure _ -> void (O.handleParseResult res)
|
|
|
|
|
_ -> do
|
|
|
|
|
-- Parse command line in norepo mode.
|
|
|
|
|
(_, a, _globalconfig) <- parsewith True
|
|
|
|
|
(fromMaybe (throw norepo) . cmdnorepo)
|
|
|
|
|
ingitrepo
|
|
|
|
|
O.handleParseResult
|
|
|
|
|
a
|
2015-07-08 16:33:27 +00:00
|
|
|
|
|
2015-09-09 19:55:13 +00:00
|
|
|
|
parsewith secondrun getparser ingitrepo handleresult =
|
2021-02-02 19:55:45 +00:00
|
|
|
|
case parseCmd progname progdesc allargs allcmds getparser of
|
2015-07-08 23:38:56 +00:00
|
|
|
|
O.Failure _ -> do
|
|
|
|
|
-- parse failed, so fall back to
|
|
|
|
|
-- fuzzy matching, or to showing usage
|
2015-09-09 19:55:13 +00:00
|
|
|
|
when (fuzzy && not secondrun) $
|
2015-07-08 23:38:56 +00:00
|
|
|
|
ingitrepo autocorrect
|
2021-02-02 19:55:45 +00:00
|
|
|
|
handleresult (parseCmd progname progdesc correctedargs allcmds getparser)
|
2015-09-09 19:55:13 +00:00
|
|
|
|
res -> handleresult res
|
2015-07-08 23:38:56 +00:00
|
|
|
|
where
|
2024-09-26 22:43:59 +00:00
|
|
|
|
autocorrect = Git.AutoCorrect.prepare (fromJust subcommandname) cmdname (NE.fromList cmds)
|
2015-07-08 23:38:56 +00:00
|
|
|
|
name
|
|
|
|
|
| fuzzy = case cmds of
|
2015-07-09 15:49:52 +00:00
|
|
|
|
(c:_) -> Just (cmdname c)
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
_ -> subcommandname
|
|
|
|
|
| otherwise = subcommandname
|
2015-07-09 15:49:52 +00:00
|
|
|
|
correctedargs = case name of
|
|
|
|
|
Nothing -> allargs
|
|
|
|
|
Just n -> n:args
|
2015-07-08 16:33:27 +00:00
|
|
|
|
|
2015-07-08 19:39:05 +00:00
|
|
|
|
{- Parses command line, selecting one of the commands from the list. -}
|
2022-06-29 17:28:08 +00:00
|
|
|
|
parseCmd :: String -> String -> CmdParams -> [Command] -> (Command -> O.Parser v) -> O.ParserResult (Command, v, AnnexSetter)
|
2021-02-02 19:55:45 +00:00
|
|
|
|
parseCmd progname progdesc allargs allcmds getparser =
|
2015-07-10 06:03:03 +00:00
|
|
|
|
O.execParserPure (O.prefs O.idm) pinfo allargs
|
2015-07-08 16:33:27 +00:00
|
|
|
|
where
|
2015-07-10 06:18:08 +00:00
|
|
|
|
pinfo = O.info (O.helper <*> subcmds) (O.progDescDoc (Just intro))
|
2015-07-09 05:53:15 +00:00
|
|
|
|
subcmds = O.hsubparser $ mconcat $ map mkcommand allcmds
|
2015-07-09 15:49:52 +00:00
|
|
|
|
mkcommand c = O.command (cmdname c) $ O.info (mkparser c) $ O.fullDesc
|
|
|
|
|
<> O.header (synopsis (progname ++ " " ++ cmdname c) (cmddesc c))
|
|
|
|
|
<> O.footer ("For details, run: " ++ progname ++ " help " ++ cmdname c)
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
<> cmdinfomod c
|
2015-07-10 06:18:08 +00:00
|
|
|
|
mkparser c = (,,)
|
2015-07-08 16:33:27 +00:00
|
|
|
|
<$> pure c
|
2015-07-08 19:39:05 +00:00
|
|
|
|
<*> getparser c
|
2022-06-29 17:28:08 +00:00
|
|
|
|
<*> parserAnnexOptions (cmdannexoptions c)
|
2015-07-09 15:49:52 +00:00
|
|
|
|
synopsis n d = n ++ " - " ++ d
|
2023-06-21 14:46:54 +00:00
|
|
|
|
intro = mconcat $ concatMap (\l -> [H.pretty l, H.line])
|
2015-07-09 15:49:52 +00:00
|
|
|
|
(synopsis progname progdesc : commandList allcmds)
|
2010-12-30 19:44:15 +00:00
|
|
|
|
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
{- Selects the Command that matches the subcommand name.
|
2012-04-12 19:34:41 +00:00
|
|
|
|
- Does fuzzy matching if necessary, which may result in multiple Commands. -}
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
selectCmd :: Bool -> [Command] -> Maybe String -> (Bool, [Command])
|
|
|
|
|
selectCmd fuzzyok cmds (Just n)
|
2021-02-02 18:27:42 +00:00
|
|
|
|
| not (null exactcmds) = (False, exactcmds)
|
|
|
|
|
| fuzzyok && not (null inexactcmds) = (True, inexactcmds)
|
|
|
|
|
| otherwise = (False, [])
|
|
|
|
|
where
|
|
|
|
|
exactcmds = filter (\c -> cmdname c == n) cmds
|
|
|
|
|
inexactcmds = Git.AutoCorrect.fuzzymatches n cmdname cmds
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
selectCmd _ _ Nothing = (False, [])
|
2021-02-02 18:27:42 +00:00
|
|
|
|
|
|
|
|
|
{- Parses command line params far enough to find the subcommand name. -}
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
subCmdName :: CmdParams -> (Maybe String, CmdParams)
|
|
|
|
|
subCmdName argv = (name, args)
|
2012-11-11 04:51:07 +00:00
|
|
|
|
where
|
|
|
|
|
(name, args) = findname argv []
|
|
|
|
|
findname [] c = (Nothing, reverse c)
|
|
|
|
|
findname (a:as) c
|
|
|
|
|
| "-" `isPrefixOf` a = findname as (a:c)
|
|
|
|
|
| otherwise = (Just a, reverse c ++ as)
|
2019-01-04 17:43:53 +00:00
|
|
|
|
|
2022-06-29 17:28:08 +00:00
|
|
|
|
-- | Note that the AnnexSetter must have already had its annexReadSetter
|
2021-04-06 20:28:37 +00:00
|
|
|
|
-- applied before entering the Annex monad to run this; that cannot be
|
|
|
|
|
-- changed while running in the Annex monad.
|
2022-06-29 17:28:08 +00:00
|
|
|
|
prepRunCommand :: Command -> AnnexSetter -> Annex ()
|
|
|
|
|
prepRunCommand cmd annexsetter = do
|
2019-06-12 17:33:15 +00:00
|
|
|
|
when (cmdnomessages cmd) $
|
2019-01-04 17:43:53 +00:00
|
|
|
|
Annex.setOutput QuietOutput
|
2022-06-29 17:28:08 +00:00
|
|
|
|
annexStateSetter annexsetter
|
2021-04-06 20:28:37 +00:00
|
|
|
|
whenM (Annex.getRead Annex.debugenabled) $
|
2021-04-05 19:21:20 +00:00
|
|
|
|
enableDebugOutput
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
|
|
|
|
|
findAddonCommand :: Maybe String -> IO (Maybe Command)
|
|
|
|
|
findAddonCommand Nothing = return Nothing
|
|
|
|
|
findAddonCommand (Just subcommandname) =
|
|
|
|
|
searchPath c >>= \case
|
|
|
|
|
Nothing -> return Nothing
|
|
|
|
|
Just p -> return (Just (mkAddonCommand p subcommandname))
|
|
|
|
|
where
|
|
|
|
|
c = "git-annex-" ++ subcommandname
|
|
|
|
|
|
|
|
|
|
findAllAddonCommands :: IO [Command]
|
2021-02-02 23:06:33 +00:00
|
|
|
|
findAllAddonCommands =
|
|
|
|
|
filter isaddoncommand
|
|
|
|
|
. map (\p -> mkAddonCommand p (deprefix p))
|
|
|
|
|
<$> searchPathContents ("git-annex-" `isPrefixOf`)
|
|
|
|
|
where
|
|
|
|
|
deprefix = replace "git-annex-" "" . takeFileName
|
|
|
|
|
isaddoncommand c
|
|
|
|
|
-- git-annex-shell
|
|
|
|
|
| cmdname c == "shell" = False
|
|
|
|
|
-- external special remotes
|
|
|
|
|
| "remote-" `isPrefixOf` cmdname c = False
|
|
|
|
|
-- external backends
|
|
|
|
|
| "backend-" `isPrefixOf` cmdname c = False
|
|
|
|
|
| otherwise = True
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
|
|
|
|
|
mkAddonCommand :: FilePath -> String -> Command
|
|
|
|
|
mkAddonCommand p subcommandname = Command
|
|
|
|
|
{ cmdcheck = []
|
|
|
|
|
, cmdnocommit = True
|
|
|
|
|
, cmdnomessages = True
|
|
|
|
|
, cmdname = subcommandname
|
|
|
|
|
, cmdparamdesc = "[PARAMS]"
|
|
|
|
|
, cmdsection = SectionAddOn
|
|
|
|
|
, cmddesc = "addon command"
|
2022-06-29 17:28:08 +00:00
|
|
|
|
, cmdannexoptions = []
|
addon commands
Seems only fair, that, like git runs git-annex, git-annex runs
git-annex-foo.
Implementation relies on O.forwardOptions, so that any options are passed
through to the addon program. Note that this includes options before the
subcommand, eg: git-annex -cx=y foo
Unfortunately, git-annex eats the --help/-h options.
This is because it uses O.hsubparser, which injects that option into each
subcommand. Seems like this should be possible to avoid somehow, to let
commands display their own --help, instead of the dummy one git-annex
displays.
The two step searching mirrors how git works, it makes finding
git-annex-foo fast when "git annex foo" is run, but will also support fuzzy
matching, once findAllAddonCommands gets implemented.
This commit was sponsored by Dr. Land Raider on Patreon.
2021-02-02 20:32:25 +00:00
|
|
|
|
, cmdinfomod = O.forwardOptions
|
|
|
|
|
, cmdparser = parse
|
|
|
|
|
, cmdnorepo = Just parse
|
|
|
|
|
}
|
|
|
|
|
where
|
|
|
|
|
parse :: (Monad m, MonadIO m) => Parser (m ())
|
|
|
|
|
parse = (liftIO . run) <$> cmdParams "PARAMS"
|
|
|
|
|
|
|
|
|
|
run ps = withCreateProcess (proc p ps) $ \_ _ _ pid ->
|
|
|
|
|
exitWith =<< waitForProcess pid
|