Hacked to support the notion of "negative alias" options, to handle
-q/--quiet reasonably elegantly.
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 @@
 # 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 @@
     short2long = {}
     attr_name = {}
     takes_arg = {}
+    neg_alias = {}
 
     for option in options:
         try:
@@ -73,7 +79,26 @@
             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 @@
             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