Source code for fastr.version

# Copyright 2011-2014 Biomedical Imaging Group Rotterdam, Departments of
# Medical Informatics and Radiology, Erasmus MC, Rotterdam, The Netherlands
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""
This module keeps track of the version of the currently used Fastr framework.
It can check its version from mercurial or a saved file
"""
import os
import re
from typing import Optional, Tuple

try:
    import git
    _GIT_PRESENT = True
except ImportError:
    _GIT_PRESENT = False

_VERSIONFILE = os.path.join(os.path.dirname(__file__), 'versioninfo')
_FASTR_SRC_DIR = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))


[docs]def get_base_version() -> Optional[str]: """ Get the version from the top-level version file :return: the version :rtype str: """ try: with open(os.path.join(os.path.dirname(__file__), '..', 'version'), 'r') as version_file: return version_file.read().strip() except IOError: return None
[docs]def get_git_info() -> Tuple[Optional[str], Optional[str]]: if not _GIT_PRESENT: return None, None try: search_path = os.path.dirname(os.path.abspath(__file__)) repo = git.Repo(path=search_path, search_parent_directories=True) except git.InvalidGitRepositoryError: return None, None git_head, git_branch = repo.head.object.name_rev.split(" ", 1) return git_head, git_branch
[docs]def get_saved_version() -> Tuple[Optional[str], Optional[str], Optional[str]]: """ Get cached version from file :return: tuple with version, head revision and branch """ try: with open(_VERSIONFILE, 'r') as version_file: data = version_file.read().split() data = dict(x.split('=', 1) for x in data) return data.get('version', None), data.get('git_head', None), data.get('git_branch', None) except IOError: return None, None, None
[docs]def save_version(current_version: str, current_hg_head: str, current_hg_branch: str): """ Cache the version information (useful for when installing) :param str current_version: version :param str current_hg_head: mercurial head revision :param str current_hg_branch: mercurial branch :return: """ with open(_VERSIONFILE, 'w') as version_file: version_file.write('version={}\n'.format(current_version)) version_file.write('git_head={}\n'.format(current_hg_head)) version_file.write('git_branch={}\n'.format(current_hg_branch))
[docs]def clear_version(): """ Remove the cached version info """ os.remove(_VERSIONFILE)
# Try to get version info version = get_base_version() git_head, git_branch = get_git_info() # Note that we imported from a mercurial repository from_git = git_branch is not None # Try to get missing info from saved versioninfo if version is None or git_head is None or git_branch is None: _n_version, _n_hg_head, _n_hg_branch = get_saved_version() version = version or _n_version git_head = git_head or _n_hg_head git_branch = git_branch or _n_hg_branch git_head = git_head or 'unknown' git_branch = git_branch or 'unknown' full_version = '{}_{}_{}'.format(version, git_branch, git_head[:8]) not_master_branch = re.match(f'^tags/{version}(\^\d+)?$', git_branch) is None