diff options
author | Greg Ward <gward@python.net> | 2000-09-25 01:23:52 (GMT) |
---|---|---|
committer | Greg Ward <gward@python.net> | 2000-09-25 01:23:52 (GMT) |
commit | ceb9e226a638301e68420d7b6728bdc86fd30f0c (patch) | |
tree | bfa4fcb980c23b2490404c0e605652443d12ef60 | |
parent | 84da8aa7e2f1bdaf8692dbfd9981430c84278038 (diff) | |
download | cpython-ceb9e226a638301e68420d7b6728bdc86fd30f0c.zip cpython-ceb9e226a638301e68420d7b6728bdc86fd30f0c.tar.gz cpython-ceb9e226a638301e68420d7b6728bdc86fd30f0c.tar.bz2 |
Fixed some bugs and mis-features in handling config files:
* options can now be spelled "foo-bar" or "foo_bar" (handled in
'parse_config_files()', just after we parse a file)
* added a "[global]" section so there's a place to set global
options like verbose/quiet and dry-run
* respect the "negative alias" dictionary so (eg.) "quiet=1" is
the same as "verbose=0" (this had to be done twice: once in
'parse_config_file()' for global options, and once in
'_set_command_options()' for per-command options)
* the other half of handling boolean options correctly: allow
commands to list their boolean options in a 'boolean_options'
class attribute, and use it to translate strings (like "yes", "1",
"no", "0", etc) to true or false
-rw-r--r-- | Lib/distutils/dist.py | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/Lib/distutils/dist.py b/Lib/distutils/dist.py index c5fe86e..f821e0a 100644 --- a/Lib/distutils/dist.py +++ b/Lib/distutils/dist.py @@ -15,7 +15,7 @@ from copy import copy from distutils.errors import * from distutils import sysconfig from distutils.fancy_getopt import FancyGetopt, longopt_xlate -from distutils.util import check_environ +from distutils.util import check_environ, strtobool # Regex to define acceptable Distutils command names. This is not *quite* @@ -321,7 +321,9 @@ class Distribution: for opt in options: if opt != '__name__': - opt_dict[opt] = (filename, parser.get(section,opt)) + val = parser.get(section,opt) + opt = string.replace(opt, '-', '_') + opt_dict[opt] = (filename, val) # Make the ConfigParser forget everything (so we retain # the original filenames that options come from) -- gag, @@ -329,6 +331,22 @@ class Distribution: # specific config parser (sigh...) parser.__init__() + # If there was a "global" section in the config file, use it + # to set Distribution options. + + if self.command_options.has_key('global'): + for (opt, (src, val)) in self.command_options['global'].items(): + alias = self.negative_opt.get(opt) + try: + if alias: + setattr(self, alias, not strtobool(val)) + elif opt in ('verbose', 'dry_run'): # ugh! + setattr(self, opt, strtobool(val)) + except ValueError, msg: + raise DistutilsOptionError, msg + + # parse_config_files () + # -- Command-line parsing methods ---------------------------------- @@ -346,7 +364,7 @@ class Distribution: attribute raises DistutilsGetoptError; any error on the command-line raises DistutilsArgError. If no Distutils commands were found on the command line, raises DistutilsArgError. Return - true if command-line were successfully parsed and we should carry + true if command-line was successfully parsed and we should carry on with executing commands; false if no errors but we shouldn't execute commands (currently, this only happens if user asks for help). @@ -714,7 +732,7 @@ class Distribution: this means copying elements of a dictionary ('option_dict') to attributes of an instance ('command'). - 'command_obj' must be a Commnd instance. If 'option_dict' is not + 'command_obj' must be a Command instance. If 'option_dict' is not supplied, uses the standard option dictionary for this command (from 'self.command_options'). """ @@ -727,11 +745,28 @@ class Distribution: if DEBUG: print " setting options for '%s' command:" % command_name for (option, (source, value)) in option_dict.items(): if DEBUG: print " %s = %s (from %s)" % (option, value, source) - if not hasattr(command_obj, option): - raise DistutilsOptionError, \ - ("error in %s: command '%s' has no such option '%s'") % \ - (source, command_name, option) - setattr(command_obj, option, value) + try: + bool_opts = command_obj.boolean_options + except AttributeError: + bool_opts = [] + try: + neg_opt = command_obj.negative_opt + except AttributeError: + neg_opt = {} + + try: + if neg_opt.has_key(option): + setattr(command_obj, neg_opt[option], not strtobool(value)) + elif option in bool_opts: + setattr(command_obj, option, strtobool(value)) + elif hasattr(command_obj, option): + setattr(command_obj, option, value) + else: + raise DistutilsOptionError, \ + ("error in %s: command '%s' has no such option '%s'" + % (source, command_name, option)) + except ValueError, msg: + raise DistutilsOptionError, msg def reinitialize_command (self, command, reinit_subcommands=0): """Reinitializes a command to the state it was in when first |