Home | History | Annotate | Download | only in extensions
      1 # -*- coding: utf-8 -*-
      2 """
      3     patchlevel.py
      4     ~~~~~~~~~~~~~
      5 
      6     Extract version info from Include/patchlevel.h.
      7     Adapted from Doc/tools/getversioninfo.
      8 
      9     :copyright: 2007-2008 by Georg Brandl.
     10     :license: Python license.
     11 """
     12 
     13 import os
     14 import re
     15 import sys
     16 
     17 def get_header_version_info(srcdir):
     18     patchlevel_h = os.path.join(srcdir, '..', 'Include', 'patchlevel.h')
     19 
     20     # This won't pick out all #defines, but it will pick up the ones we
     21     # care about.
     22     rx = re.compile(r'\s*#define\s+([a-zA-Z][a-zA-Z_0-9]*)\s+([a-zA-Z_0-9]+)')
     23 
     24     d = {}
     25     f = open(patchlevel_h)
     26     try:
     27         for line in f:
     28             m = rx.match(line)
     29             if m is not None:
     30                 name, value = m.group(1, 2)
     31                 d[name] = value
     32     finally:
     33         f.close()
     34 
     35     release = version = '%s.%s' % (d['PY_MAJOR_VERSION'], d['PY_MINOR_VERSION'])
     36     micro = int(d['PY_MICRO_VERSION'])
     37     if micro != 0:
     38         release += '.' + str(micro)
     39 
     40     level = d['PY_RELEASE_LEVEL']
     41     suffixes = {
     42         'PY_RELEASE_LEVEL_ALPHA': 'a',
     43         'PY_RELEASE_LEVEL_BETA':  'b',
     44         'PY_RELEASE_LEVEL_GAMMA': 'rc',
     45         }
     46     if level != 'PY_RELEASE_LEVEL_FINAL':
     47         release += suffixes[level] + str(int(d['PY_RELEASE_SERIAL']))
     48     return version, release
     49 
     50 
     51 def get_sys_version_info():
     52     major, minor, micro, level, serial = sys.version_info
     53     release = version = '%s.%s' % (major, minor)
     54     if micro:
     55         release += '.%s' % micro
     56     if level != 'final':
     57         release += '%s%s' % (level[0], serial)
     58     return version, release
     59 
     60 
     61 def get_version_info():
     62     try:
     63         return get_header_version_info('.')
     64     except (IOError, OSError):
     65         version, release = get_sys_version_info()
     66         print >>sys.stderr, 'Can\'t get version info from Include/patchlevel.h, ' \
     67               'using version of this interpreter (%s).' % release
     68         return version, release
     69 
     70 if __name__ == '__main__':
     71     print(get_header_version_info('.')[1])
     72