oggit/api/gitapi.py

100 lines
2.3 KiB
Python

from flask import Flask, jsonify
import os.path
import os
import git
import shutil
from opengnsys_git_installer import OpengnsysGitInstaller
repositories_base_path = "/opt/opengnsys/images"
# Create an instance of the Flask class
app = Flask(__name__)
# Define a route for the root URL
@app.route('/')
def home():
return jsonify({
"message": "OpenGnsys Git API"
})
# Define another route for /hello/<name>
@app.route('/repositories')
def get_repositories():
if not os.path.isdir(repositories_base_path):
return jsonify({"error": "Repository storage not found, git functionality may not be installed."}), 500
repos = []
for entry in os.scandir(repositories_base_path):
if entry.is_dir(follow_symlinks=False) and os.path.isfile(os.path.join(entry.path, "HEAD")):
name = entry.name
if name.endswith(".git"):
name = name[:-4]
repos = repos + [name]
return jsonify({
"repositories": repos
})
@app.route('/repositories/<repo>', methods=['PUT'])
def create_repo(repo):
repo_path = os.path.join(repositories_base_path, repo + ".git")
if os.path.isdir(repo_path):
return jsonify({"status": "Repository already exists"}), 200
installer = OpengnsysGitInstaller()
installer._init_git_repo(repo + ".git")
return jsonify({"status": "Repository created"}), 201
@app.route('/repositories/<repo>', methods=['DELETE'])
def delete_repo(repo):
repo_path = os.path.join(repositories_base_path, repo + ".git")
if not os.path.isdir(repo_path):
return jsonify({"error": "Repository not found"}), 404
shutil.rmtree(repo_path)
return jsonify({"status": "Repository deleted"}), 200
@app.route('/repositories/<repo>/branches')
def get_repository_branches(repo):
repo_path = os.path.join(repositories_base_path, repo + ".git")
if not os.path.isdir(repo_path):
return jsonify({"error": "Repository not found"}), 404
gitRepo = git.Repo(repo_path)
branches = []
for branch in gitRepo.branches:
branches = branches + [branch.name]
return jsonify({
"branches": branches
})
# Define a route for health check
@app.route('/health')
def health_check():
return jsonify({
"status": "OK"
})
# Run the Flask app
if __name__ == '__main__':
app.run(debug=True)