Skip to content
Snippets Groups Projects
git_utils.py 2.94 KiB
Newer Older
'''
Created on 28. jul. 2017

@author: mmpe
'''
import os
import subprocess


def _run_git_cmd(cmd, git_repo_path=None):
    git_repo_path = git_repo_path or os.getcwd()
    if not os.path.isdir(os.path.join(git_repo_path, ".git")):
        raise Warning("'%s' does not appear to be a Git repository." % git_repo_path)
    try:
        process = subprocess.Popen(cmd,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE,
                                   universal_newlines=True,
                                   cwd=os.path.abspath(git_repo_path))
        stdout, stderr = process.communicate()
        if process.returncode != 0:
            raise EnvironmentError("%s\n%s" % (stdout, stderr))
        return stdout.strip()

    except EnvironmentError as e:
        raise e
        raise Warning("unable to run git")


def get_git_version(git_repo_path=None):
    cmd = ["git", "describe", "--tags", "--dirty", "--always"]
    return _run_git_cmd(cmd, git_repo_path)


def get_tag(git_repo_path=None, verbose=False):
    tag = _run_git_cmd(['git', 'describe', '--tags', '--always', '--abbrev=0'], git_repo_path)
    if verbose:
        print(tag)
    return tag


def set_tag(tag, push, git_repo_path=None):
    _run_git_cmd(["git", "tag", tag], git_repo_path)
    if push:
        _run_git_cmd(["git", "push"], git_repo_path)
        _run_git_cmd(["git", "push", "--tags"], git_repo_path)


def update_git_version(version_module, git_repo_path=None):
    """Update <version_module>.__version__ to git version"""

    version_str = get_git_version(git_repo_path)
    assert os.path.isfile(version_module.__file__)
    with open(version_module.__file__, "w") as fid:
        fid.write("__version__ = '%s'" % version_str)

    # ensure file is written, closed and ready
    with open(version_module.__file__) as fid:
        fid.read()
    return version_str


def write_vers(vers_file='wetb/__init__.py', repo=None, skip_chars=1):
    if not repo:
        repo = os.getcwd()
    version = get_tag(repo)[skip_chars:]
    print('Writing version: {} in {}'.format(version, vers_file))
    with open(vers_file, 'r') as f:
        lines = f.readlines()
    for n, l in enumerate(lines):
        if l.startswith('__version__'):
            lines[n] = "__version__ = '{}'\n".format(version)
    for n, l in enumerate(lines):
        if l.startswith('__release__'):
            lines[n] = "__release__ = '{}'\n".format(version)
    with open(vers_file, 'w') as f:
        f.write(''.join(lines))
    return version


def rename_dist_file():
    for f in os.listdir('dist'):
        if f.endswith('whl'):
            split = f.split('linux')
            new_name = 'manylinux1'.join(split)
            old_path = os.path.join('dist', f)
            new_path = os.path.join('dist', new_name)
            os.rename(old_path, new_path)


def main():
    """Example of how to run (pytest-friendly)"""
    if __name__ == '__main__':
        pass


main()