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 from __future__ import print_function
     14 
     15 import os
     16 import re
     17 import sys
     18 
     19 def get_header_version_info(srcdir):
     20     patchlevel_h = os.path.join(srcdir, '..', 'Include', 'patchlevel.h')
     21 
     22     # This won't pick out all #defines, but it will pick up the ones we
     23     # care about.
     24     rx = re.compile(r'\s*#define\s+([a-zA-Z][a-zA-Z_0-9]*)\s+([a-zA-Z_0-9]+)')
     25 
     26     d = {}
     27     f = open(patchlevel_h)
     28     try:
     29         for line in f:
     30             m = rx.match(line)
     31             if m is not None:
     32                 name, value = m.group(1, 2)
     33                 d[name] = value
     34     finally:
     35         f.close()
     36 
     37     release = version = '%s.%s' % (d['PY_MAJOR_VERSION'], d['PY_MINOR_VERSION'])
     38     micro = int(d['PY_MICRO_VERSION'])
     39     release += '.' + str(micro)
     40 
     41     level = d['PY_RELEASE_LEVEL']
     42     suffixes = {
     43         'PY_RELEASE_LEVEL_ALPHA': 'a',
     44         'PY_RELEASE_LEVEL_BETA':  'b',
     45         'PY_RELEASE_LEVEL_GAMMA': 'rc',
     46         }
     47     if level != 'PY_RELEASE_LEVEL_FINAL':
     48         release += suffixes[level] + str(int(d['PY_RELEASE_SERIAL']))
     49     return version, release
     50 
     51 
     52 def get_sys_version_info():
     53     major, minor, micro, level, serial = sys.version_info
     54     release = version = '%s.%s' % (major, minor)
     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('Can\'t get version info from Include/patchlevel.h, ' \
     67               'using version of this interpreter (%s).' % release, file=sys.stderr)
     68         return version, release
     69 
     70 if __name__ == '__main__':
     71     print(get_header_version_info('.')[1])
     72