made a few options configurable instead of hard coded

This commit is contained in:
Michael Gimbel 2017-02-27 20:41:06 +00:00
parent 9887d9ff52
commit 6d09f07df9
2 changed files with 41 additions and 7 deletions

View File

@ -8,3 +8,9 @@ message = Bump version: {current_version} -> {new_version}
[bumpversion:file:VERSION]
search = version={current_version}
replace = version={new_version}
[semver]
main_branches = develop, env-test, env-stage, env-prod
major_branches =
minor_branches = feature
patch_branches = hotfix, bugfix

View File

@ -1,5 +1,6 @@
import re
import subprocess
from ConfigParser import ConfigParser
class SemVer(object):
@ -11,6 +12,19 @@ class SemVer(object):
self.main_branch = None
self.version_type = None
self.main_branches = self._setting_to_array('main_branches')
self.major_branches = self._setting_to_array('major_branches')
self.minor_branches = self._setting_to_array('minor_branches')
self.patch_branches = self._setting_to_array('patch_branches')
def _setting_to_array(self, setting):
config = ConfigParser()
config.read('/application_repo/.bumpversion.cfg')
value = config.get('semver', setting)
# filter() removes empty string which is what we get if setting is blank
return filter(bool, [v.strip() for v in value.split(',')])
# based on commit message see what branches are involved in the merge
def get_branches(self):
p = subprocess.Popen(['git', 'log', '-1'], stdout=subprocess.PIPE,
cwd='/application_repo')
@ -21,13 +35,23 @@ class SemVer(object):
self.main_branch = matches.group(2)
return bool(matches)
# based on branches involved see what type of versioning should be done
def get_version_type(self):
if self.merged_branch.startswith('feature/'):
self.version_type = 'minor'
elif self.merged_branch.startswith('hotfix/'):
self.version_type = 'patch'
return bool(self.version_type)
for prefix in self.major_branches:
if self.merged_branch.startswith(prefix + '/'):
self.version_type = 'major'
return True
for prefix in self.minor_branches:
if self.merged_branch.startswith(prefix + '/'):
self.version_type = 'minor'
return True
for prefix in self.patch_branches:
if self.merged_branch.startswith(prefix + '/'):
self.version_type = 'patch'
return True
return False
# setup git settings so we can commit and tag
def setup_git_user(self):
# setup git user
p = subprocess.Popen(['git', 'config', 'user.email',
@ -39,6 +63,7 @@ class SemVer(object):
p.wait()
return self
# use bumpversion to increment the appropriate version type
def version_repo(self):
# version repo
p = subprocess.Popen(['bumpversion', self.version_type],
@ -63,11 +88,14 @@ class SemVer(object):
'''
return self
# 1) get branches from last commit message
# 2) see if we're merging into a main branch
# 3) see what type of versioning we should do
# 4) version the repo
def run(self):
if not self.get_branches():
raise Exception('No merge found')
if self.main_branch not in \
['develop', 'env-test', 'env-stage', 'env-prod']:
if self.main_branch not in self.main_branches:
raise Exception('Not merging into a main branch')
if not self.get_version_type():
raise Exception('No git flow branch found')