summaryrefslogtreecommitdiffstats
path: root/Lib/distutils/fancy_getopt.py
diff options
context:
space:
mode:
authorGreg Ward <gward@python.net>1999-10-03 20:48:53 (GMT)
committerGreg Ward <gward@python.net>1999-10-03 20:48:53 (GMT)
commita564cc315b39a8e709ba1eed5ea1ac417c84759c (patch)
tree5308275fc1387c4508742c31e04f800e7abb6472 /Lib/distutils/fancy_getopt.py
parentc74138d941114e31882988bb846b04103e2d7b0b (diff)
downloadcpython-a564cc315b39a8e709ba1eed5ea1ac417c84759c.zip
cpython-a564cc315b39a8e709ba1eed5ea1ac417c84759c.tar.gz
cpython-a564cc315b39a8e709ba1eed5ea1ac417c84759c.tar.bz2
Hacked to support the notion of "negative alias" options, to handle
-q/--quiet reasonably elegantly.
Diffstat (limited to 'Lib/distutils/fancy_getopt.py')
-rw-r--r--Lib/distutils/fancy_getopt.py35
1 files changed, 32 insertions, 3 deletions
diff --git a/Lib/distutils/fancy_getopt.py b/Lib/distutils/fancy_getopt.py
index 125dceb..3df2d1d 100644
--- a/Lib/distutils/fancy_getopt.py
+++ b/Lib/distutils/fancy_getopt.py
@@ -21,7 +21,12 @@ from distutils.errors import *
# the same as a Python NAME -- except, in the spirit of most GNU
# utilities, we use '-' in place of '_'. (The spirit of LISP lives on!)
# The similarities to NAME are again not a coincidence...
-longopt_re = re.compile (r'^[a-zA-Z]([a-zA-Z0-9-]*)$')
+longopt_pat = r'[a-zA-Z](?:[a-zA-Z0-9-]*)'
+longopt_re = re.compile (r'^%s$' % longopt_pat)
+
+# For recognizing "negative alias" options, eg. "quiet=!verbose"
+neg_alias_re = re.compile ("^(%s)=!(%s)$" % (longopt_pat, longopt_pat))
+
# This is used to translate long options to legitimate Python identifiers
# (for use as attributes of some object).
@@ -46,6 +51,7 @@ def fancy_getopt (options, object, args):
short2long = {}
attr_name = {}
takes_arg = {}
+ neg_alias = {}
for option in options:
try:
@@ -73,7 +79,26 @@ def fancy_getopt (options, object, args):
long = long[0:-1]
takes_arg[long] = 1
else:
- takes_arg[long] = 0
+
+ # Is option is a "negative alias" for some other option (eg.
+ # "quiet=!verbose")?
+ match = neg_alias_re.match (long)
+ if match:
+ (alias_from, alias_to) = match.group (1,2)
+ if not takes_arg.has_key(alias_to) or takes_arg[alias_to]:
+ raise DistutilsGetoptError, \
+ ("option '%s' is a negative alias for '%s', " +
+ "which either hasn't been defined yet " +
+ "or takes an argument") % (alias_from, alias_to)
+
+ long = alias_from
+ neg_alias[long] = alias_to
+ long_opts[-1] = long
+ takes_arg[long] = 0
+
+ else:
+ takes_arg[long] = 0
+
# Now enforce some bondage on the long option name, so we can later
# translate it to an attribute name in 'object'. Have to do this a
@@ -112,7 +137,11 @@ def fancy_getopt (options, object, args):
setattr (object, attr, val)
else:
if val == '':
- setattr (object, attr, 1)
+ alias = neg_alias.get (opt)
+ if alias:
+ setattr (object, attr_name[alias], 0)
+ else:
+ setattr (object, attr, 1)
else:
raise RuntimeError, "getopt lies! (bad value '%s')" % value