Georg Brandl | 86def6c | 2008-01-21 20:36:10 +0000 | [diff] [blame] | 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 | |
Martin Panter | 9a45402 | 2017-01-29 23:33:13 +0000 | [diff] [blame] | 13 | from __future__ import print_function |
| 14 | |
Georg Brandl | 86def6c | 2008-01-21 20:36:10 +0000 | [diff] [blame] | 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 = {} |
Martin Panter | c654f0a | 2017-01-29 10:17:17 +0000 | [diff] [blame] | 27 | with open(patchlevel_h) as f: |
Georg Brandl | 86def6c | 2008-01-21 20:36:10 +0000 | [diff] [blame] | 28 | for line in f: |
| 29 | m = rx.match(line) |
| 30 | if m is not None: |
| 31 | name, value = m.group(1, 2) |
| 32 | d[name] = value |
Georg Brandl | 86def6c | 2008-01-21 20:36:10 +0000 | [diff] [blame] | 33 | |
| 34 | release = version = '%s.%s' % (d['PY_MAJOR_VERSION'], d['PY_MINOR_VERSION']) |
| 35 | micro = int(d['PY_MICRO_VERSION']) |
Martin v. Löwis | 24a05f7 | 2012-05-01 16:27:55 +0200 | [diff] [blame] | 36 | release += '.' + str(micro) |
Georg Brandl | 86def6c | 2008-01-21 20:36:10 +0000 | [diff] [blame] | 37 | |
| 38 | level = d['PY_RELEASE_LEVEL'] |
| 39 | suffixes = { |
| 40 | 'PY_RELEASE_LEVEL_ALPHA': 'a', |
| 41 | 'PY_RELEASE_LEVEL_BETA': 'b', |
Benjamin Peterson | b48f634 | 2009-06-22 19:36:31 +0000 | [diff] [blame] | 42 | 'PY_RELEASE_LEVEL_GAMMA': 'rc', |
Georg Brandl | 86def6c | 2008-01-21 20:36:10 +0000 | [diff] [blame] | 43 | } |
| 44 | if level != 'PY_RELEASE_LEVEL_FINAL': |
| 45 | release += suffixes[level] + str(int(d['PY_RELEASE_SERIAL'])) |
| 46 | return version, release |
| 47 | |
| 48 | |
| 49 | def get_sys_version_info(): |
| 50 | major, minor, micro, level, serial = sys.version_info |
| 51 | release = version = '%s.%s' % (major, minor) |
Martin v. Löwis | 24a05f7 | 2012-05-01 16:27:55 +0200 | [diff] [blame] | 52 | release += '.%s' % micro |
Georg Brandl | 86def6c | 2008-01-21 20:36:10 +0000 | [diff] [blame] | 53 | if level != 'final': |
| 54 | release += '%s%s' % (level[0], serial) |
| 55 | return version, release |
| 56 | |
| 57 | |
| 58 | def get_version_info(): |
| 59 | try: |
| 60 | return get_header_version_info('.') |
| 61 | except (IOError, OSError): |
| 62 | version, release = get_sys_version_info() |
Martin Panter | 8f3fb72 | 2017-01-29 10:05:02 +0000 | [diff] [blame] | 63 | print('Can\'t get version info from Include/patchlevel.h, ' \ |
| 64 | 'using version of this interpreter (%s).' % release, file=sys.stderr) |
Georg Brandl | 86def6c | 2008-01-21 20:36:10 +0000 | [diff] [blame] | 65 | return version, release |
Christian Heimes | b558a2e | 2008-03-02 22:46:37 +0000 | [diff] [blame] | 66 | |
| 67 | if __name__ == '__main__': |
Georg Brandl | a17fd1f | 2010-10-29 05:30:17 +0000 | [diff] [blame] | 68 | print(get_header_version_info('.')[1]) |