1 | const fs = require("fs"); |
2 | const path = require("path"); |
3 | const express = require("express"); |
4 | const app = express(); |
5 | const port = 8080; |
6 | const gitcontrol = require(path.resolve(__dirname, "gitcontrol")) |
7 |
|
8 | const allowed_repos = {"lognestmonster": "dev", "joshstock.in": "master", "auto-plow": "dev"}; |
9 |
|
10 | function repo_path(repo) { |
11 | if (process.env.NODE_ENV == "production") { |
12 | return "/home/git/" + repo + ".git/"; |
13 | } else { |
14 | return "/home/josh/Desktop/" + repo + "/.git"; |
15 | } |
16 | } |
17 |
|
18 | let commitFile = fs.readFileSync(path.resolve(__dirname, "commit.html")).toString(); |
19 | function format_commit(repo, commit, isgithub=false, islatest=false) { |
20 | commitString = commitFile; |
21 | if (isgithub) { |
22 | commitString = commitString.replace("$shorthash", "<a title=\"GitHub mirror\" href=\"https://github.com/JoshuaS3/" + repo + "/commit/" + commit.hash + "\">" + commit.hash.substring(0,7) + " (" + allowed_repos[repo] + "/" + commit.number + ")</a>"); |
23 | commitString = commitString.replace("$onclick", ""); |
24 | } else { |
25 | commitString = commitString.replace("$shorthash", commit.hash.substring(0,7) + " (" + allowed_repos[repo] + "/" + commit.number + ")"); |
26 | commitString = commitString.replace("$onclick", "onclick=\"window.location='/$repo/$hash'\""); |
27 | } |
28 | commitString = commitString.replace("$repo", repo).replace("$hash", commit.hash) |
29 | .replace("$subject", commit.subject).replace("$author", commit.author).replace("$author_email", commit.author_email); |
30 | commitTime = new Date(commit.date); |
31 | time = commitTime.toDateString().split(" ").slice(1).join(" ") + ", " + commitTime.toLocaleTimeString().split(" ")[0]; |
32 | if (islatest) time += " (latest commit)"; |
33 | commitString = commitString.replace("$date", time); |
34 | if (commit.body == undefined) { |
35 | commitString = commitString.replace("$body", ""); |
36 | } else { |
37 | commitString = commitString.replace("$body", "<pre class=\"message\">" + (commit.body || "[[no commit body]]") + "</pre>"); |
38 | } |
39 | return commitString; |
40 | } |
41 |
|
42 | app.use(express.static(path.resolve(__dirname, "static"))) |
43 |
|
44 | let indexFile = fs.readFileSync(path.resolve(__dirname, "index.html")).toString(); |
45 | app.get("/", function(req, res) { |
46 | response = indexFile; |
47 | for (repo in allowed_repos) { |
48 | response = response.replace("$commit_" + repo, format_commit(repo, gitcontrol.get_commit(repo_path(repo), "HEAD", false), false, true)); |
49 | } |
50 | res.send(response); |
51 | }); |
52 |
|
53 | let listingFile = fs.readFileSync(path.resolve(__dirname, "list_page.html")).toString(); |
54 | app.get("/:repo/:page(\\d+)?", function(req, res) { |
55 | if (allowed_repos[req.params.repo] == null) { |
56 | res.status(404).send() |
57 | return; |
58 | } |
59 | req.params.page = parseInt(req.params.page) || 1; |
60 |
|
61 | response = listingFile; |
62 |
|
63 | commits = gitcontrol.list_commits(repo_path(req.params.repo), allowed_repos[req.params.repo], req.params.page-1); |
64 | total = gitcontrol.count_commits(repo_path(req.params.repo)); |
65 | if (commits == null) { |
66 | res.send(404); |
67 | return; |
68 | } else { |
69 | commitsFormatted = ""; |
70 | lastDate = ""; |
71 | for (commit in commits) { |
72 | dateString = new Date(commits[commit].date).toLocaleDateString("en-US", {month:"long",day:"numeric",year:"numeric"}); |
73 | if (dateString != lastDate) { |
74 | lastDate = dateString; |
75 | commitsFormatted += "<h2 style=\"margin-bottom:4px\">" + dateString + "</h2>"; |
76 | } |
77 | commitsFormatted += format_commit(req.params.repo, commits[commit], false, commits[commit].number == total); |
78 | } |
79 | response = response.replace("$commits", commitsFormatted); |
80 | countLast = commits[commits.length-1].number; |
81 | lastPage = ""; |
82 | nextPage = ""; |
83 | if (req.params.page > 1) { |
84 | lastPage = `<a href="/${req.params.repo}/${req.params.page-1}" style="margin-right:10px;"><< previous page</a>`; |
85 | } |
86 | if (countLast > 1) { |
87 | nextPage = `<a href="/${req.params.repo}/${req.params.page+1}" style="margin-right:10px;">next page >></a>`; |
88 | } |
89 | if (lastPage != "" || nextPage != "") { |
90 | response = response.replace(/\$pagecontrols/g, `<p style="text-align:center">${lastPage}${nextPage}</p>`); |
91 | } |
92 | } |
93 | response = response.replace(/\$repo/g, req.params.repo); |
94 | stats = `on branch ${allowed_repos[req.params.repo]} with ${total} commits`; |
95 | response = response.replace("$stats", stats); |
96 |
|
97 | res.send(response); |
98 | }); |
99 |
|
100 | let commitPage = fs.readFileSync(path.resolve(__dirname, "commit_page.html")).toString(); |
101 | app.get("/:repo/:commit([a-f0-9]{40})", function(req, res) { |
102 | if (allowed_repos[req.params.repo] == null) { |
103 | res.status(404).send() |
104 | return; |
105 | } |
106 | commit = gitcontrol.get_commit(repo_path(req.params.repo), req.params.commit); |
107 | if (commit == null) res.send(404); |
108 | response = commitPage; |
109 | response = response.replace(/\$repo/g, req.params.repo); |
110 | response = response.replace(/\$hash/g, commit.hash); |
111 | response = response.replace(/\$shorthash/g, commit.hash.substring(0,7)); |
112 | response = response.replace(/\$subject/g, commit.subject); |
113 | total = gitcontrol.count_commits(repo_path(req.params.repo)); |
114 | response = response.replace("$commit", format_commit(req.params.repo, commit, true, commit.number == total)); |
115 | res.send(response); |
116 | }); |
117 |
|
118 | app.listen(port); |
119 |
|