From 345c861037640920326271961d2a4b5d3833f81f Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 23:55:26 -0600 Subject: [PATCH] =?UTF-8?q?docs:=20Agregar=20documentaci=C3=B3n=20de=20mer?= =?UTF-8?q?ge-pr=20a=20GEMINI.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Añadir sección completa para el comando merge-pr - Incluir validación de rama dev obligatoria - Agregar ejemplos de uso con diferentes métodos de merge - Documentar verificaciones automáticas del script --- GEMINI.md | 28 +++++++++++++++++ gitea_cli_helper.py | 61 ++++++++++++++++++++++++++++++++++++-- pr_description_issue32.txt | 48 ++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 pr_description_issue32.txt diff --git a/GEMINI.md b/GEMINI.md index 7db976e..ef5ff0a 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -56,6 +56,34 @@ python gitea_cli_helper.py close-issue --issue-number 123 - `--issue-number`: Número del issue a cerrar. +#### 5. Hacer Merge de un Pull Request + +```bash +python gitea_cli_helper.py merge-pr --pr-number 46 --merge-method merge +``` + +- `--pr-number`: Número del Pull Request a mergear. +- `--merge-method`: Método de merge a utilizar. Opciones disponibles: `merge` (default), `squash`, `rebase`. + +**IMPORTANTE**: Solo se permite hacer merge a la rama `dev`. El script validará automáticamente que el PR tenga como destino la rama `dev` antes de proceder. Si el PR apunta a otra rama (como `main`), el merge será rechazado con un mensaje de error. + +**Ejemplo de uso:** +```bash +# Merge estándar (commit de merge) +python gitea_cli_helper.py merge-pr --pr-number 46 + +# Merge con squash (un solo commit con todos los cambios) +python gitea_cli_helper.py merge-pr --pr-number 46 --merge-method squash + +# Merge con rebase (aplica commits individualmente sobre la rama base) +python gitea_cli_helper.py merge-pr --pr-number 46 --merge-method rebase +``` + +El script también verifica: +- Si el PR ya fue mergeado (mostrará mensaje informativo) +- Si el PR está cerrado sin mergear (error) +- Si el PR tiene conflictos o no es mergeable (error) + --- diff --git a/gitea_cli_helper.py b/gitea_cli_helper.py index 2a2bb6c..d0682e3 100644 --- a/gitea_cli_helper.py +++ b/gitea_cli_helper.py @@ -25,7 +25,9 @@ def _make_gitea_request(method, endpoint, payload=None): "Content-Type": "application/json" } try: - if method == "POST": + if method == "GET": + response = requests.get(api_url, headers=headers) + elif method == "POST": response = requests.post(api_url, headers=headers, data=json.dumps(payload)) elif method == "PATCH": response = requests.patch(api_url, headers=headers, data=json.dumps(payload)) @@ -33,7 +35,10 @@ def _make_gitea_request(method, endpoint, payload=None): raise ValueError(f"Unsupported HTTP method: {method}") response.raise_for_status() - return response.json() + # Some endpoints return empty responses (like merge) + if response.text: + return response.json() + return {} except requests.exceptions.RequestException as e: print(f"Error en la solicitud {method} a {api_url}: {e}") if hasattr(e, 'response') and e.response is not None: @@ -105,6 +110,50 @@ def close_issue(issue_number): _make_gitea_request("PATCH", endpoint, payload) print(f"Issue #{issue_number} cerrado exitosamente.") +def merge_pull_request(pr_number, merge_method="merge"): + """Merges a pull request (only allowed to dev branch).""" + # First, get PR information to check the base branch + endpoint = f"repos/{GITEA_USERNAME}/{GITEA_REPO_NAME}/pulls/{pr_number}" + print(f"Obteniendo información del PR #{pr_number}...") + pr_info = _make_gitea_request("GET", endpoint) + + # Check if PR is already merged + if pr_info.get('merged', False): + print(f"INFO: El PR #{pr_number} ya fue mergeado.") + return + + # Check if PR is closed + if pr_info.get('state') == 'closed': + print(f"ERROR: El PR #{pr_number} está cerrado y no se puede mergear.") + return + + # Check if base branch is 'dev' + base_branch = pr_info.get('base', {}).get('ref', '') + if base_branch != 'dev': + print(f"ERROR: Solo se permite hacer merge a la rama 'dev'.") + print(f"Este PR tiene como destino la rama '{base_branch}'.") + return + + # Check if PR is mergeable + if not pr_info.get('mergeable', False): + print(f"ERROR: El PR #{pr_number} no se puede mergear. Puede tener conflictos.") + return + + # Proceed with merge + merge_endpoint = f"repos/{GITEA_USERNAME}/{GITEA_REPO_NAME}/pulls/{pr_number}/merge" + payload = { + "do": merge_method, + "merge_title_field": pr_info.get('title', ''), + "merge_message_field": f"Merge pull request #{pr_number} from {pr_info.get('head', {}).get('ref', '')}\n\n{pr_info.get('title', '')}" + } + + print(f"Haciendo merge del PR #{pr_number} a la rama 'dev' usando método '{merge_method}'...") + try: + _make_gitea_request("POST", merge_endpoint, payload) + print(f"PR #{pr_number} mergeado exitosamente a la rama 'dev'.") + except Exception as e: + print(f"Error al hacer merge del PR #{pr_number}: {e}") + def main(): parser = argparse.ArgumentParser(description="Helper CLI para interactuar con la API de Gitea.") subparsers = parser.add_subparsers(dest="command", help="Comandos disponibles") @@ -129,6 +178,12 @@ def main(): # Subparser para cerrar issue close_issue_parser = subparsers.add_parser("close-issue", help="Cierra un issue existente.") close_issue_parser.add_argument("--issue-number", type=int, required=True, help="Número del issue a cerrar.") + + # Subparser para merge PR + merge_pr_parser = subparsers.add_parser("merge-pr", help="Hace merge de un pull request (solo a rama dev).") + merge_pr_parser.add_argument("--pr-number", type=int, required=True, help="Número del pull request.") + merge_pr_parser.add_argument("--merge-method", choices=["merge", "squash", "rebase"], default="merge", + help="Método de merge: merge, squash o rebase (default: merge).") args = parser.parse_args() @@ -140,6 +195,8 @@ def main(): comment_issue(args.issue_number, args.body) elif args.command == "close-issue": close_issue(args.issue_number) + elif args.command == "merge-pr": + merge_pull_request(args.pr_number, args.merge_method) else: parser.print_help() diff --git a/pr_description_issue32.txt b/pr_description_issue32.txt new file mode 100644 index 0000000..deaca72 --- /dev/null +++ b/pr_description_issue32.txt @@ -0,0 +1,48 @@ +## Resumen + +Este Pull Request implementa la generación automática de muestras al confirmar órdenes de laboratorio (Issue #32), incluyendo correcciones de traducciones y flujo de trabajo. + +## Funcionalidades principales + +### 1. Generación Automática de Muestras +- Al confirmar una orden de laboratorio, se generan automáticamente las muestras necesarias +- Los análisis que requieren el mismo tipo de muestra se agrupan en un único contenedor +- Cálculo automático del volumen total sumando todos los análisis del grupo +- Cada muestra recibe un código de barras único (formato YYMMDDNNNNNNC con dígito verificador Luhn) + +### 2. Flujo de trabajo completo +- Estados: Pendiente de Recolección → Recolectada → Recibida → En Proceso → Analizada → Almacenada/Desechada +- Agregado método `action_collect()` que faltaba para el estado inicial +- Botones de acción visibles según el estado actual + +### 3. Traducciones al español +- Todos los campos de modelos traducidos al español +- Vistas actualizadas con etiquetas en español +- Estados del flujo de trabajo en español +- Inicialización de Odoo con idioma español (--load-language es_ES) + +### 4. Notificaciones y manejo de errores +- Notificaciones en el chatter de la orden sobre muestras generadas +- Advertencias para análisis sin tipo de muestra definido +- Manejo robusto de errores sin interrumpir la confirmación de órdenes + +## Cambios técnicos + +- Extendido modelo `sale.order` con campo `generated_sample_ids` y lógica de generación +- Mejorado modelo `stock.lot` con campos adicionales y generación de códigos de barras +- Actualización de vistas con nuevos campos y mejoras de usabilidad +- Script de verificación para pruebas completas +- Actualización de CLAUDE.md con timeout de 5 minutos y ubicación de scripts de prueba + +## Pruebas + +- Todas las tareas probadas individualmente con reinicio de instancia efímera +- Verificación de logs sin errores en cada paso +- Demo data funcional con órdenes confirmadas automáticamente +- Criterios de aceptación cumplidos (7 de 8, uno opcional no implementado) + +## Dependencias + +- Requiere Issue #44 (relaciones test-muestra) - Ya completado y mergeado + +Ready for merge to dev branch. \ No newline at end of file