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()