From 5ea6bcf07659767b611ebc1af01eaa6f9f5425ae Mon Sep 17 00:00:00 2001 From: Mateusz Bysiek Date: Tue, 20 Mar 2018 17:38:39 +0900 Subject: [PATCH] wip: new implementation of _latest_git_version_tag() --- version_query/git_query.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/version_query/git_query.py b/version_query/git_query.py index 05378e8..82042ce 100644 --- a/version_query/git_query.py +++ b/version_query/git_query.py @@ -73,6 +73,32 @@ def _latest_git_version_tag_on_branches( MAX_COMMIT_DISTANCE = 999 +def _latest_git_version_tag_new( + repo: git.Repo, assume_if_none: bool = False, base_commit: git.Commit = None, + commit_distance: int = 0, skip_commits: t.Set[git.Commit] = None) -> t.Tuple[ + git.Commit, t.Optional[git.TagReference], Version, int]: + version_tags = _git_version_tags(repo) + version_tag_commits = set() + divergence_points = [] + if skip_commits is None: + skip_commits = set() + while True: + commit = None + for commit in repo.iter_commits(rev=base_commit): + if commit in skip_commits: + return None, None, None, -1 + _LOG.log(logging.NOTSET, 'iterating over commit %s', commit) + current_version_tags = {tag: version for tag, version in version_tags.items() + if tag.commit == commit} + commit_distance += 1 + skip_commits.add(commit) + if len(commit.parents) > 1: + divergence_points.append(commit) + break + base_commit = divergence_points.pop() + return commit, tag, version, commit_distance + + def _latest_git_version_tag( repo: git.Repo, assume_if_none: bool = False, base_commit: t.Optional[git.objects.Commit] = None, commit_distance: int = 0, @@ -122,6 +148,9 @@ def _latest_git_version_tag( return commit, tag, version, commit_distance +_latest_git_version_tag = _latest_git_version_tag_new + + def _upcoming_git_version_tag(repo: git.Repo, ignore_untracked_files: bool = True) -> t.Tuple[ t.Optional[git.objects.Commit], t.Optional[git.TagReference], t.Optional[Version], int, bool]: