import asyncio import shlex from typing import Tuple from git import Repo from git.exc import GitCommandError, InvalidGitRepositoryError import config from ..logging import LOGGER def install_req(cmd: str) -> Tuple[str, str, int, int]: async def install_requirements(): args = shlex.split(cmd) process = await asyncio.create_subprocess_exec( *args, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, ) stdout, stderr = await process.communicate() return ( stdout.decode("utf-8", "replace").strip(), stderr.decode("utf-8", "replace").strip(), process.returncode, process.pid, ) return asyncio.get_event_loop().run_until_complete(install_requirements()) def git(): REPO_LINK = config.UPSTREAM_REPO if config.GIT_TOKEN: GIT_USERNAME = REPO_LINK.split("com/")[1].split("/")[0] TEMP_REPO = REPO_LINK.split("https://")[1] UPSTREAM_REPO = f"https://{GIT_USERNAME}:{config.GIT_TOKEN}@{TEMP_REPO}" else: UPSTREAM_REPO = config.UPSTREAM_REPO try: repo = Repo() LOGGER(__name__).info(f"Git Client Found [VPS DEPLOYER]") except GitCommandError: LOGGER(__name__).info(f"Invalid Git Command") except InvalidGitRepositoryError: repo = Repo.init() if "origin" in repo.remotes: origin = repo.remote("origin") else: origin = repo.create_remote("origin", UPSTREAM_REPO) origin.fetch() repo.create_head( config.UPSTREAM_BRANCH, origin.refs[config.UPSTREAM_BRANCH], ) repo.heads[config.UPSTREAM_BRANCH].set_tracking_branch( origin.refs[config.UPSTREAM_BRANCH] ) repo.heads[config.UPSTREAM_BRANCH].checkout(True) try: repo.create_remote("origin", config.UPSTREAM_REPO) except BaseException: pass nrs = repo.remote("origin") nrs.fetch(config.UPSTREAM_BRANCH) try: nrs.pull(config.UPSTREAM_BRANCH) except GitCommandError: repo.git.reset("--hard", "FETCH_HEAD") install_req("pip3 install --no-cache-dir -r requirements.txt") LOGGER(__name__).info(f"Fetching updates from upstream repository...")