From 7bca4ba85cfa8fb07d98fa4a4dc341d8cd119bd5 Mon Sep 17 00:00:00 2001 From: Jonathan Teran Date: Thu, 17 Sep 2026 11:10:16 -0300 Subject: [PATCH] fix: apply release prefix and ticket detection to single-commit PR titles The single-commit branch of the title generation logic used the raw commit message verbatim, bypassing the release-branch prefix and branch-ticket detection entirely. Both are now applied on top of the commit message when there's only one commit. --- src/git_flow/command/merge.py | 38 ++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/git_flow/command/merge.py b/src/git_flow/command/merge.py index 2ca7f81..0b2dd42 100644 --- a/src/git_flow/command/merge.py +++ b/src/git_flow/command/merge.py @@ -1,3 +1,5 @@ +from typing import Optional + import typer import git_flow.command.base as base @@ -102,7 +104,7 @@ def check_merge_conflicts(target: str): def create_pull_request(token: str, branch: str, target: str): changelog = Changelog() commits = Git("log", target + "..", format="%s").lines() - title = commits[0] if len(commits) == 1 else _get_pr_title_from_branch(branch) + title = _get_pr_title(branch, commits) base.panel("Título del PR", title) @@ -120,34 +122,42 @@ def create_pull_request(token: str, branch: str, target: str): base.io_success(message, "Rama creada") -def _get_pr_title_from_branch(branch: str) -> str: +def _get_pr_title(branch: str, commits: list[str]) -> str: if branch in base.environments: target = base.environments[base.environments.index(branch) + 1] return f"Sincronización de entorno {branch} a {target}" components = branch.split("/") # / or release/// + release_prefix = f"[Pasaje a {components[1]}]" if len(components) == 4 else None branch_type = components[-2] - branch_desc = components[-1] + branch_ticket, branch_desc = _extract_ticket_from_branch(components[-1]) - # detect if branch description has ticket as prefix: = ABC-123-my-branch-name - branch_ticket = None - first_dash = branch_desc.find("-") - second_dash = branch_desc.find("-", first_dash + 1) - - if first_dash >= 0 and second_dash >= 0: - maybe_ticket = branch_desc[:second_dash] - if base.is_valid_ticket(maybe_ticket): - branch_ticket = maybe_ticket - branch_desc = branch_desc[second_dash + 1 :] + # when there's a single commit, use it as the PR description instead of + # deriving one from the branch name, but keep the release prefix / ticket + if len(commits) == 1: + return " ".join(filter(None, [release_prefix, branch_ticket, commits[0]])) return " ".join( filter( None, [ - f"[Pasaje a {components[1]}]" if len(components) == 4 else None, + release_prefix, branch_type + ":", branch_ticket, branch_desc.replace("-", " "), ], ) ) + + +def _extract_ticket_from_branch(branch_desc: str) -> tuple[Optional[str], str]: + """detect if branch description has ticket as prefix: = ABC-123-my-branch-name""" + first_dash = branch_desc.find("-") + second_dash = branch_desc.find("-", first_dash + 1) + + if first_dash >= 0 and second_dash >= 0: + maybe_ticket = branch_desc[:second_dash] + if base.is_valid_ticket(maybe_ticket): + return maybe_ticket, branch_desc[second_dash + 1 :] + + return None, branch_desc