summaryrefslogtreecommitdiff
path: root/README.md
blob: 563d437f20a63b59c039fdbbb655a8590e428f24 (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
# git.gmi - git frontend CGI script

## News

At this point (i.e. 6a98cf0: View commit) I consider git.gmi **feature-complete**, tagged v0.4.0. Unless necessary, no new features will be integrated into git.gmi, including new views and new functional paths (`/commit`, `/ref`, etc). From now on, over an indefinite period, changes will mainly be enhancements and optimizations.

## 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/gemini@lists.sr.ht`. Send patches ([git-send-email](https://git-send-email.io)) and feedback to the list.