refactor: update remote tag fetching behaviour so it uses api instead of shallow clone

This commit is contained in:
Jonathan Teran Carballo
2026-09-21 09:15:48 -03:00
parent eabef5eb33
commit 22ba8f5e5f
7 changed files with 89 additions and 14 deletions
+19 -10
View File
@@ -33,17 +33,26 @@ def tag(token: Optional[str] = None):
raise GitFlowError("No hay token disponible")
merge_commit = get_last_merge_commit()
# Con varios entornos cada uno versiona por separado (v1.0.0-prod), con uno solo no hace falta
suffix = f"-{target}" if len(base.environments) > 1 else ""
if ci:
# Pipeline: no asumimos historial completo, los commits del PR se piden a la API
# Commits se obtienen por API del ultimo PR / MR mergeado
commits = base.get_remote_api(token).get_merge_commits(merge_commit)
commits = [c for c in commits if not c.is_merge]
# Último tag se obtiene por API filtrando por sufijo
current_tag = base.get_remote_api(token).get_latest_tag(suffix)
else:
# Commits se obtienen del último merge, listando hasta el primer forkpoint
branch = Git("show", merge_commit + "^2", patch=False, format="%h").firstline()
fork_point = Git.get_first_fork_point(branch, target)
commits = Git.get_commits(fork_point, branch)
# Último tag se obtiene localmente
current_tag = Git.get_current_tag(suffix)
next_tag = get_next_tag_from_commits([c.subject for c in commits], target)
next_tag = get_next_tag_from_commits(
[c.subject for c in commits], suffix, current_tag
)
if not next_tag:
base.io_info(
@@ -90,17 +99,19 @@ def check_not_tagged(commit: str):
raise GitFlowError("El commit a taggear ya tiene tag: " + tag)
def get_next_tag_from_commits(commits: list[str], branch: str) -> str | None:
def get_next_tag_from_commits(
commits: list[str], suffix: str, current_tag: str | None
) -> str | None:
increment = SEMVER_SKIP
for commit in commits:
commit_type = commit.partition(":")[0]
increment = max(increment, COMMIT_TYPE_INCREMENT.get(commit_type, SEMVER_SKIP))
tag = Git.get_current_tag() or f"v0.0.0-{branch}"
if increment == SEMVER_SKIP:
return None
until_dash = tag.index("-") if "-" in tag else None
suffix = tag[until_dash:] if until_dash is not None else ""
[major, minor, patch] = map(int, tag[1:until_dash].split("."))
version = (current_tag or "v0.0.0" + suffix).removeprefix("v").removesuffix(suffix)
[major, minor, patch] = map(int, version.split("."))
if increment == SEMVER_MAJOR:
major += 1
@@ -111,7 +122,5 @@ def get_next_tag_from_commits(commits: list[str], branch: str) -> str | None:
patch = 0
elif increment == SEMVER_PATCH:
patch += 1
elif increment == SEMVER_SKIP:
suffix = "-r" + Git("rev-list", "HEAD", count=True).firstline()
return None if increment == SEMVER_SKIP else f"v{major}.{minor}.{patch}{suffix}"
return f"v{major}.{minor}.{patch}{suffix}"