Compare commits

...
5 Commits
Author SHA1 Message Date
jt d54c740748 Merge pull request 'Bugfix/missing click module' (#68) from bugfix/missing-click-module into main
Publish to PyPI / Bump-Build-Publish (push) Successful in 44s
Reviewed-on: #68
2026-09-28 13:04:28 +00:00
jt 86a2768c81 bugfix: remove import click and supress typer errors only 2026-09-28 10:03:39 -03:00
jt 9dee43705a clean: delete test csv 2026-09-28 09:57:30 -03:00
jt 103eb1137a Merge pull request 'feature: add branch types, commit types, support for breaking changes' (#67) from feature/extend-branch-and-commit-types into main
Publish to PyPI / Bump-Build-Publish (push) Successful in 16s
Reviewed-on: #67
2026-09-26 21:12:39 +00:00
jt e9d88b8113 feature: add branch types, commit types, support for breaking changes 2026-09-26 18:12:14 -03:00
6 changed files with 76 additions and 19 deletions
+12 -1
View File
@@ -102,7 +102,18 @@ Comportamiento:
- El tag se crea sobre el último merge (first-parent) de la rama. Si ese merge ya tiene un tag, no se - El tag se crea sobre el último merge (first-parent) de la rama. Si ese merge ya tiene un tag, no se
hace nada. hace nada.
- La versión se calcula a partir de los tipos de commit (CC) del último merge. Si ningún commit - La versión se calcula a partir de los tipos de commit (CC) del último merge. Si ningún commit
implica un salto de versión, se avisa y el comando termina con código de salida 1. implica un salto de versión, se avisa y el comando termina con código de salida 1. Se toma el
mayor incremento entre los commits:
| Tipo de commit | Incremento |
| -------------------------------------------------------------- | ---------- |
| cualquier tipo marcado como breaking (`feature!: ...`) | major |
| `feature` (o `feat`) | minor |
| `bugfix` (o `fix`), `hotfix`, `refactor`, `perf`, `revert` | patch |
| `docs`, `style`, `test`, `build`, `ci`, `chore`, `wip` | ninguno |
| personalizado (opción `otro` en `git-flow commit`) | ninguno |
`git-flow commit` pregunta si el commit es un breaking change (salvo en commits `wip`).
- Con más de un entorno configurado, cada rama versiona por separado con el nombre del entorno como - Con más de un entorno configurado, cada rama versiona por separado con el nombre del entorno como
sufijo (por ejemplo, `v1.2.0-prod`). Con un solo entorno no se agrega sufijo. sufijo (por ejemplo, `v1.2.0-prod`). Con un solo entorno no se agrega sufijo.
- Si el merge viene del entorno anterior (por ejemplo, `dev` a `test`), no se calcula una nueva - Si el merge viene del entorno anterior (por ejemplo, `dev` a `test`), no se calcula una nueva
-2
View File
@@ -1,2 +0,0 @@
name,commit sha,author,date
worktree-kind-watching-hearth,e8c0c0b777d31fa94cd3f01fbf9c68b165d77015,Jonathan Teran Carballo,2026-09-13T23:18:47-03:00
1 name commit sha author date
2 worktree-kind-watching-hearth e8c0c0b777d31fa94cd3f01fbf9c68b165d77015 Jonathan Teran Carballo 2026-09-13T23:18:47-03:00
+28 -9
View File
@@ -1,15 +1,6 @@
GitFlowError = ValueError GitFlowError = ValueError
BRANCH_TYPES = [ BRANCH_TYPES = [
"feature",
"refactor",
"bugfix",
"hotfix",
"chore",
"docs",
]
COMMIT_TYPES = [
"feature", "feature",
"bugfix", "bugfix",
"hotfix", "hotfix",
@@ -18,6 +9,24 @@ COMMIT_TYPES = [
"docs", "docs",
"style", "style",
"test", "test",
"build",
"ci",
"chore",
]
COMMIT_TYPES = [
"feature",
"bugfix",
"hotfix",
"refactor",
"perf",
"revert",
"docs",
"style",
"test",
"build",
"ci",
"chore",
"wip", "wip",
] ]
@@ -32,15 +41,25 @@ SEMVER_PATCH = 1
# Commits con estos tipos no alteran la versión # Commits con estos tipos no alteran la versión
SEMVER_SKIP = 0 SEMVER_SKIP = 0
# Un commit marcado como breaking change (<tipo>!: <mensaje>) incrementa SEMVER_MAJOR sin importar
# el tipo. Los tipos que no figuran aquí no alteran la versión.
COMMIT_TYPE_INCREMENT = { COMMIT_TYPE_INCREMENT = {
"feature": SEMVER_MINOR, "feature": SEMVER_MINOR,
"bugfix": SEMVER_PATCH, "bugfix": SEMVER_PATCH,
"hotfix": SEMVER_PATCH, "hotfix": SEMVER_PATCH,
"refactor": SEMVER_PATCH, "refactor": SEMVER_PATCH,
"perf": SEMVER_PATCH, "perf": SEMVER_PATCH,
"revert": SEMVER_PATCH,
"docs": SEMVER_SKIP, "docs": SEMVER_SKIP,
"style": SEMVER_SKIP, "style": SEMVER_SKIP,
"test": SEMVER_SKIP, "test": SEMVER_SKIP,
"build": SEMVER_SKIP,
"ci": SEMVER_SKIP,
"chore": SEMVER_SKIP,
"wip": SEMVER_SKIP,
# Alias de Conventional Commits, para commits creados fuera de git-flow
"feat": SEMVER_MINOR,
"fix": SEMVER_PATCH,
} }
SUPPORTED_REMOTE_URL_SCHEMAS = [ SUPPORTED_REMOTE_URL_SCHEMAS = [
+27 -3
View File
@@ -9,6 +9,7 @@ from rich.table import Table
from git_flow import ( from git_flow import (
BRANCH_TYPES, BRANCH_TYPES,
COMMIT_TYPE_INCREMENT,
COMMIT_TYPES, COMMIT_TYPES,
FLOWCONFIG_FILENAME, FLOWCONFIG_FILENAME,
FLOWCONFIG_VERSION, FLOWCONFIG_VERSION,
@@ -155,8 +156,30 @@ def is_valid_ticket(ticket: str) -> bool:
) )
CUSTOM_COMMIT_TYPE_OPTION = "otro"
def get_commit_message(commit_types: list[str] = COMMIT_TYPES) -> str: def get_commit_message(commit_types: list[str] = COMMIT_TYPES) -> str:
commit_type = io_choice("Tipo de commit", commit_types) commit_type = io_choice("Tipo de commit", commit_types + [CUSTOM_COMMIT_TYPE_OPTION])
if commit_type == CUSTOM_COMMIT_TYPE_OPTION:
commit_type = io_prompt(
"Tipo de commit personalizado",
strip=True,
validator=lambda s: re.fullmatch(r"\w+", s.strip()) is not None,
instruction="letras, números o _",
)
if commit_type not in COMMIT_TYPE_INCREMENT:
io_warning(
f"El tipo '{commit_type}' no produce un salto de versión, "
"salvo que se marque como breaking change."
)
# Los commits WIP se squashean en uno final, que es el que puede marcarse como breaking
if commit_type != "wip" and io_confirm("¿Es un breaking change?", False):
commit_type += "!"
commit_message = io_prompt( commit_message = io_prompt(
"Mensaje de commit", "Mensaje de commit",
validator=lambda s: 0 < len(s) and len(s) < 100, validator=lambda s: 0 < len(s) and len(s) < 100,
@@ -166,7 +189,7 @@ def get_commit_message(commit_types: list[str] = COMMIT_TYPES) -> str:
# <tipo>[(alcance)][!]: <mensaje>, para no confundir "Merge pull request 'feature: ...'" con un tipo # <tipo>[(alcance)][!]: <mensaje>, para no confundir "Merge pull request 'feature: ...'" con un tipo
COMMIT_SUBJECT_RE = re.compile(r"^(\w+)(?:\([^)]*\))?!?:\s*(.*)$") COMMIT_SUBJECT_RE = re.compile(r"^(\w+)(?:\([^)]*\))?(!)?:\s*(.*)$")
def show_commits(title: str, revision_range: str): def show_commits(title: str, revision_range: str):
@@ -188,7 +211,8 @@ def show_commits(title: str, revision_range: str):
for line in lines: for line in lines:
timestamp, subject = line.split("\t", 1) timestamp, subject = line.split("\t", 1)
match = COMMIT_SUBJECT_RE.match(subject) match = COMMIT_SUBJECT_RE.match(subject)
commit_type, message = match.groups() if match else ("-", subject) commit_type, breaking, message = match.groups() if match else ("-", None, subject)
commit_type += breaking or ""
table.add_row(format_time_ago(now - int(timestamp)), commit_type, message) table.add_row(format_time_ago(now - int(timestamp)), commit_type, message)
console.print(table) console.print(table)
+8 -2
View File
@@ -128,8 +128,14 @@ def get_next_tag_from_commits(
) -> str | None: ) -> str | None:
increment = SEMVER_SKIP increment = SEMVER_SKIP
for commit in commits: for commit in commits:
commit_type = commit.partition(":")[0] match = base.COMMIT_SUBJECT_RE.match(commit)
increment = max(increment, COMMIT_TYPE_INCREMENT.get(commit_type, SEMVER_SKIP))
if not match:
continue
commit_type, breaking, _ = match.groups()
commit_increment = SEMVER_MAJOR if breaking else COMMIT_TYPE_INCREMENT.get(commit_type)
increment = max(increment, commit_increment or SEMVER_SKIP)
if increment == SEMVER_SKIP: if increment == SEMVER_SKIP:
return None return None
+1 -2
View File
@@ -3,7 +3,6 @@
from subprocess import CalledProcessError, SubprocessError from subprocess import CalledProcessError, SubprocessError
from typing import Annotated from typing import Annotated
import click
import typer import typer
from rich.markup import escape from rich.markup import escape
from rich.traceback import Traceback from rich.traceback import Traceback
@@ -70,7 +69,7 @@ def _print_error(message: str, title: str, e: BaseException):
base.io_error(message, title=title) base.io_error(message, title=title)
console.print( console.print(
Traceback.from_exception( Traceback.from_exception(
type(e), e, e.__traceback__, suppress=[click, typer] type(e), e, e.__traceback__, suppress=[typer]
) )
) )
else: else: