Viewing file: update.py (6.01 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# 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()
|