]> granicus.if.org Git - python/commitdiff
Fixed some bugs and mis-features in handling config files:
authorGreg Ward <gward@python.net>
Mon, 25 Sep 2000 01:23:52 +0000 (01:23 +0000)
committerGreg Ward <gward@python.net>
Mon, 25 Sep 2000 01:23:52 +0000 (01:23 +0000)
  * 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

Lib/distutils/dist.py

index c5fe86ebbf7640e065af3220693e28bb4d3076b5..f821e0aa30a0a9234026d973c89f4a0d0fe68b0c 100644 (file)
@@ -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