diff options
author | Joey Hess <joey@kitenet.net> | 2011-09-18 18:21:42 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2011-09-18 18:21:42 -0400 |
commit | b9aa944b09e60badb99c65a87f5689e0ab9010e3 (patch) | |
tree | f7e72ecc47114f95a8989501b5935306ac2ebe7f | |
parent | 8a5a92480b9dcf691af1e8c4849cb71c4158b845 (diff) |
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
-rw-r--r-- | GitAnnex.hs | 6 | ||||
-rw-r--r-- | Limit.hs | 12 | ||||
-rw-r--r-- | Options.hs | 13 |
3 files changed, 22 insertions, 9 deletions
diff --git a/GitAnnex.hs b/GitAnnex.hs index bb0f85119..68c7a1805 100644 --- a/GitAnnex.hs +++ b/GitAnnex.hs @@ -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 } @@ -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 [] diff --git a/Options.hs b/Options.hs index ee3ce6620..44d5f3674 100644 --- a/Options.hs +++ b/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 |