home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / share / pycentral-data / pyversions.py
Encoding:
Python Source  |  2006-08-15  |  7.5 KB  |  206 lines

  1. import os, re, sys
  2. try:
  3.     SetType = set
  4. except NameError:
  5.     import sets
  6.     SetType = sets.Set
  7.     set = sets.Set
  8.  
  9. def parse_versions(vstring):
  10.     import operator
  11.     operators = { None: operator.eq, '=': operator.eq,
  12.                   '>=': operator.ge, '<=': operator.le,
  13.                   '<<': operator.lt
  14.                   }
  15.     vinfo = {}
  16.     exact_versions = set([])
  17.     version_range = set(supported_versions(version_only=True))
  18.     relop_seen = False
  19.     for field in vstring.split(','):
  20.         field = field.strip()
  21.         if field == 'all':
  22.             vinfo['all'] = 'all'
  23.             continue
  24.         if field in ('current', 'current_ext'):
  25.             vinfo['current'] = field
  26.             continue
  27.         vinfo.setdefault('versions', set())
  28.         ve = re.compile('(>=|<=|<<|=)? *(\d\.\d)$')
  29.         m = ve.match(field)
  30.         try:
  31.             op, v = m.group(1), m.group(2)
  32.             if op in (None, '='):
  33.                 exact_versions.add(v)
  34.             else:
  35.                 relop_seen = True
  36.                 filtop = operators[op]
  37.                 version_range = [av for av in version_range if filtop(av ,v)]
  38.         except Exception:
  39.             raise ValueError, 'error parsing Python-Version attribute'
  40.     if 'versions' in vinfo:
  41.         vinfo['versions'] = exact_versions
  42.         if relop_seen:
  43.             vinfo['versions'] = exact_versions.union(version_range)
  44.     return vinfo
  45.  
  46. _supported_versions = None
  47. def supported_versions(version_only=False):
  48.     global _supported_versions
  49.     if not _supported_versions:
  50.         if os.path.exists('/usr/share/python/debian_defaults'):
  51.             from ConfigParser import SafeConfigParser
  52.             config = SafeConfigParser()
  53.             config.readfp(file('/usr/share/python/debian_defaults'))
  54.             value = config.get('DEFAULT', 'supported-versions')
  55.             _supported_versions = [s.strip() for s in value.split(',')]
  56.         else:
  57.             cmd = ['/usr/bin/apt-cache', '--no-all-versions',
  58.                    'show', 'python-all']
  59.             try:
  60.                 import subprocess
  61.                 p = subprocess.Popen(cmd, bufsize=1,
  62.                                      shell=False, stdout=subprocess.PIPE)
  63.                 fd = p.stdout
  64.             except ImportError:
  65.                 fd = os.popen(' '.join(cmd))
  66.             depends = None
  67.             for line in fd:
  68.                 if line.startswith('Depends:'):
  69.                     depends = line.split(':', 1)[1].strip().split(',')
  70.             fd.close()
  71.             depends = [re.sub(r'\s*(\S+)[ (]?.*', r'\1', s) for s in depends]
  72.             _supported_versions = depends
  73.     if version_only:
  74.         return [v[6:] for v in _supported_versions]
  75.     else:
  76.         return _supported_versions
  77.  
  78. _default_version = None
  79. def default_version(version_only=False):
  80.     global _default_version
  81.     if not _default_version:
  82.         _default_version = link = os.readlink('/usr/bin/python')
  83.     if version_only:
  84.         return _default_version[6:]
  85.     else:
  86.         return _default_version
  87.  
  88. def requested_versions(vstring, version_only=False):
  89.     versions = None
  90.     vinfo = parse_versions(vstring)
  91.     supported = supported_versions(version_only=True)
  92.     if len(vinfo) == 1:
  93.         if 'all' in vinfo:
  94.             versions = supported
  95.         elif 'current' in vinfo:
  96.             versions = [default_version(version_only=True)]
  97.         else:
  98.             versions = vinfo['versions'].intersection(supported)
  99.     elif 'all' in vinfo and 'current' in vinfo:
  100.         raise ValueError, "both `current' and `all' in version string"
  101.     elif 'all' in vinfo:
  102.         versions = versions = vinfo['versions'].intersection(supported)
  103.     elif 'current' in vinfo:
  104.         current = default_version(version_only=True)
  105.         if not current in vinfo['versions']:
  106.             raise ValueError, "`current' version not in supported versions"
  107.         versions = [current]
  108.     else:
  109.         raise ValueError, 'error in version string'
  110.     if not versions:
  111.         raise ValueError, 'empty set of versions'
  112.     if version_only:
  113.         return versions
  114.     else:
  115.         return ['python%s' % v for v in versions]
  116.  
  117. def installed_versions(version_only=False):
  118.     import glob
  119.     supported = supported_versions()
  120.     versions = [os.path.basename(s)
  121.                 for s in glob.glob('/usr/bin/python[0-9].[0-9]')
  122.                 if os.path.basename(s) in supported]
  123.     versions.sort()
  124.     if version_only:
  125.         return [v[6:] for v in versions]
  126.     else:
  127.         return versions
  128.  
  129. def extract_pyversion_attribute(fn, pkg):
  130.     """read the debian/control file, extract the XS-Python-Version
  131.     field; check that XB-Python-Version exists for the package."""
  132.  
  133.     version = None
  134.     sversion = None
  135.     section = None
  136.     for line in file(fn):
  137.         line = line.strip()
  138.         if line == '':
  139.             section = None
  140.         elif line.startswith('Source:'):
  141.             section = 'Source'
  142.         elif line.startswith('Package: ' + pkg):
  143.             section = self.name
  144.         elif line.startswith('XS-Python-Version:'):
  145.             if section != 'Source':
  146.                 raise ValueError, \
  147.                       'attribute XS-Python-Version not in Source section'
  148.             sversion = line.split(':', 1)[1].strip()
  149.         elif line.startswith('XB-Python-Version:'):
  150.             if section == pkg:
  151.                 version = line.split(':', 1)[1].strip()
  152.     if pkg == 'Source':
  153.         if sversion == None:
  154.             raise ValueError, 'missing XS-Python-Version in control file'
  155.         return sversion
  156.     if version == None:
  157.         raise ValueError, \
  158.               'missing XB-Python-Version for package `%s' % pkg
  159.     return version
  160.  
  161.  
  162. def main():
  163.     from optparse import OptionParser
  164.     usage = '[-v] [-h] [-d|--default] [-s|--supported] [-i|--installed] [-r|--requested <version string>|<control file>]'
  165.     parser = OptionParser(usage=usage)
  166.     parser.add_option('-d', '--default',
  167.                       help='print the default python version',
  168.                       action='store_true', dest='default')
  169.     parser.add_option('-s', '--supported',
  170.                       help='print the supported python versions',
  171.                       action='store_true', dest='supported')
  172.     parser.add_option('-r', '--requested',
  173.                       help='print the python versions requested by a build; the argument is either the name of a control file or the value of the XS-Python-Version attribute',
  174.                       action='store', dest='versions')
  175.     parser.add_option('-i', '--installed',
  176.                       help='print the installed supported python versions',
  177.                       action='store_true', dest='installed')
  178.     parser.add_option('-v', '--version',
  179.                       help='print just the version number(s)',
  180.                       default=False, action='store_true', dest='version_only')
  181.     opts, args = parser.parse_args()
  182.     program = os.path.basename(sys.argv[0])
  183.  
  184.     if opts.default:
  185.         print default_version(opts.version_only)
  186.     elif opts.supported:
  187.         print ' '.join(supported_versions(opts.version_only))
  188.     elif opts.installed:
  189.         print ' '.join(installed_versions(opts.version_only))
  190.     elif opts.versions:
  191.         try:
  192.             if os.path.isfile(opts.versions):
  193.                 vs = extract_pyversion_attribute(opts.versions, 'Source')
  194.             else:
  195.                 vs = opts.versions
  196.             print ' '.join(requested_versions(vs, opts.version_only))
  197.         except ValueError, msg:
  198.             print "%s: %s" % (program, msg)
  199.             sys.exit(1)
  200.     else:
  201.         print "usage: %s %s" % (program, usage)
  202.         sys.exit(1)
  203.  
  204. if __name__ == '__main__':
  205.     main()
  206.