net-backup/app/repo.py

76 lines
2.5 KiB
Python

from git import Repo, InvalidGitRepositoryError, Git
from config import cfg
import logging as log
from datetime import datetime
def check_remote_repo(repo: Repo):
log.info("check remote repo ")
if cfg.git.branch not in [r.name for r in repo.remotes]:
repo.create_remote(
name=cfg.git.branch,
url=f"{cfg.git.protocol}://{cfg.git.username}:"
f"{cfg.git.token}@{cfg.git.remote}",
)
log.info("set remote repo %r", cfg.git.branch)
remote = repo.remote(name=cfg.git.branch)
remote.fetch()
repo.git.merge(f"{cfg.git.branch}/{cfg.git.branch}")
log.info(
"merge from remote repo ",
)
else:
remote = repo.remote(name=cfg.git.branch)
remote.set_url(
f"{cfg.git.protocol}://{cfg.git.username}:"
f"{cfg.git.token}@{cfg.git.remote}"
)
log.info("update remote repo url %r", cfg.git.branch)
def check_bcp_repo(path: str = cfg.bcp.dir) -> None:
Git().config("--global", "--add", "safe.directory", path)
log.info("check local repo %r", path)
try:
repo = Repo(path)
log.info("local repo exists %r", path)
if cfg.git.push:
check_remote_repo(repo)
except InvalidGitRepositoryError:
repo = Repo.init(path=path, initial_branch=cfg.git.branch)
log.info("init repo in %r", path)
with repo.config_writer() as config:
config.set_value("user", "name", cfg.git.user)
config.set_value("user", "email", cfg.git.mail)
if cfg.git.push:
check_remote_repo(repo)
except Exception as e:
log.warning("Error: %r", e)
def add_file_and_commit(file_name: str) -> None:
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
repo = Repo(cfg.bcp.dir)
if file_name in repo.untracked_files:
repo.git.add(file_name)
repo.index.commit("add %s %s" % (file_name, current_time))
log.info("%r added in repo", file_name)
if bool(repo.git.diff(file_name)):
repo.index.add([file_name])
repo.index.commit("update %s %s" % (file_name, current_time))
log.info("change in %r commited", file_name)
else:
log.info("no changed in file %r", file_name)
def push_to_remote():
repo = Repo(cfg.bcp.dir)
remote = repo.remote(name=cfg.git.branch)
remote.push(refspec=f"{cfg.git.branch}:{cfg.git.branch}")
log.info("push to remote repo %r", cfg.git.branch)