File: //proc/1526/task/1921/root/lib/python3/dist-packages/incremental/update.py
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
from __future__ import absolute_import, division, print_function
import click
import os
import datetime
from incremental import Version
from twisted.python.filepath import FilePath
_VERSIONPY_TEMPLATE = '''"""
Provides %s version information.
"""
# This file is auto-generated! Do not edit!
# Use `python -m incremental.update %s` to change this file.
from incremental import Version
__version__ = %s
__all__ = ["__version__"]
'''
_YEAR_START = 2000
def _findPath(path, package):
    cwd = FilePath(path)
    src_dir = cwd.child("src").child(package.lower())
    current_dir = cwd.child(package.lower())
    if src_dir.isdir():
        return src_dir
    elif current_dir.isdir():
        return current_dir
    else:
        raise ValueError(("Can't find under `./src` or `./`. Check the "
                          "package name is right (note that we expect your "
                          "package name to be lower cased), or pass it using "
                          "'--path'."))
def _existing_version(path):
    version_info = {}
    with path.child("_version.py").open('r') as f:
        exec(f.read(), version_info)
    return version_info["__version__"]
def _run(package, path, newversion, patch, rc, dev, create,
         _date=None, _getcwd=None, _print=print):
    if not _getcwd:
        _getcwd = os.getcwd
    if not _date:
        _date = datetime.date.today()
    if type(package) != str:
        package = package.encode('utf8')
    if not path:
        path = _findPath(_getcwd(), package)
    else:
        path = FilePath(path)
    if newversion and patch or newversion and dev or newversion and rc:
        raise ValueError("Only give --newversion")
    if dev and patch or dev and rc:
        raise ValueError("Only give --dev")
    if create and dev or create and patch or create and rc or \
       create and newversion:
        raise ValueError("Only give --create")
    if newversion:
        from pkg_resources import parse_version
        existing = _existing_version(path)
        st_version = parse_version(newversion)._version
        release = list(st_version.release)
        if len(release) == 1:
            release.append(0)
        if len(release) == 2:
            release.append(0)
        v = Version(
            package, *release,
            release_candidate=st_version.pre[1] if st_version.pre else None,
            dev=st_version.dev[1] if st_version.dev else None)
    elif create:
        v = Version(package, _date.year - _YEAR_START, _date.month, 0)
        existing = v
    elif rc and not patch:
        existing = _existing_version(path)
        if existing.release_candidate:
            v = Version(package, existing.major, existing.minor,
                        existing.micro, existing.release_candidate + 1)
        else:
            v = Version(package, _date.year - _YEAR_START, _date.month, 0, 1)
    elif patch:
        if rc:
            rc = 1
        else:
            rc = None
        existing = _existing_version(path)
        v = Version(package, existing.major, existing.minor,
                    existing.micro + 1, rc)
    elif dev:
        existing = _existing_version(path)
        if existing.dev is None:
            _dev = 0
        else:
            _dev = existing.dev + 1
        v = Version(package, existing.major, existing.minor,
                    existing.micro, existing.release_candidate, dev=_dev)
    else:
        existing = _existing_version(path)
        if existing.release_candidate:
            v = Version(package,
                        existing.major, existing.minor, existing.micro)
        else:
            raise ValueError(
                "You need to issue a rc before updating the major/minor")
    NEXT_repr = repr(Version(package, "NEXT", 0, 0)).split("#")[0]
    NEXT_repr_bytes = NEXT_repr.encode('utf8')
    version_repr = repr(v).split("#")[0]
    version_repr_bytes = version_repr.encode('utf8')
    existing_version_repr = repr(existing).split("#")[0]
    existing_version_repr_bytes = existing_version_repr.encode('utf8')
    _print("Updating codebase to %s" % (v.public()))
    for x in path.walk():
        if not x.isfile():
            continue
        original_content = x.getContent()
        content = original_content
        # Replace previous release_candidate calls to the new one
        if existing.release_candidate:
            content = content.replace(existing_version_repr_bytes,
                                      version_repr_bytes)
            content = content.replace(
                (package.encode('utf8') + b" " +
                 existing.public().encode('utf8')),
                (package.encode('utf8') + b" " +
                 v.public().encode('utf8')))
        # Replace NEXT Version calls with the new one
        content = content.replace(NEXT_repr_bytes,
                                  version_repr_bytes)
        content = content.replace(NEXT_repr_bytes.replace(b"'", b'"'),
                                  version_repr_bytes)
        # Replace <package> NEXT with <package> <public>
        content = content.replace(package.encode('utf8') + b" NEXT",
                                  (package.encode('utf8') + b" " +
                                   v.public().encode('utf8')))
        if content != original_content:
            _print("Updating %s" % (x.path,))
            with x.open('w') as f:
                f.write(content)
    _print("Updating %s/_version.py" % (path.path))
    with path.child("_version.py").open('w') as f:
        f.write(
            (_VERSIONPY_TEMPLATE % (
                package, package, version_repr)).encode('utf8'))
@click.command()
@click.argument('package')
@click.option('--path', default=None)
@click.option('--newversion', default=None)
@click.option('--patch', is_flag=True)
@click.option('--rc', is_flag=True)
@click.option('--dev', is_flag=True)
@click.option('--create', is_flag=True)
def run(*args, **kwargs):
    return _run(*args, **kwargs)
if __name__ == '__main__':  # pragma: no cover
    run()