Changeset 3bd8def in rtems-tools for rtemstoolkit/version.py


Ignore:
Timestamp:
Oct 3, 2018, 1:38:09 AM (9 months ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
36fde51
Parents:
5416cfa
Message:

config: Consolidate the version information into a single configuration file

File:
1 edited

Legend:

Unmodified
Added
Removed
  • rtemstoolkit/version.py

    r5416cfa r3bd8def  
    11#
    22# RTEMS Tools Project (http://www.rtems.org/)
    3 # Copyright 2010-2016 Chris Johns (chrisj@rtems.org)
     3# Copyright 2010-2018 Chris Johns (chrisj@rtems.org)
    44# All rights reserved.
    55#
     
    3030
    3131#
    32 # To release RTEMS Tools create a git archive and then add a suitable VERSION
    33 # file to the top directory.
     32# Releasing RTEMS Tools
     33# ---------------------
     34#
     35# Format:
     36#
     37#  The format is INI. The file requires a `[version`] section and a `revision`
     38#  option:
     39#
     40#   [version]
     41#   revision = <version-string>
     42#
     43#  The `<version-string>` has the `version` and `revision` delimited by a
     44#  single `.`. An example file is:
     45#
     46#   [version]
     47#   revision = 5.0.not_released
     48#
     49#  where the `version` is `5` and the revision is `0` and the package is not
     50#  released. The label `not_released` is reversed to mean the package is not
     51#  released. A revision string can contain extra characters after the
     52#  `revision` number for example `5.0-rc1` or is deploying a package
     53#  `5.0-nasa-cfs`
     54#
     55#  Packages can optionally add specialised sections to a version configuration
     56#  files. These can be accessed via the:
     57#
     58#   load_release_settings: Return the items in a section
     59#   load_release_setting: Return an item from a section
     60#
     61# User deployment:
     62#
     63#  Create a git archive and then add a suitable VERSION file to the top
     64#  directory of the package. The package assumes your python executable is
     65#  location in `bin` directory which is one below the top of the package's
     66#  install prefix.
     67#
     68# RTEMS Release:
     69#
     70#  Set the values in the `rtems-version.ini` file. This is a shared file so
     71#  packages and encouraged to add specific settings to other configuration
     72#  files.
     73#
     74# Notes:
     75#
     76#  This module uses os.apth for paths and assumes all paths are in the host
     77#  format.
    3478#
    3579
    3680from __future__ import print_function
    3781
     82import itertools
     83import os
    3884import sys
    3985
    40 #
    41 # Support to handle use in a package and as a unit test.
     86try:
     87    import configparser
     88except ImportError:
     89    import ConfigParser as configparser
     90
     91#
     92# Support to handle importing when installed in a package and as a unit test.
    4293# If there is a better way to let us know.
    4394#
     
    4596    from . import error
    4697    from . import git
    47     from . import path
     98    from . import rtems
    4899except (ValueError, SystemError):
    49100    import error
    50101    import git
    51102    import path
     103    import rtems
    52104
    53105#
    54106# Default to an internal string.
    55107#
    56 _version = '5'
     108_version = 'undefined'
    57109_revision = 'not_released'
    58110_version_str = '%s.%s' % (_version, _revision)
    59111_released = False
    60112_git = False
    61 
    62 def _at():
    63     return path.dirname(__file__)
     113_is_loaded = False
     114
     115def _top():
     116    top = os.path.dirname(sys.argv[0])
     117    if len(top) == 0:
     118        top = '.'
     119    return top
     120
     121def _load_released_version_config():
     122    '''Local worker to load a configuration file.'''
     123    top = _top()
     124    for ver in [os.path.join(top, 'VERSION'),
     125                os.path.join('..', 'VERSION'),
     126                rtems.configuration_file('rtems-version.ini')]:
     127        if os.path.exists(os.path.join(ver)):
     128            v = configparser.SafeConfigParser()
     129            try:
     130                v.read(ver)
     131            except Exception as e:
     132                raise error.general('Invalid version config format: %s: %s' % (ver,
     133                                                                               e))
     134            return ver, v
     135    return None, None
    64136
    65137def _load_released_version():
     138    '''Load the release data if present. If not found the package is not released.
     139
     140    A release can be made by adding a file called `VERSION` to the top level
     141    directory of a package. This is useful for user deploying a package and
     142    making custom releases.
     143
     144    The RTEMS project reserves the `rtems-version.ini` file for it's
     145    releases. This is the base release and should not be touched by users
     146    deploying a package.
     147
     148    '''
     149    global _version
     150    global _revision
    66151    global _released
    67152    global _version_str
    68     at = _at()
    69     for ver in [at, path.join(at, '..')]:
    70         if path.exists(path.join(ver, 'VERSION')):
    71             try:
    72                 import configparser
    73             except ImportError:
    74                 import ConfigParser as configparser
    75             v = configparser.SafeConfigParser()
    76             v.read(path.join(ver, 'VERSION'))
    77             _version_str = v.get('version', 'release')
    78             _released = True
     153    global _is_loaded
     154
     155    if not _is_loaded:
     156        vc, v = _load_released_version_config()
     157        if v is not None:
     158            try:
     159                ver_str = v.get('version', 'revision')
     160            except Exception as e:
     161                raise error.general('Invalid version file: %s: %s' % (vc, e))
     162            ver_split = ver_str.split('.')
     163            if len(ver_split) < 2:
     164                raise error.general('Invalid version release value: %s: %s' % (vc,
     165                                                                               ver_str))
     166            ver = ver_split[0]
     167            rev = '.'.join(ver_split[1:])
     168            try:
     169                _version = int(ver)
     170            except:
     171                raise error.general('Invalid version config value: %s: %s' % (vc,
     172                                                                              ver))
     173            try:
     174                _revision = int(''.join(itertools.takewhile(str.isdigit, rev)))
     175            except Exception as e:
     176                raise error.general('Invalid revision config value: %s: %s: %s' % (vc,
     177                                                                                   rev,
     178                                                                                   e))
     179            if not 'not_released' in ver:
     180                _released = True
     181            _version_str = ver_str
     182            _is_loaded = True
    79183    return _released
    80184
    81185def _load_git_version():
     186    global _version
     187    global _revision
    82188    global _git
    83189    global _version_str
    84     repo = git.repo(_at())
     190    repo = git.repo(_top())
    85191    if repo.valid():
    86192        head = repo.head()
    87193        if repo.dirty():
    88             modified = ' modified'
     194            modified = 'modified'
     195            sep = ' '
    89196        else:
    90197            modified = ''
    91         _version_str = '%s (%s%s)' % (_version, head[0:12], modified)
     198            sep = ''
     199        _revision = '%s-%s' % (head[0:12], modified)
     200        _version_str = '%s (%s%s%s)' % (_version, head[0:12], sep, modified)
    92201        _git = True
    93202    return _git
    94203
     204def load_release_settings(section, error = False):
     205    vc, v = _load_released_version_config()
     206    items = []
     207    if v is not None:
     208        try:
     209            items = v.items(section)
     210        except Exception as e:
     211            if not isinstance(error, bool):
     212                error(e)
     213            elif error:
     214                raise error.general('Invalid config section: %s: %s: %s' % (vc,
     215                                                                            section,
     216                                                                            e))
     217    return items
     218
     219def load_release_setting(section, option, raw = False, error = False):
     220    vc, v = _load_released_version_config()
     221    value = None
     222    if v is not None:
     223        try:
     224            value = v.get(section, option, raw = raw)
     225        except Exception as e:
     226            if not isinstance(error, bool):
     227                error(e)
     228            elif error:
     229                raise error.general('Invalid config section: %s: %s: %s.%s' % (vc,
     230                                                                               section,
     231                                                                               option,
     232                                                                               e))
     233    return value
     234
    95235def released():
    96236    return _load_released_version()
     
    99239    return _load_git_version()
    100240
    101 def str():
    102     if not _released and not _git:
    103         if not _load_released_version():
    104             _load_git_version()
     241def string():
     242    _load_released_version()
     243    _load_git_version()
    105244    return _version_str
    106245
    107246def version():
     247    _load_released_version()
     248    _load_git_version()
    108249    return _version
     250
     251def revision():
     252    _load_released_version()
     253    _load_git_version()
     254    return _revision
    109255
    110256if __name__ == '__main__':
Note: See TracChangeset for help on using the changeset viewer.