shroomgit

generate static pages of git repos
git clone https://git.davidvoz.net/shroomgit.git
index
logs
tree

logs.go
1package main
2
3import (
4 "fmt"
5 "html"
6 "os"
7 "os/exec"
8 "path/filepath"
9 "strconv"
10 "strings"
11)
12
13// overall awful
14func logTest(repo string, path string) {
15 topPart := genTopPart(repo, 1)
16 logsDir := filepath.Join(path, "logs")
17
18 err := os.MkdirAll(logsDir, 0o755)
19 if err != nil {
20 panic(err)
21 }
22
23 cmd, err := exec.Command("git", "-C", repo, "rev-list", "--reverse", "--date-order", "HEAD").Output()
24 if err != nil {
25 panic(err)
26 }
27
28 hashes := strings.Split(strings.TrimSpace(string(cmd)), "\n")
29
30 // TODO fix formatting
31 // TODO add coloring and links
32 for _, hash := range hashes {
33 cmd, err := exec.Command(
34 "git",
35 "-C",
36 repo,
37 "show",
38 hash,
39 ).Output()
40 if err != nil {
41 panic(err)
42 }
43
44 lines := strings.Split(string(cmd), "\n")
45 var firstLine string
46 var hash string
47 if lines[0] != "" {
48 firstLine = lines[0]
49 } else {
50 continue
51 }
52
53 fields := strings.Fields(firstLine)
54 hash = fields[1]
55
56 outputFile := filepath.Join(logsDir, fmt.Sprintf("%s.html", hash))
57 file, _ := os.Create(outputFile)
58 defer file.Close()
59
60 file.WriteString(topPart)
61
62 commitPageWriter(file, lines)
63 }
64}
65
66func commitPageWriter(file *os.File, lines []string) {
67 file.WriteString("<pre style=\"padding:6px;border-radius:4px;font-family:monospace;\">\n")
68
69 for _, line := range lines {
70 escaped := html.EscapeString(line)
71 if strings.HasPrefix(line, "+") {
72 file.WriteString("<div style=\"color:ForestGreen\">")
73 file.WriteString(escaped)
74 file.WriteString("</div>")
75 } else if strings.HasPrefix(line, "-") {
76 file.WriteString("<div style=\"color:#e54e50\">")
77 file.WriteString(escaped)
78 file.WriteString("</div>")
79
80 } else {
81 file.WriteString(escaped)
82 file.WriteString("\n")
83 }
84 }
85
86 file.WriteString("</pre>\n")
87}
88
89func logPage(topPart string, repo string, path string) {
90 outputFile := filepath.Join(path, "log.html")
91 file, err := os.Create(outputFile)
92 if err != nil {
93 panic(err)
94 }
95 defer file.Close()
96
97 cmd, err := exec.Command(
98 "git",
99 "-C",
100 repo,
101 "rev-list",
102 "--count",
103 "HEAD",
104 ).Output()
105 if err != nil {
106 return
107 }
108
109 numofCommitsStr := strings.TrimSpace(string(cmd))
110 numofCommits, _ := strconv.Atoi(numofCommitsStr)
111
112 file.WriteString(topPart)
113 file.WriteString("<table>")
114
115 for i := range numofCommits {
116 file.WriteString("<tr>")
117
118 cmd, _ := exec.Command(
119 "git",
120 "-C", repo,
121 "log", "-1",
122 fmt.Sprintf("--skip=%d", i),
123 "--pretty=format:%cd",
124 "--date=format:%Y-%m-%d",
125 ).Output()
126 date := strings.TrimSpace(string(cmd))
127 file.WriteString("<td valign=\"top\">")
128 file.WriteString(date)
129
130 file.WriteString("</td>\n")
131
132 cmd, _ = exec.Command(
133 "git",
134 "-C", repo,
135 "show",
136 fmt.Sprintf("HEAD~%d", i),
137 ).Output()
138
139 // commit := strings.TrimSpace(string(cmd))
140
141 lines := strings.Split(string(cmd), "\n")
142 var firstLine string
143 var hash string
144 if lines[0] != "" {
145 firstLine = lines[0]
146 } else {
147 return
148 }
149
150 fields := strings.Fields(firstLine)
151 hash = fields[1]
152
153 cmd, _ = exec.Command(
154 "git",
155 "-C", repo,
156 "log", "-1",
157 fmt.Sprintf("--skip=%d", i),
158 "--pretty=format:%s",
159 ).Output()
160 commit := strings.TrimSpace(string(cmd))
161 file.WriteString("<td>")
162 file.WriteString("\n<a href=\"logs/")
163 file.WriteString(hash)
164 file.WriteString(".html\">" + commit + "</a>\n")
165 file.WriteString("</td>\n")
166
167 cmd, _ = exec.Command(
168 "git",
169 "-C", repo,
170 "log", "-1",
171 fmt.Sprintf("--skip=%d", i),
172 "--pretty=format:%an",
173 ).Output()
174 author := strings.TrimSpace(string(cmd))
175 file.WriteString("<td style=\"white-space:nowrap\" valign=\"top\">")
176 file.WriteString(author)
177 file.WriteString("</td>\n")
178
179 cmd, _ = exec.Command(
180 "git",
181 "-C", repo,
182 "log", "-1",
183 fmt.Sprintf("--skip=%d", i),
184 "--shortstat",
185 "--pretty=format:",
186 ).Output()
187 cmdOutput := strings.TrimSpace(string(cmd))
188 arr := strings.Fields(cmdOutput)
189 if len(arr) == 0 {
190 continue
191 }
192 file.WriteString("<td style=\"padding-left: 1em\" valign=\"top\" align=\"right\">")
193 file.WriteString(arr[0])
194 file.WriteString("</td>\n")
195 file.WriteString("<td style=\"color:ForestGreen\" valign=\"top\" align=\"right\">+")
196 file.WriteString(arr[3])
197 file.WriteString("</td>\n")
198 if len(arr) > 5 {
199 file.WriteString("<td style=\"color:Crimson\" valign=\"top\" align=\"right\">-")
200 file.WriteString(arr[5])
201 file.WriteString("</td>\n")
202 }
203
204 file.WriteString("\n</tr>")
205 }
206
207 file.WriteString("\n</table>")
208 file.WriteString("\n</body>")
209}