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
|
# git.gmi - git frontend CGI script
## Front Matter
You may find it strange how I wrote a CGI script when there are so many amazing things available, and you're right. Git.gmi isn't meant to be a CGI script; it _had_ to be one. The only Gemini server library I know in Python, [Jetforce](https://github.com/michael-lazar/jetforce), is licensed under the [Floodgap "Free" Software License](https://www.floodgap.com/software/ffsl/), which is free software but well, free as in beer. I find absolutely no reason to allow proprietization but prohibit monetization, which is the _exact opposite_ from the GPL - unfortunately the license of choice by the `pygit2` devs. So here we are, locked in restrictions of both fundamental dependencies that don't get along with each other. I once comtemplated violating FFSL, before coming up with this workaround, i.e. CGI. Git.gmi is licensed under GPLv2 eventually.
The CGI script, `cgi.py`, prints output to stdout as response to the user, the one thing I'm uncomfortable with because it disables the One True Debugger. As an extra workaround, I just used `raise Exception('debug message')` everywhere (but deleted all of them before committing, ofc).
It's in the MVP stage, with the ability to view summary, trees, blobs, and commit log in a primitive way. There is a test instance at `gemini://fkfd.me/git/cgi.py/`.
## Usage
Dependencies:
- relatively new version of Python (3.8.3 personally)
- pygit2 (`pip install pygit2`)
- hurry.filesize (`pip install hurry.filesize`)
- a gemini server capable of serving CGI
You need to edit the shebang of `git-gmi/cgi`:
```python
# change this:
#!/home/fakefred/p/git.gmi/venv/bin/python3.8
# to the path to your python executable as a shebang
import gateway
```
also stuff in `const.py`:
```python
GIT_CATALOG = "/home/fakefred/p/gemini/repos/" # dir where your repos are placed
CGI_PATH = "/git/cgi/" # path after the host part of URL that invokes the CGI script
# for example, gemini://fkfd.me/git/cgi/ is the entrance URL, hence /git/cgi/
GIT_GMI_SITE_TITLE = "git.gmi demo instance" # whatever you want
# ...
```
Let's suppose you put your Gemini static files in `/path/to/gemini/`. Clone git.gmi to `/path/to/git.gmi/`. Then, symlink the `git-gmi` subdir to `/path/to/gemini/git/`.
```
$ cd /path/to
$ git clone https://git.sr.ht/~fkfd/git.gmi
$ ln -s /path/to/git.gmi/git-gmi gemini/git`
$ ls gemini/git # this is your cgi-bin dir
cgi const.py gateway.py git.py
```
Then, if you use Jetforce, run:
```
$ jetforce --dir /path/to/gemini --cgi-dir git [other arguments]
```
Access your instance at `gemini://your-domain-or-ip/git/cgi/`. Don't forget the trailing slash, because jetforce is not capable of telling git.gmi its existence, potentially messing up relative links.
## Licensing's a Bitch
`hurry.filesize` is licensed under ZPL-2.0. I'm obligated, on ZPL-2.0's terms, to include it. I am once again ~~asking~~ begging you to use permissive licenses like a normal human being.
## Contributing
The mailing list is `~fkfd/git.gmi@lists.sr.ht`. Send patches ([git-send-email](https://git-send-email.io)) and feedback to the list.
|