From 8d050a241dc1d09d0c2530303c9903ba4b198d23 Mon Sep 17 00:00:00 2001 From: mcbloch Date: Wed, 27 Mar 2024 17:13:33 +0100 Subject: [PATCH] finish gitea integration --- src/sync_gitea.py | 69 ++++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/src/sync_gitea.py b/src/sync_gitea.py index e94b07d..d947bd3 100644 --- a/src/sync_gitea.py +++ b/src/sync_gitea.py @@ -1,6 +1,7 @@ from __future__ import print_function import os +import pathlib import time from pprint import pprint @@ -8,18 +9,24 @@ import git import giteapy from giteapy.rest import ApiException +import db from config import config # https://docs.gitea.com/api/1.20/ REPO_FOLDER = config["gitea"]["local_repo_folder"] +TOKEN = config["gitea"]["access_token"] + +GIT_ORG = config["gitea"]["remote_org"] +GIT_REPO = config["gitea"]["remote_repo"] + def init_sync(): repo = get_repo() configuration = giteapy.Configuration() - configuration.host = "https://git.zeus.gent/api/v1" + configuration.host = f"https://{config['gitea']['server_url']}/api/v1" configuration.api_key["token"] = config["gitea"]["access_token"] configuration.debug = False @@ -36,11 +43,12 @@ def get_repo(): else: print("Cloning repo") repo = git.Repo.clone_from( - f"https://{TOKEN_NAME}:{TOKEN}@git.zeus.gent/bestuur/drive.git", REPO_FOLDER + f"https://{TOKEN}@{config['gitea']['server_url']}/{GIT_ORG}/{config['gitea']['remote_repo']}.git", + REPO_FOLDER, ) with repo.config_writer() as cw: - cw.set_value("user", "email", "codimd.zeus.gent@mcbloch.dev") - cw.set_value("user", "name", "CodiMD sync bot") + cw.set_value("user", "email", config["gitea"]["commit_user_email"]) + cw.set_value("user", "name", config["gitea"]["commit_user_name"]) repo.remotes.origin.fetch() return repo @@ -79,34 +87,40 @@ def sync_file(repo, api_instance, path, sync_to): print(repo.untracked_files) if repo.index.diff() or repo.untracked_files: print(" Note has changes. Making a commit.") - repo.git.add(sync_to) - repo.git.commit("-m", sync_to) + repo.index.add([sync_to]) + repo.index.commit("Updating file with codimd version") print(f" Pushing to branch: {branch_name}") repo.git.push("-u", "origin", branch_name) - resp = api_instance.repo_list_pull_requests("ZeusWPI", "drive", state="open") - - - if not drive.mergerequests.list(source_branch=branch_name, state="opened"): - if drive.mergerequests.list(source_branch=branch_name): + resp = api_instance.repo_list_pull_requests(GIT_ORG, GIT_REPO, state="open") + open_branch_requests = [ + r for r in resp if r.head.ref == branch_name and r.state == "open" + ] + if len(open_branch_requests) == 0: + branch_requests = [r for r in resp if r.head.ref == branch_name] + if len(branch_requests) > 0: print( " Creating a new merge request to update the gitlab document with the new version from CodiMD." ) - drive.mergerequests.create( - { - "source_branch": branch_name, - "target_branch": "master", - "title": f"[CodiMD sync] Update document {sync_to}", - } + api_instance.repo_create_pull_request( + GIT_ORG, + GIT_REPO, + body=giteapy.CreatePullRequestOption( + base="master", + head=branch_name, + title=f"[CodiMD sync] Update document {sync_to}", + ), ) else: print(" Creating a new merge request to add the document to gitlab.") - drive.mergerequests.create( - { - "source_branch": branch_name, - "target_branch": "master", - "title": f"[CodiMD sync] Add document {sync_to}", - } + api_instance.repo_create_pull_request( + GIT_ORG, + GIT_REPO, + body=giteapy.CreatePullRequestOption( + base="master", + head=branch_name, + title=f"[CodiMD sync] Add document {sync_to}", + ), ) else: print(" Merge request was already open.") @@ -117,16 +131,17 @@ def sync_file(repo, api_instance, path, sync_to): if __name__ == "__main__": repo, api_handler = init_sync() - for file_id, file_info in db.get_files().items(): + for i, (file_id, file_info) in enumerate(db.get_files().items()): if file_info["valid"]: local_file_path = file_info["local_file_path"] sync_to = file_info["metadata"]["sync-to"] try: - sync_file(repo, api_handler, local_file_path, sync_to) + sync_file(repo, api_handler, local_file_path, sync_to) except Exception as e: - print("Critical error: Failed to sync file to Gitea") - + import traceback + print("Critical error: Failed to sync file to Gitea") + traceback.print_exc() # # username = 'username_example' # str | username of the user that will own the created organization # # organization = giteapy.CreateOrgOption() # CreateOrgOption |