Compare commits

...
10 Commits
Author SHA1 Message Date
jt 456af932a4 Merge pull request 'refactor: update merge conflict detection strategy (merge --no-commit to merge-tree --write-tree)' (#72) from refactor/merge-conflict-detections into main
Publish to PyPI / Bump-Build-Publish (push) Successful in 38s
Reviewed-on: #72
2026-10-01 02:54:24 +00:00
jt eed5b606fb refactor: update merge conflict detection strategy (merge --no-commit to merge-tree --write-tree) 2026-09-30 23:53:18 -03:00
jt 14ec438fa1 Merge pull request 'feature: change exit code to 3 when no tag is needed, and skip build / publish in that case' (#71) from feature/no-tag-different-exit-code into main
Publish to PyPI / Bump-Build-Publish (push) Successful in 43s
Reviewed-on: #71
2026-09-29 14:26:22 +00:00
Jonathan Teran 98d5c4ab3d feature: change exit code to 3 when no tag is needed, and skip build / publish in that case 2026-09-29 11:19:46 -03:00
jt 5cff0e4484 Merge pull request 'bugfix: only abort merge when is needed' (#70) from bugfix/abort-merge-when-necessary into main
Publish to PyPI / Bump-Build-Publish (push) Successful in 22s
Reviewed-on: #70
2026-09-28 17:35:38 +00:00
jt 61712b0872 bugfix: only abort merge when is needed 2026-09-28 14:35:10 -03:00
jt 98f71d5481 Merge pull request 'bugfix: commit small improvements' (#69) from bugfix/commit-small-improvements into main
Publish to PyPI / Bump-Build-Publish (push) Successful in 45s
Reviewed-on: #69
2026-09-28 17:27:53 +00:00
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
7 changed files with 35 additions and 27 deletions
+11 -1
View File
@@ -22,12 +22,22 @@ jobs:
id: version
run: |
pip install git-flow-envs=="${{ vars.GITFLOWENVS_VERSION }}"
git-flow tag --token="${{ secrets.GITEA_TOKEN }}"
# El código 3 indica que no hace falta un nuevo tag: se saltea la publicación
status=0
git-flow tag --token="${{ secrets.GITEA_TOKEN }}" || status=$?
if [ "$status" -eq 3 ]; then
echo "skip=true" >> "$GITHUB_OUTPUT"
elif [ "$status" -ne 0 ]; then
exit "$status"
fi
- name: Install uv
if: steps.version.outputs.skip != 'true'
uses: astral-sh/setup-uv@v8.3.2
- name: Build and publish
if: steps.version.outputs.skip != 'true'
run: |
uv build
uv publish --token="${{ secrets.PYPI_TOKEN }}"
-14
View File
@@ -1,14 +0,0 @@
image: python:3.10
pipelines:
branches:
'main':
- step:
name: "Tag and publish package"
caches:
- pip
script:
- pip install uv
- uv run git-flow tag --token=$BEARER
- uv build
- uv publish --token=$PYPI_TOKEN
-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
+3 -6
View File
@@ -75,15 +75,12 @@ def show_commits_to_merge(target):
def check_merge_conflicts(target: str):
merge_conflicts = Git("merge", target, ff=False, commit=False).code(
print="Realizando merge de prueba para verificar conflictos"
)
Git("merge", abort=True).exec(print="Abortando merge de prueba", check=False)
merge_conflicts = Git.get_merge_conflicts(target, print="Verificando conflictos de merge")
if merge_conflicts:
files = "\n".join(" - " + file for file in merge_conflicts)
base.io_error(
f"La rama actual tiene conflictos con {target}.\n"
f"La rama actual tiene conflictos con {target}:\n{files}\n\n"
f"Se recomienda mergear {target} a la rama actual, resolver los conflictos localmente,\n"
"y ejecutar nuevamente este comando",
title="Conflictos de merge",
+5 -2
View File
@@ -14,6 +14,9 @@ from git_flow.git import Git
app = typer.Typer()
# Código de salida cuando no hace falta crear un tag, para que el CI pueda saltear la publicación
EXIT_NO_TAG_NEEDED = 3
@app.command()
def tag(target: str | None = None, token: str | None = None, update_changelog: bool = False):
@@ -35,7 +38,7 @@ def tag(target: str | None = None, token: str | None = None, update_changelog: b
merge_commit_tag = Git("tag", "--points-at", merge_commit).firstline()
if merge_commit_tag:
base.io_info(f"El último merge ya tiene un tag: {merge_commit_tag}")
return
raise typer.Exit(code=EXIT_NO_TAG_NEEDED)
token, ci = get_token_and_ci(token)
@@ -97,7 +100,7 @@ def tag(target: str | None = None, token: str | None = None, update_changelog: b
"Los cambios realizados no implican un salto de versión, se mantiene la anterior."
)
raise typer.Exit(code=1)
raise typer.Exit(code=EXIT_NO_TAG_NEEDED)
if update_changelog:
changelog = Changelog()
+15
View File
@@ -63,6 +63,21 @@ class Git:
def get_branches(prefix: str = ""):
return Git._get_references("heads/" + prefix)
@staticmethod
def get_merge_conflicts(target: str, print: str | None = None) -> list[str]:
"""Archivos con conflictos al mergear target en HEAD. El merge se resuelve en memoria con
merge-tree, sin tocar el índice ni el worktree."""
process = Git(
"merge-tree", "HEAD", target, write_tree=True, name_only=True, messages=False
)._get(print, check=False)
# 0: sin conflictos, 1: con conflictos, otro: error (por ejemplo, historias sin relación)
if process.returncode not in (0, 1):
process.check_returncode()
# Primera línea: OID del árbol resultante, luego los archivos en conflicto
return [l for l in process.stdout.splitlines()[1:] if l]
@staticmethod
def status():
return list(map(Git.Status, Git("status", porcelain=True).lines(False)))
+1 -2
View File
@@ -3,7 +3,6 @@
from subprocess import CalledProcessError, SubprocessError
from typing import Annotated
import click
import typer
from rich.markup import escape
from rich.traceback import Traceback
@@ -70,7 +69,7 @@ def _print_error(message: str, title: str, e: BaseException):
base.io_error(message, title=title)
console.print(
Traceback.from_exception(
type(e), e, e.__traceback__, suppress=[click, typer]
type(e), e, e.__traceback__, suppress=[typer]
)
)
else: