add --and --or --not -( and -)
I dislike -( and -), but without using a different option parser, can't easily use bare parens. --and and --or will become more useful once there are more interesting limits than --exclude
This commit is contained in:
parent
8a5a92480b
commit
b9aa944b09
3 changed files with 22 additions and 9 deletions
|
@ -98,8 +98,6 @@ options = commonOptions ++
|
|||
"specify to where to transfer content"
|
||||
, Option ['f'] ["from"] (ReqArg setfrom paramRemote)
|
||||
"specify from where to transfer content"
|
||||
, Option ['x'] ["exclude"] (ReqArg (Limit.exclude) paramGlob)
|
||||
"skip files matching the glob pattern"
|
||||
, Option ['N'] ["numcopies"] (ReqArg setnumcopies paramNumber)
|
||||
"override default number of copies"
|
||||
, Option [] ["trust"] (ReqArg (Remote.forceTrust Trusted) paramRemote)
|
||||
|
@ -110,7 +108,9 @@ options = commonOptions ++
|
|||
"override trust setting to untrusted"
|
||||
, Option ['c'] ["config"] (ReqArg setgitconfig "NAME=VALUE")
|
||||
"override git configuration setting"
|
||||
]
|
||||
, Option ['x'] ["exclude"] (ReqArg (Limit.exclude) paramGlob)
|
||||
"skip files matching the glob pattern"
|
||||
] ++ matcherOptions
|
||||
where
|
||||
setto v = Annex.changeState $ \s -> s { Annex.toremote = Just v }
|
||||
setfrom v = Annex.changeState $ \s -> s { Annex.fromremote = Just v }
|
||||
|
|
12
Limit.hs
12
Limit.hs
|
@ -35,7 +35,7 @@ getMatcher = do
|
|||
Annex.changeState $ \s -> s { Annex.limit = Right matcher }
|
||||
return matcher
|
||||
|
||||
{- Adds something to the limit list. -}
|
||||
{- Adds something to the limit list, which is built up reversed. -}
|
||||
add :: Limit -> Annex ()
|
||||
add l = Annex.changeState $ \s -> s { Annex.limit = append $ Annex.limit s }
|
||||
where
|
||||
|
@ -43,16 +43,16 @@ add l = Annex.changeState $ \s -> s { Annex.limit = append $ Annex.limit s }
|
|||
append _ = error "internal"
|
||||
|
||||
{- Adds a new limit. -}
|
||||
addl :: (FilePath -> Annex Bool) -> Annex ()
|
||||
addl = add . Utility.Matcher.Operation
|
||||
addlimit :: (FilePath -> Annex Bool) -> Annex ()
|
||||
addlimit = add . Utility.Matcher.Operation
|
||||
|
||||
{- Adds a new token. -}
|
||||
addt :: String -> Annex ()
|
||||
addt = add . Utility.Matcher.Token
|
||||
token :: String -> Annex ()
|
||||
token = add . Utility.Matcher.Token
|
||||
|
||||
{- Add a limit to skip files that do not match the glob. -}
|
||||
exclude :: String -> Annex ()
|
||||
exclude glob = addl $ return . notExcluded
|
||||
exclude glob = addlimit $ return . notExcluded
|
||||
where
|
||||
notExcluded f = isNothing $ match cregex f []
|
||||
cregex = compile regex []
|
||||
|
|
13
Options.hs
13
Options.hs
|
@ -14,6 +14,7 @@ import Control.Monad.State (liftIO)
|
|||
import qualified Annex
|
||||
import Types
|
||||
import Command
|
||||
import Limit
|
||||
|
||||
{- Each dashed command-line option results in generation of an action
|
||||
- in the Annex monad that performs the necessary setting.
|
||||
|
@ -47,3 +48,15 @@ commonOptions =
|
|||
setforcebackend v = Annex.changeState $ \s -> s { Annex.forcebackend = Just v }
|
||||
setdebug = liftIO $ updateGlobalLogger rootLoggerName $
|
||||
setLevel DEBUG
|
||||
|
||||
matcherOptions :: [Option]
|
||||
matcherOptions =
|
||||
[ longopt "not" "negate next option"
|
||||
, longopt "and" "both previous and next option must match"
|
||||
, longopt "or" "either previous or next option must match"
|
||||
, shortopt "(" "open group of options"
|
||||
, shortopt ")" "close group of options"
|
||||
]
|
||||
where
|
||||
longopt o d = Option [] [o] (NoArg (token o)) d
|
||||
shortopt o d = Option o [] (NoArg (token o)) d
|
||||
|
|
Loading…
Reference in a new issue