diff --git a/avakas/avakas.py b/avakas/avakas.py index d445bc5..5df7577 100644 --- a/avakas/avakas.py +++ b/avakas/avakas.py @@ -124,7 +124,7 @@ def bump(self, if prerelease: prerelease_version = self.get_next_prerelease_version( - original, prefix=prerelease_prefix + original, new_version=self._version, prefix=prerelease_prefix ) self.make_prerelease( @@ -138,6 +138,34 @@ def bump(self, return True + @staticmethod + def _get_extant_prerelease_versions(prefix, base_version=None, + extant_versions=None): + """ + Return a set of all integer versions that have existed of the specific + pre-release type/prefix (e.g. 'a', 'alpha', 'rc', etc.) + + ## Note: + + `bump` sets `._version` to a non-pre release before calling this, so + can not use current `._version as an extant version + """ + + extant_pre = set() + if extant_versions is None: + extant_versions = set() + else: + # be liberal in what you accept + extant_versions = set(extant_versions) + + for version in extant_versions: + if not version.truncate() == base_version.truncate(): + continue + if version.prerelease: + extant_pre.add(int(version.prerelease[len(prefix):][0][0])) + + return extant_pre + def get_next_prerelease_version( self, starting_version=None, prefix=None, new_version=None): @@ -172,6 +200,9 @@ def get_next_prerelease_version( current_prefix_match = starting_version.prerelease[:prerelease_len] + extant_prereleases = self._get_extant_prerelease_versions( + prefix, base_version=new_version, + extant_versions=set([starting_version])) if (new_version == starting_version.truncate() and prefix == current_prefix_match): @@ -188,12 +219,14 @@ def get_next_prerelease_version( # either there is no explicit prerelease version in the # current version, or there are additional prerelease # prefixes which are not intended for this bump - prerelease_version = 0 + prerelease_version = 1 + else: # different release or different prefix - prerelease_version = 0 + prerelease_version = 1 - prerelease_version += 1 + while prerelease_version in extant_prereleases: + prerelease_version += 1 return prerelease_version @@ -204,7 +237,7 @@ def make_prerelease(self, version, prefix=None, build_date=None): Args: * version (`int` or `str`(digits only)): The numeric prerelease version. i.e., for -dev.3, this is `3` or `"3"`. - * prefix (`str`, optional): the alphabetic (not enforced) prebuild + * prefix (`str`,optional): the alphabetic (not enforced) prebuild prefix, such as `a`, `beta`, `dev`, and such. * build_date """ diff --git a/avakas/flavors/git.py b/avakas/flavors/git.py index 78499cb..026dd8a 100644 --- a/avakas/flavors/git.py +++ b/avakas/flavors/git.py @@ -2,8 +2,8 @@ Avakas Built-In Base Project Flavor """ -import re import os +import re from git import Repo @@ -80,6 +80,26 @@ def __create_git_tag(self): """Creates a git tag""" return self.repo.create_tag(self.version) + def _get_extant_prerelease_versions( + self, prefix, base_version=None, extant_versions=None): + """ + Get all tags in this repo, use them to determine all of the pre- + releases for this version, with this pre-release prefix, which have + previously existed + + ## Note: + This does not fetch tags from remotes + """ + if extant_versions is None: + extant_versions = set() + + tag_versions = [self._version_from_tag(t) for t in self.repo.tags] + extant_versions.update(v for v in tag_versions if v is not None) + return super()._get_extant_prerelease_versions( + prefix=prefix, + base_version=base_version, + extant_versions=extant_versions) + def __determine_bump(self, for_prerelease=False): """Will go through the Git history until the last version bump and look for hints that we want to "automatically" bump diff --git a/tests/integration/gitnative.bats b/tests/integration/gitnative.bats index b2133d2..fdf794a 100644 --- a/tests/integration/gitnative.bats +++ b/tests/integration/gitnative.bats @@ -212,4 +212,17 @@ teardown() { avakas_wrapper bump "$REPO" auto --flavor "git-native" --tag-prefix "v" --prerelease --prerelease-prefix 'beta' avakas_wrapper show "$REPO" --flavor "git-native" --tag-prefix 'v' [ "$output" == "v1.1.0-beta.1" ] -} \ No newline at end of file +} + +@test "increment git native prerelease multiple times, in different branches" { + cd $REPO + avakas_wrapper show "$REPO" + [ "$output" == "0.0.1" ] + avakas_wrapper bump "$REPO" patch --prerelease --prerelease-prefix beta + avakas_wrapper show "$REPO" + [ "$output" == "0.0.2-beta.1" ] + git checkout -b branch2 + avakas_wrapper bump "$REPO" patch --prerelease --prerelease-prefix beta + avakas_wrapper show "$REPO" + [ "$output" == "0.0.2-beta.2" ] +}