summaryrefslogtreecommitdiff
path: root/git-gmi/cgi.py
blob: 9f0e1a988bb49421e0bdb3338cabd824f311bf5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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"))