summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-09-18 18:21:42 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-09-18 18:21:42 -0400
commitb9aa944b09e60badb99c65a87f5689e0ab9010e3 (patch)
treef7e72ecc47114f95a8989501b5935306ac2ebe7f
parent8a5a92480b9dcf691af1e8c4849cb71c4158b845 (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.hs6
-rw-r--r--Limit.hs12
-rw-r--r--Options.hs13
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 }
diff --git a/Limit.hs b/Limit.hs
index 324baee2e..91ea3453c 100644
--- a/Limit.hs
+++ b/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 []
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