mirror of https://github.com/python/cpython
Hacked to support the notion of "negative alias" options, to handle
-q/--quiet reasonably elegantly.
This commit is contained in:
parent
c74138d941
commit
a564cc315b
|
@ -21,7 +21,12 @@ from distutils.errors import *
|
||||||
# the same as a Python NAME -- except, in the spirit of most GNU
|
# 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!)
|
# utilities, we use '-' in place of '_'. (The spirit of LISP lives on!)
|
||||||
# The similarities to NAME are again not a coincidence...
|
# 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
|
# This is used to translate long options to legitimate Python identifiers
|
||||||
# (for use as attributes of some object).
|
# (for use as attributes of some object).
|
||||||
|
@ -46,6 +51,7 @@ def fancy_getopt (options, object, args):
|
||||||
short2long = {}
|
short2long = {}
|
||||||
attr_name = {}
|
attr_name = {}
|
||||||
takes_arg = {}
|
takes_arg = {}
|
||||||
|
neg_alias = {}
|
||||||
|
|
||||||
for option in options:
|
for option in options:
|
||||||
try:
|
try:
|
||||||
|
@ -73,8 +79,27 @@ def fancy_getopt (options, object, args):
|
||||||
long = long[0:-1]
|
long = long[0:-1]
|
||||||
takes_arg[long] = 1
|
takes_arg[long] = 1
|
||||||
else:
|
else:
|
||||||
|
|
||||||
|
# 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
|
takes_arg[long] = 0
|
||||||
|
|
||||||
|
else:
|
||||||
|
takes_arg[long] = 0
|
||||||
|
|
||||||
|
|
||||||
# Now enforce some bondage on the long option name, so we can later
|
# 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
|
# translate it to an attribute name in 'object'. Have to do this a
|
||||||
# bit late to make sure we've removed any trailing '='.
|
# bit late to make sure we've removed any trailing '='.
|
||||||
|
@ -112,6 +137,10 @@ def fancy_getopt (options, object, args):
|
||||||
setattr (object, attr, val)
|
setattr (object, attr, val)
|
||||||
else:
|
else:
|
||||||
if val == '':
|
if val == '':
|
||||||
|
alias = neg_alias.get (opt)
|
||||||
|
if alias:
|
||||||
|
setattr (object, attr_name[alias], 0)
|
||||||
|
else:
|
||||||
setattr (object, attr, 1)
|
setattr (object, attr, 1)
|
||||||
else:
|
else:
|
||||||
raise RuntimeError, "getopt lies! (bad value '%s')" % value
|
raise RuntimeError, "getopt lies! (bad value '%s')" % value
|
||||||
|
|
Loading…
Reference in New Issue