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"))
|