# 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()
|