diff --git a/api/repo_api.py b/api/repo_api.py index f597715..5f5ede8 100644 --- a/api/repo_api.py +++ b/api/repo_api.py @@ -2288,6 +2288,31 @@ def git_forgejo_create_repo(repo): "private" : False }) +def git_forgejo_delete_command(url): + token = "" + with open("/opt/opengnsys/etc/ogGitApiToken.cfg", "r", encoding='utf-8') as token_file: + token = token_file.read().strip() + + if url[0] == "/": + url = url[1:] + + url = f"http://localhost:{OGGIT_FORGEJO_PORT}/{url}" + + journal.send(f"Executing forgejo DELETE to {url}...", PRIORITY=journal.LOG_DEBUG, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG") + + r = requests.delete( + url, + headers = { 'Authorization' : f"token {token}" }, + timeout = 60 + ) + + journal.send(f"Request status was {r.status_code}, content {r.content}", PRIORITY=journal.LOG_DEBUG, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG") + + return r.status_code, r.content.decode('utf-8') + +def git_forgejo_delete_repo(repo): + return git_forgejo_delete_command(f"/api/v1/repos/oggit/{repo}") + def git_forgejo_create_tag(repo,tag,msg,target): return git_forgejo_post_command(f"/api/v1/repos/oggit/{repo}/tags", { "message": msg, @@ -2453,9 +2478,23 @@ def git_create_repository(): return jsonify({"status": "Repository created"}), 201 -@app.route("/ogrepository/v1/git/repositories", methods=['DELETE']) -def git_delete_repository(): - return jsonify({"error" : "Not implemented"}), 500 +@app.route("/ogrepository/v1/git/repositories/", methods=['DELETE']) +def git_delete_repository(repo): + repo_path = os.path.join(REPOSITORIES_BASE_PATH, OGGIT_USER, repo + ".git") + + status, content = git_forgejo_delete_repo(repo) + if status not in (204, 404): + journal.send(f"Can't delete repository {repo} from forgejo: {content}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG") + return jsonify({"error" : f"Failed to delete from forgejo: {content}"}), 500 + + if os.path.isdir(repo_path): + import shutil + shutil.rmtree(repo_path, ignore_errors=True) + journal.send(f"Repository {repo} deleted", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG") + return jsonify({"status": "Repository deleted"}), 200 + else: + journal.send(f"Can't delete repository {repo}, not found at {repo_path}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG") + return jsonify({"status": "Repository not found"}), 404 @app.route("/ogrepository/v1/git/repositories//sync", methods=['POST']) def git_sync_repository(repo):