depp

No frills static page generator for Git repositories

git clone https://git.8pit.net/depp.git

 1package main
 2
 3import (
 4	"errors"
 5	"html/template"
 6	"io"
 7	"os"
 8	"os/exec"
 9	"path/filepath"
10
11	"github.com/nmeum/depp/gitweb"
12)
13
14const renderScript = "git-render-readme"
15
16func runWithInput(cmd *exec.Cmd, input string) (string, error) {
17	stdin, err := cmd.StdinPipe()
18	if err != nil {
19		return "", err
20	}
21
22	go func() {
23		defer stdin.Close()
24		io.WriteString(stdin, input)
25	}()
26
27	out, err := cmd.Output()
28	if err != nil {
29		return "", err
30	}
31
32	return string(out), nil
33}
34
35func renderReadme(repo *gitweb.RepoPage) (template.HTML, error) {
36	readme, err := repo.Readme()
37	if errors.Is(err, os.ErrNotExist) {
38		return "", nil
39	} else if err != nil {
40		return "", err
41	}
42
43	fp := filepath.Join(repo.Path, renderScript)
44	renderer, err := exec.LookPath(fp)
45	if err != nil {
46		if errors.Is(err, os.ErrNotExist) || errors.Is(err, exec.ErrNotFound) {
47			escaped := template.HTMLEscapeString(readme)
48			return template.HTML(`<pre class="raw">` + escaped + "</pre>"), nil
49		}
50
51		return "", err
52	}
53
54	cmd := exec.Command(renderer)
55	out, err := runWithInput(cmd, readme)
56	if err != nil {
57		return "", err
58	}
59
60	return template.HTML(out), nil
61}