diff options
author | Frederick Yin <fkfd@macaw.me> | 2020-06-13 22:51:08 +0800 |
---|---|---|
committer | Frederick Yin <fkfd@macaw.me> | 2020-06-13 22:51:08 +0800 |
commit | 89d16bb05a61936658ae2939d57e2c3e5f726a6b (patch) | |
tree | 5e89456b138e0498b16602b05c00f843847e929e /git-gmi/cgi.py |
Initial commit: MVP
Diffstat (limited to 'git-gmi/cgi.py')
-rwxr-xr-x | git-gmi/cgi.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/git-gmi/cgi.py b/git-gmi/cgi.py new file mode 100755 index 0000000..c243ccd --- /dev/null +++ b/git-gmi/cgi.py @@ -0,0 +1,77 @@ +#!/home/fakefred/p/git.gmi/venv/bin/python3.8 +# gotta change the executable path before running +from git import * +from const 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): + # 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("Welcome to the git.gmi demo") + print("Available repositories:") + print("\n".join([f"=> {dir}/summary" 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: + pass # TODO: summary + + 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] + + if len(path_trace) == 3: + location = [] + else: + location = path_trace[3:] + + try: # is dir + print(repo.view_tree(branch, location)) + except FileNotFoundError: # is file + try: + print(repo.view_blob(branch, location)) + except FileNotFoundError: + print("50 Error locating content") + + elif view == "log": + try: + print(repo.view_log()) + return + except: + print(STATUS_TEMPORARY_FAILURE) + return + + +handle_cgi_request(environ.get("PATH_INFO")) |