[Python-checkins] CVS: python/dist/src/Lib getopt.py,1.11,1.12

Tim Peters python-dev@python.org
Wed, 27 Dec 2000 00:05:07 -0800


Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv796/python/dist/src/lib

Modified Files:
	getopt.py 
Log Message:
Fix for SF bug
https://sourceforge.net/bugs/?func=detailbug&bug_id=126863&group_id=5470
"getopt long option handling broken".  Tossed the excruciating logic in
long_has_args in favor of something obviously correct.


Index: getopt.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/getopt.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -r1.11 -r1.12
*** getopt.py	2000/02/25 16:34:11	1.11
--- getopt.py	2000/12/27 08:05:05	1.12
***************
*** 67,71 ****
          longopts = list(longopts)
      longopts.sort()
!     while args and args[0][:1] == '-' and args[0] != '-':
          if args[0] == '--':
              args = args[1:]
--- 67,71 ----
          longopts = list(longopts)
      longopts.sort()
!     while args and args[0].startswith('-') and args[0] != '-':
          if args[0] == '--':
              args = args[1:]
***************
*** 81,87 ****
      try:
          i = opt.index('=')
-         opt, optarg = opt[:i], opt[i+1:]
      except ValueError:
          optarg = None
  
      has_arg, opt = long_has_args(opt, longopts)
--- 81,88 ----
      try:
          i = opt.index('=')
      except ValueError:
          optarg = None
+     else:
+         opt, optarg = opt[:i], opt[i+1:]
  
      has_arg, opt = long_has_args(opt, longopts)
***************
*** 99,115 ****
  #   has_arg?
  #   full option name
  def long_has_args(opt, longopts):
-     optlen = len(opt)
      for i in range(len(longopts)):
!         x, y = longopts[i][:optlen], longopts[i][optlen:]
!         if opt != x:
!             continue
!         if y != '' and y != '=' and i+1 < len(longopts):
!             if opt == longopts[i+1][:optlen]:
!                 raise GetoptError('option --%s not a unique prefix' % opt, opt)
!         if longopts[i][-1:] in ('=', ):
!             return 1, longopts[i][:-1]
!         return 0, longopts[i]
!     raise GetoptError('option --%s not recognized' % opt, opt)
  
  def do_shorts(opts, optstring, shortopts, args):
--- 100,132 ----
  #   has_arg?
  #   full option name
+ # Assumes longopts has been sorted (ASCII order).
  def long_has_args(opt, longopts):
      for i in range(len(longopts)):
!         if longopts[i].startswith(opt):
!             break
!     else:
!         raise GetoptError('option --%s not recognized' % opt, opt)
!     # opt is a prefix of longopts[i]; find j s.t. opt is a prefix of
!     # each possibility in longopts[i:j]
!     j = i+1
!     while j < len(longopts) and longopts[j].startswith(opt):
!         j += 1
!     possibilities = longopts[i:j]
!     # Is there an exact match?
!     if opt in possibilities:
!         return 0, opt
!     elif opt + '=' in possibilities:
!         return 1, opt
!     # No exact match, so better be unique.
!     if len(possibilities) > 1:
!         # XXX since possibilities contains all valid continuations, might be
!         # nice to work them into the error msg
!         raise GetoptError('option --%s not a unique prefix' % opt, opt)
!     assert len(possibilities) == 1
!     unique_match = possibilities[0]
!     has_arg = unique_match.endswith('=')
!     if has_arg:
!         unique_match = unique_match[:-1]
!     return has_arg, unique_match
  
  def do_shorts(opts, optstring, shortopts, args):