refactor: migrate from class commands to scripts commands
This commit is contained in:
@@ -1,115 +1,118 @@
|
||||
from argparse import Namespace
|
||||
import typer
|
||||
|
||||
from git_flow import GitFlowError
|
||||
from git_flow.command.base import Command
|
||||
from git_flow.git import FLOWCONFIG_FILE, Git
|
||||
from git_flow.command.base import *
|
||||
|
||||
app = typer.Typer()
|
||||
|
||||
|
||||
class InitCommand(Command):
|
||||
def name(self) -> str:
|
||||
return "init"
|
||||
@app.command()
|
||||
def init():
|
||||
"""Inicializa el repositorio para utilizar git-flow"""
|
||||
|
||||
def description(self) -> str:
|
||||
return """Inicializa el repositorio para utilizar git-flow"""
|
||||
_ensure_is_repository()
|
||||
_ensure_not_already_initialized()
|
||||
|
||||
def run(self, args: Namespace = Namespace()):
|
||||
self._ensure_is_repository()
|
||||
self._ensure_not_already_initialized()
|
||||
branches = _setup_flow_branches()
|
||||
remote = _setup_flow_remote()
|
||||
|
||||
branches = self._setup_flow_branches()
|
||||
remote = self._setup_flow_remote()
|
||||
flowconfig = {
|
||||
"flow.initialized": "true",
|
||||
"flow.branches": ",".join(branches),
|
||||
}
|
||||
|
||||
flowconfig = {
|
||||
"flow.initialized": "true",
|
||||
"flow.branches": ",".join(branches),
|
||||
}
|
||||
if remote:
|
||||
flowconfig["flow.remote"] = remote
|
||||
|
||||
if remote:
|
||||
flowconfig["flow.remote"] = remote
|
||||
Git.set_config(flowconfig, FLOWCONFIG_FILE)
|
||||
Git("add", FLOWCONFIG_FILE).exec()
|
||||
Git("commit", message="feature: initialize git-flow").exec()
|
||||
|
||||
Git.set_config(flowconfig, FLOWCONFIG_FILE)
|
||||
Git("add", FLOWCONFIG_FILE).exec()
|
||||
Git("commit", message="feature: initialize git-flow").exec()
|
||||
_ensure_all_flow_branches_exist(branches, remote)
|
||||
|
||||
self._ensure_all_flow_branches_exist(branches, remote)
|
||||
|
||||
def _ensure_is_repository(self):
|
||||
if not Git.is_repository():
|
||||
self.warning("El directorio actual no es un repositorio.")
|
||||
def _ensure_is_repository():
|
||||
if not Git.is_repository():
|
||||
warning("El directorio actual no es un repositorio.")
|
||||
|
||||
if not self.confirm("¿Desea inicializarlo?"):
|
||||
raise GitFlowError(
|
||||
"No se puede continuar sin inicializar el repositorio"
|
||||
)
|
||||
if not confirm("¿Desea inicializarlo?"):
|
||||
raise GitFlowError("No se puede continuar sin inicializar el repositorio")
|
||||
|
||||
Git("init").exec()
|
||||
Git("init").exec()
|
||||
|
||||
def _ensure_not_already_initialized(self):
|
||||
if not self.flowconfig:
|
||||
return
|
||||
elif self.flowconfig.get("flow.initialized") == "true":
|
||||
raise GitFlowError("El repositorio ya fue inicializado para usar git-flow")
|
||||
|
||||
def _ensure_not_already_initialized():
|
||||
flowconfig = get_config()
|
||||
if not flowconfig:
|
||||
return
|
||||
elif flowconfig.get("flow.initialized") == "true":
|
||||
raise GitFlowError("El repositorio ya fue inicializado para usar git-flow")
|
||||
else:
|
||||
raise GitFlowError("Valor de 'flow.initialized' es inválido")
|
||||
|
||||
|
||||
def _setup_flow_branches():
|
||||
panel(
|
||||
"Configuración de entornos",
|
||||
"""Ingrese las ramas que representan los entornos de deploy del proyecto
|
||||
en orden creciente de cercanía al entorno productivo, y separados por
|
||||
coma. Por ejemplo: "dev, test, prod".""",
|
||||
)
|
||||
|
||||
branches = list(map(lambda b: b.strip(), prompt("Ramas", "main").split(",")))
|
||||
|
||||
if not all(branches):
|
||||
raise GitFlowError("No puede ingresar una rama vacia")
|
||||
|
||||
return branches
|
||||
|
||||
|
||||
def _setup_flow_remote():
|
||||
panel(
|
||||
"Configuración de remoto",
|
||||
"Puede configurar un repositorio remoto para generar PRs automáticamente",
|
||||
)
|
||||
|
||||
remote = None
|
||||
|
||||
if confirm("¿Configurar repositorio remoto?"):
|
||||
remotes = Git("remote").lines(print="Listando remotos disponibles")
|
||||
|
||||
if not remotes:
|
||||
info("No tiene ningún repositorio remoto, se creará uno.")
|
||||
|
||||
url = prompt(
|
||||
"Ingrese la URL del repositorio (e.g. https://github.com/user/repo.git)",
|
||||
persistent=True,
|
||||
)
|
||||
remote = "origin"
|
||||
Git("remote", "add", remote, url).exec(print="Agregando remoto")
|
||||
elif len(remotes) == 1:
|
||||
remote = remotes[0]
|
||||
else:
|
||||
raise GitFlowError("Valor de 'flow.initialized' es inválido")
|
||||
info("Tiene más de un remoto, seleccione el que va a utilizar.")
|
||||
remote = choice("Remoto", remotes)
|
||||
|
||||
def _setup_flow_branches(self):
|
||||
self.info(
|
||||
"""Ingrese las ramas que representan los entornos de deploy del proyecto en
|
||||
orden creciente de cercanía al entorno productivo, y separados por coma.
|
||||
Por ejemplo: "dev,test,prod"."""
|
||||
)
|
||||
return remote
|
||||
|
||||
branches = list(
|
||||
map(lambda b: b.strip(), self.prompt("Ramas", "main").split(","))
|
||||
)
|
||||
|
||||
if not all(branches):
|
||||
raise GitFlowError("No puede ingresar una rama vacia")
|
||||
def _ensure_all_flow_branches_exist(branches: list[str], remote: str | None):
|
||||
existing_branches = Git.get_branches()
|
||||
|
||||
return branches
|
||||
if not all(map(lambda b: b in existing_branches, branches)):
|
||||
warning("Algunas de las ramas de entornos expecificadas no existen.")
|
||||
info("Debe indicar sobre que rama se crearán las ramas de entorno.")
|
||||
|
||||
def _setup_flow_remote(self):
|
||||
self.info(
|
||||
"""Puede elegir o crear un repositorio remoto para generar automáticamente PRs"""
|
||||
)
|
||||
target_branch = choice("Rama", existing_branches)
|
||||
|
||||
remote = None
|
||||
|
||||
if self.confirm("¿Configurar repositorio remoto?"):
|
||||
remotes = Git("remote").lines(print="Listando remotos disponibles")
|
||||
|
||||
if not remotes:
|
||||
self.info("No tiene ningún repositorio remoto, se creará uno.")
|
||||
|
||||
url = self.prompt(
|
||||
"Ingrese la URL del repositorio (e.g. https://github.com/user/repo.git)",
|
||||
persistent=True,
|
||||
for branch in branches:
|
||||
if branch not in existing_branches:
|
||||
Git("branch", branch, target_branch).exec(
|
||||
print="Creando rama inexistente"
|
||||
)
|
||||
remote = "origin"
|
||||
Git("remote", "add", remote, url).exec(print="Agregando remoto")
|
||||
elif len(remotes) == 1:
|
||||
remote = remotes[0]
|
||||
else:
|
||||
self.info("Tiene más de un remoto, seleccione el que va a utilizar.")
|
||||
remote = self.choice("Remoto", remotes)
|
||||
|
||||
return remote
|
||||
|
||||
def _ensure_all_flow_branches_exist(self, branches: list[str], remote: str | None):
|
||||
existing_branches = Git.get_branches()
|
||||
|
||||
if not all(map(lambda b: b in existing_branches, branches)):
|
||||
self.warning("Algunas de las ramas de entornos expecificadas no existen.")
|
||||
self.info("Debe indicar sobre que rama se crearán las ramas de entorno.")
|
||||
|
||||
target_branch = self.choice("Rama", existing_branches)
|
||||
|
||||
for branch in branches:
|
||||
if branch not in existing_branches:
|
||||
Git("branch", branch, target_branch).exec(
|
||||
print="Creando rama inexistente"
|
||||
if remote:
|
||||
Git("push", remote, branch, set_upstream=True).exec(
|
||||
print="Creando rama en remoto"
|
||||
)
|
||||
|
||||
if remote:
|
||||
Git("push", remote, branch, set_upstream=True).exec(
|
||||
print="Creando rama en remoto"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user