| 1 | package main
|
| 2 |
|
| 3 | import (
|
| 4 | "fmt"
|
| 5 | "html"
|
| 6 | "os"
|
| 7 | "os/exec"
|
| 8 | "path/filepath"
|
| 9 | "strconv"
|
| 10 | "strings"
|
| 11 | )
|
| 12 |
|
| 13 | // overall awful
|
| 14 | func 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 |
|
| 66 | func 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 |
|
| 89 | func 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 | }
|