From 033d6751e0e45d802cd0896ce6d44b214e6c39f9 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 29 Oct 2018 12:55:24 -0400 Subject: [PATCH] Add utility and makefile target to increase version number mechanically. Update release checklist. Signed-off-by: Roberto Rosario --- Makefile | 7 ++ docs/chapters/development.rst | 95 +++++++++++-------- increase_version.py | 166 ++++++++++++++++++++++++++++++++++ 3 files changed, 230 insertions(+), 38 deletions(-) create mode 100755 increase_version.py diff --git a/Makefile b/Makefile index 65a950dfab..def162954d 100644 --- a/Makefile +++ b/Makefile @@ -158,6 +158,13 @@ generate-setup: # Releases +increase-version: + @VERSION=`grep "__version__ =" mayan/__init__.py| cut -d\' -f 2|./increase_version.py - $(PART)`; \ + BUILD=`echo $$VERSION|awk '{split($$VERSION,a,"."); printf("0x%02d%02d%02d\n", a[1],a[2], a[3])}'`; \ + sed -i -e "s/__build__ = 0x[0-9]*/__build__ = $${BUILD}/g" mayan/__init__.py; \ + sed -i -e "s/__version__ = '[0-9\.]*'/__version__ = '$${VERSION}'/g" mayan/__init__.py; \ + echo $$VERSION > docker/version + make generate-setup test-release: clean wheel twine upload dist/* -r testpypi diff --git a/docs/chapters/development.rst b/docs/chapters/development.rst index 35d8da5aec..8c390c9699 100644 --- a/docs/chapters/development.rst +++ b/docs/chapters/development.rst @@ -405,72 +405,91 @@ X.Y # Final release Release checklist ================= -1. Check for missing migrations:: +#. Check for missing migrations:: make check-missing-migrations -2. Synchronize translations:: +#. Synchronize translations:: make translations-pull -3. Compile translations:: +#. Compile translations:: make translations-compile -4. Write release notes. -5. Update changelog. -6. Scan the code with flake8 for simple style warnings. -7. Check README.rst format with:: +#. Update changelog. +#. Write release notes. +#. Scan the code with flake8 for simple style warnings. +#. Check README.rst format with:: python setup.py check -r -s -or with:: + or with:: - make check-readme + make check-readme -8. Bump version in `mayan/__init__.py`. -9. Bump version in `docker/version`. -10. Update requirements version in `setup.py` using: - :: +#. Bump version in ``mayan/__init__.py`` and ``docker/version``:: - make generate-setup + make increase-version PART= -11. Build source package and test: - :: +#. Update requirements version in ``setup.py`` using: + :: - make test-sdist-via-docker-ubuntu + make generate-setup -12. Build wheel package and test: - :: +#. Build source package and test: + :: - make test-wheel-via-docker-ubuntu + make test-sdist-via-docker-ubuntu -13. Tag version: - :: +#. Build wheel package and test: + :: - git tag -a vX.Y.Z -m "Version X.Y.Z" + make test-wheel-via-docker-ubuntu -14. Switch to the `releases` branch: - :: +#. Tag version: + :: - git checkout releases + git tag -a vX.Y.Z -m "Version X.Y.Z" -15. Push tag upstream: - :: +#. Generate set ``setup.py`` again to update the build number:: - git push --tags + make generate-setup -16. Push code to trigger builds: - :: +#. Commit the new ``setup.py`` file. - git push +#. Release the version using one of the two following methods: GitLab CI or + manual -17. Build and upload a test release: - :: +Release using GitLab CI +----------------------- - make release-test-via-docker-ubuntu +#. Switch to the ``releases/all`` branch and merge the latest changes: + :: -18. Build and upload a final release: - :: + git checkout releases/all + git merge versions/next - make release-via-docker-ubuntu +#. Push code to trigger builds: + :: + + git push + +#. Push tag upstream: + :: + + git push --tags + + +Manual release +-------------- + +#. Build and upload a test release: + :: + + make release-test-via-docker-ubuntu + +#. Build and upload a final release: + :: + + make release-via-docker-ubuntu diff --git a/increase_version.py b/increase_version.py new file mode 100755 index 0000000000..463b2ec5a3 --- /dev/null +++ b/increase_version.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python + +from __future__ import print_function, unicode_literals + +import doctest +import re +import sys + +import mayan + + +VERSION_PART_MAJOR = 0 +VERSION_PART_MINOR = 1 +VERSION_PART_MICRO = 2 + + +class Version(object): + """ + >>> Version('1') + Version: 1 + >>> Version('1.0') + Version: 1.0 + >>> Version('1.3.2') + Version: 1.3.2 + >>> Version('1').increment_part(part=VERSION_PART_MAJOR) + Version: 2 + >>> Version('1').increment_part(part=VERSION_PART_MINOR) + Version: 1.1 + >>> Version('1').increment_part(part=VERSION_PART_MICRO) + Version: 1.0.1 + >>> Version('1rc').increment_part(part=VERSION_PART_MAJOR) + Version: 2rc + >>> Version('1rc2').increment_part(part=VERSION_PART_MAJOR) + Version: 1rc3 + >>> Version('1rc0').increment_part(part=VERSION_PART_MAJOR) + Version: 1rc1 + >>> Version('1.rc0').increment_part(part=VERSION_PART_MINOR) + Version: 1.rc1 + >>> Version('1.0.rc1').increment_part(part=VERSION_PART_MINOR) + Version: 1.1 + >>> Version('1.0.rc1').increment_part(part=VERSION_PART_MICRO) + Version: 1.0.rc2 + >>> Version('1rc').increment_part(part=VERSION_PART_MINOR) + Version: 1rc.1 + >>> Version('1rc').increment_part(part=VERSION_PART_MINOR) + Version: 1rc.1 + >>> Version('1rc').increment_part(part=VERSION_PART_MICRO) + Version: 1rc.0.1 + >>> Version('1.rc1').increment_part(part=VERSION_PART_MINOR) + Version: 1.rc2 + >>> Version('1.rc1').increment_part(part=VERSION_PART_MICRO) + Version: 1.rc1.1 + >>> Version('1.1.rc1').increment_part(part=VERSION_PART_MICRO) + Version: 1.1.rc2 + >>> Version('1.2.3').increment_major() + Version: 2 + >>> Version('1.2.3').increment_minor() + Version: 1.3 + >>> Version('1.2.3').increment_micro() + Version: 1.2.4 + """ + def __init__(self, version_string): + self._version_string = version_string + self._version_parts = version_string.split('.') + + def _get_version_part(self, index): + try: + return self._version_parts[index] + except IndexError: + return 0 + + def __repr__(self): + return 'Version: {}'.format(self.get_version_string()) + + def increment_major(self): + return self.increment_part(part=VERSION_PART_MAJOR) + + def increment_minor(self): + return self.increment_part(part=VERSION_PART_MINOR) + + def increment_micro(self): + return self.increment_part(part=VERSION_PART_MICRO) + + def increment_part(self, part): + # Fill version parts if the requested part is lower than what is + # available + self._version_parts.extend( + ['0'] * (part - len(self._version_parts) + 1) + ) + + try: + version_part = self._version_parts[part] + except IndexError: + part_numeric_post = '' + part_numeric_pre = '' + part_text = '' + else: + part_numeric_pre, part_text, part_numeric_post = re.findall( + '^(\d+)*([A-Za-z]+)*(\d+)*$', version_part + )[0] + + if part_numeric_post: + part_numeric_post = int(part_numeric_post) + 1 + else: + part_numeric_pre = int(part_numeric_pre) + 1 + + self._version_parts[part] = '{}{}{}'.format( + part_numeric_pre, part_text, part_numeric_post + ) + + # Discard version parts lower than what is being increased + self._version_parts = self._version_parts[0:part + 1] + self._version_string = '.'.join(self._version_parts) + + return self + + def get_version_string(self): + return self._version_string + + @property + def major(self): + return self._get_version_part(VERSION_PART_MAJOR) + + @property + def minor(self): + return self._get_version_part(VERSION_PART_MINOR) + + @property + def micro(self): + return self._get_version_part(VERSION_PART_MICRO) + + +if __name__ == '__main__': + # Remove comment to run tests + # doctest.testmod() + # exit(0) + + if len(sys.argv) == 1: + print( + 'usage: ' + ) + exit(0) + + if len(sys.argv) < 3: + print('Insufficient arguments') + exit(1) + + version_string = sys.argv[1] + if version_string == '-': + version_string = sys.stdin.read().replace('\n', '') + + version = Version(version_string) + part = sys.argv[2].lower() + + if part == 'major': + version.increment_major() + elif part == 'minor': + version.increment_minor() + elif part == 'micro': + version.increment_micro() + else: + print('Unknown part') + exit(1) + + #sys.stdout.write(version.get_version_string()) + print(version.get_version_string())