From eafb3f1b310111f01c161033f4dc9088996c94b8 Mon Sep 17 00:00:00 2001 From: Jonathan Teran Carballo Date: Sun, 23 Nov 2025 18:49:42 -0300 Subject: [PATCH 1/2] feature: agrego soporte para parametros repetidos en llamadas a Git --- src/git_flow/git.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/git_flow/git.py b/src/git_flow/git.py index b9606c1..d3392a7 100644 --- a/src/git_flow/git.py +++ b/src/git_flow/git.py @@ -89,7 +89,7 @@ class Git: def is_repository() -> bool: return Git("rev-parse", is_inside_work_tree=True).code() == 0 - def __init__(self, subcommand: str, *args: str, **kwargs: str | int | bool | None) -> None: + def __init__(self, subcommand: str, *args: str, **kwargs: str | int | bool | list[str] | None) -> None: self.command = ["git", subcommand] for option, value in kwargs.items(): @@ -103,6 +103,9 @@ class Git: self.command.append(prefix + option) elif value is None: continue + elif isinstance(value, list): + for v in value: + self.command.append("--" + option + "=" + v) else: value = value if isinstance(value, str) else str(value) From c74f1a309354cf2f5d333ee61fc468b198e52919 Mon Sep 17 00:00:00 2001 From: Jonathan Teran Carballo Date: Sun, 23 Nov 2025 18:50:00 -0300 Subject: [PATCH 2/2] feature: agrego comando branch para listar ramas --- src/git_flow/command/branch.py | 79 ++++++++++++++++++++++++++++++++++ src/git_flow/main.py | 2 + 2 files changed, 81 insertions(+) create mode 100644 src/git_flow/command/branch.py diff --git a/src/git_flow/command/branch.py b/src/git_flow/command/branch.py new file mode 100644 index 0000000..c09cdd3 --- /dev/null +++ b/src/git_flow/command/branch.py @@ -0,0 +1,79 @@ +from argparse import ArgumentParser, Namespace +from git_flow import GitFlowError +from git_flow.command.base import COLOR_GREEN, COLOR_RED, COLOR_RESET, Command +from git_flow.git import Git + + +BRANCH_FORMAT = "%(refname:short)" + + +class BranchCommand(Command): + def name(self) -> str: + return "branch" + + def description(self) -> str: + return """Lista ramas del repositorio, agrupandolas por entorno objetivo""" + + def setup_parser(self, parser: ArgumentParser) -> ArgumentParser: + parser.add_argument( + "environment", + nargs="?", + help="Entorno de las ramas a listar. Puede ser vacio para listar ramas de todos los entornos, un entorno válido, o 'trash' para listar las ramas eliminadas.", + ) + + return parser + + def run(self, args: Namespace = Namespace()): + self.ensure_initialized() + + self.current_branch = Git.get_current_branch() + self.environments = self.flowconfig["flow.branches"].split(",") + + if args.environment is None: + self.show_all_branches() + elif args.environment == "trash": + self.show_trash_branches() + elif args.environment in self.environments: + self.show_env_branches(args.environment) + else: + raise GitFlowError(f"'{args.environment}' no es un entorno válido.") + + def show_trash_branches(self): + branches = self.get_trash_branches() + + for branch in branches: + prefix = (COLOR_RED + "*") if branch == self.current_branch else " " + print(prefix + " " + branch + COLOR_RESET) + + def get_trash_branches(self): + return Git("for-each-ref", "refs/heads/trash/", format=BRANCH_FORMAT).lines() + + def show_all_branches(self): + for environment in self.environments: + self.show_env_branches(environment) + + trash = len(self.get_trash_branches()) + print("\nTrash: " + str(trash) + " rama" + ("" if trash == 1 else "s")) + + def show_env_branches(self, environment: str): + is_first_env = environment == self.environments[0] + branches = ( + Git( + "for-each-ref", + "refs/heads/", + exclude=["refs/heads/trash/", "refs/heads/release/"], + format=BRANCH_FORMAT, + ).lines() + if is_first_env + else Git( + "for-each-ref", + "refs/heads/release/" + environment + "/", + format=BRANCH_FORMAT, + ).lines() + ) + + for branch in branches: + prefix = (COLOR_GREEN + "*") if branch == self.current_branch else " " + print(prefix + " " + branch + COLOR_RESET) + + diff --git a/src/git_flow/main.py b/src/git_flow/main.py index 1099e09..0281c81 100755 --- a/src/git_flow/main.py +++ b/src/git_flow/main.py @@ -5,6 +5,7 @@ from argparse import Namespace, ArgumentParser from git_flow import GitFlowError from git_flow.command.base import Command +from git_flow.command.branch import BranchCommand from git_flow.command.commit import CommitCommand from git_flow.command.init import InitCommand from git_flow.command.merge import MergeCommand @@ -70,6 +71,7 @@ def main(): MergeCommand(), TagCommand(), ReleaseCommand(), + BranchCommand() ) try: command.run()