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 handle_cgi_request(path: str, query: str): # intended to work with Jetforce. # hypothetical example: # url: gemini://git.gemini.site/git/cgi/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: # gemini://git.gemini.site/git/cgi// print("31 summary") return if view == "summary": try: print(repo.view_summary()) except: print(STATUS_TEMPORARY_FAILURE) elif view == "tree": if len(path_trace) == 2: # gemini://git.gemini.site/git/cgi//tree/ print(f"31 {MAIN_BRANCH}/") elif len(path_trace) > 2: # gemini://git.gemini.site/git/cgi//tree// 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()) except: print(STATUS_TEMPORARY_FAILURE) elif view == "commit": try: commit_str = path_trace[2] except IndexError: print("50 No commit id given") return try: if query == "raw": print(repo.view_raw_commit(commit_str)) else: print(repo.view_commit(commit_str)) except FileNotFoundError: print("50 No such commit") except: print(STATUS_TEMPORARY_FAILURE) elif view == "refs": try: print(repo.view_refs()) except: print(STATUS_TEMPORARY_FAILURE) handle_cgi_request(environ.get("PATH_INFO"), environ.get("QUERY_STRING"))