from git import * from const import * from config import * from os import environ, listdir # be careful when using print(); stdout is passed to the client. # this cgi uses \n as newline. def generate_navigation(repo_name: str): pass # TODO def handle_cgi_request(path: str, query: str): # intended to work with Jetforce. # url: gemini://git.gemini.site/cgi-bin/cgi.py/repo/src/static/css/[index.css] # path: /repo/src/static/css/[index.css] # path_trace = ['repo', 'src', 'static', 'css', 'index.css'] path_trace = path[1:].split("/") if path_trace == [""]: # empty path print(f"{STATUS_SUCCESS} {META_GEMINI}") # welcome page print(f"# Welcome to {GIT_GMI_SITE_TITLE}") print("## Available repositories:") print("\n".join([f"=> {dir}/" for dir in listdir(GIT_CATALOG)])) return try: repo = GitGmiRepo(path_trace[0], f"{GIT_CATALOG}/{path_trace[0]}") except FileNotFoundError: print(STATUS_NOT_FOUND) return if len(path_trace) > 1: view = path_trace[1] # e.g. summary, tree, log else: print("31 summary") return if view == "summary": try: print(repo.view_summary()) return except: print(STATUS_TEMPORARY_FAILURE) return elif view == "tree": if len(path_trace) == 2: print("31 master/") return if len(path_trace) > 2: branch = path_trace[2] location = path_trace[3:] try: # is dir print(repo.view_tree(branch, location)) except FileNotFoundError: # is file try: if query == "raw": print(repo.view_raw_blob(branch, location)) else: print(repo.view_blob(branch, location)) except FileNotFoundError: print(STATUS_NOT_FOUND) elif view == "log": try: print(repo.view_log()) return except: print(STATUS_TEMPORARY_FAILURE) return handle_cgi_request(environ.get("PATH_INFO"), environ.get("QUERY_STRING"))