home readme diff tree note docs

0commit 6c8e99aa9aba4daac97fa1560092962655452928
1Author: Mason Wright <mason@lakefox.net>
2Date:   Sun Nov 9 11:42:38 2025 -0700
3
4    working
5
6diff --git a/.index.html.swp b/cgi-bin/.mailto.awk.swp
7similarity index 53%
8rename from .index.html.swp
9rename to cgi-bin/.mailto.awk.swp
10index be1d333..1de3b0a 100644
11Binary files a/.index.html.swp and b/cgi-bin/.mailto.awk.swp differ
12diff --git a/cgi-bin/git.awk b/cgi-bin/git.awk
13new file mode 100755
14index 0000000..1d1353d
15--- /dev/null
16+++ b/cgi-bin/git.awk
17@@ -0,0 +1,121 @@
18+#!/usr/bin/awk -f
19+
20+# /var/git
21+
22+BEGIN {
23+
24+	print "Content-Type: text/html\r\n"
25+	print "<!DOCTYPE html>"
26+	print "<html>"
27+	print "<head>"
28+	
29+	split(ENVIRON["QUERY_STRING"], pairs, "&")
30+	for (i in pairs) {
31+		split(pairs[i], kv, "=")
32+
33+		if (kv[1] == "action") {
34+			action = kv[2]
35+		} else if (kv[1] == "name") {
36+			name = kv[2]
37+		} else if (kv[1] == "hash") {
38+			hash = kv[2]
39+		} else if (kv[1] == "path") {
40+			path = kv[2]
41+		}
42+	}
43+
44+	if (name == "") name = "all"
45+	if (hash == "") hash = "HEAD"
46+
47+	print "<title>Git: " name "</title>"
48+	print "<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>"
49+	print "<meta name='viewport' content='width=device-width, initial-scale=1'>"
50+	print "</head>"
51+	print "<body>"
52+
53+	if (name != "all") {
54+		print "<a href='?name=" name "'>home</a>"
55+		print "<a href='?name=" name "&hash=" hash "&action=readme'>readme</a>"
56+		print "<a href='?name=" name "&hash=" hash "&action=diff'>diff</a>"
57+		print "<a href='?name=" name "&hash=" hash "&action=tree'>tree</a>"
58+	}
59+
60+
61+	if (action == "") {
62+		if (name == "all") {
63+			cmd = "ls /var/git/"
64+			print "<h1>Git</h1>"
65+			print "<p>Select a repo to view.</p>"
66+		
67+			print "<ul>"
68+			while (cmd | getline file) {
69+				split(file, k, ".")
70+				print "<li><a href='/cgi-bin/git.awk?name=" k[1] "'>/" k[1] "</a></li>"
71+			}
72+			close(cmd)
73+			print "</ul>"
74+		} else {
75+			cmd = "git --git-dir=/var/git/" name ".git/ log"
76+			print "<pre><code>"	
77+			while (cmd | getline line) {
78+
79+				if (line ~ /^commit/) {
80+					split(line, commit, " ")
81+					print "<a href='/cgi-bin/git.awk?name=" name "&hash=" commit[2] "&action=diff'>commit " commit[2] "</a>"
82+				} else {
83+					print line
84+				}
85+			}
86+			close(cmd)
87+			print "</code></pre>"
88+		}
89+	} else if (action == "tree") {
90+		cmd = "git --git-dir=/var/git/" name ".git/ show " hash ":" path
91+		print "<br/>"
92+		print "<b>" hash ":" path "</b>"
93+		print "<pre><code>"	
94+		if (substr(path, length(path), 1) == "/" || path == "") {
95+			while (cmd | getline line) {
96+				if (line !~ /^tree/) {
97+					print "<a href='/cgi-bin/git.awk?name=" name "&hash=" hash "&action=tree&path=" path line "'>" line "</a>"
98+				}
99+			}
100+		} else {
101+			while (cmd | getline line) {
102+				print line
103+			}
104+		}
105+		close(cmd)
106+		print "</code></pre>"
107+	} if (action == "diff") {
108+		cmd = "git --git-dir=/var/git/" name ".git/ show " hash
109+		print "<pre><code>"	
110+		while (cmd | getline line) {
111+			print line
112+		}
113+		close(cmd)
114+		print "</code></pre>"
115+
116+	} if (action == "readme") {
117+		# 1. discover the README file name (single match assumed)
118+		cmd = "git --git-dir=/var/git/" name ".git ls-tree -r " hash " --name-only | grep '^README\\.'"
119+		fn = ""
120+		while ((cmd | getline fn) > 0) break      # take first match
121+		close(cmd)
122+		if (fn == "") { print "<br/>README not found for: " hash; exit 1 }
123+
124+		cmd = "git --git-dir=/var/git/" name ".git show " hash ":" fn
125+		print "<pre><code>"
126+		while ((cmd | getline line) > 0) {
127+			gsub(/&/,"\\&amp;", line)
128+			gsub(/</,"\\&lt;",  line)
129+			gsub(/>/,"\\&gt;",  line)
130+			print line
131+		}
132+		close(cmd)
133+		print "</code></pre>"	
134+    }
135+
136+	print "</body>"
137+	print "</html>"
138+}
139diff --git a/cgi-bin/mailto.awk b/cgi-bin/mailto.awk
140index 28aa890..65198d9 100755
141--- a/cgi-bin/mailto.awk
142+++ b/cgi-bin/mailto.awk
143@@ -3,9 +3,9 @@
144 # A list should be split by a /: grim/patches.txt
145 
146 BEGIN {
147-	if (ARGC == 4) {
148+	if (ARGC > 1 && ARGV[1] == "sync") {
149 		#  getThreads( user, pass, imap-url, query )
150-		getThreads(ARGV[1], ARGV[2], ARGV[3], ARGV[4])
151+		getThreads(ARGV[2], ARGV[3], ARGV[4], ARGV[5])
152 		exit
153 	}
154 
155@@ -77,6 +77,8 @@ function showLists(name) {
156 	print "<html>"
157 	print "<head>"
158 	print "<title>MailTo: " name "</title>"
159+	print "<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>"
160+	print "<meta name='viewport' content='width=device-width, initial-scale=1'>"
161 	print "</head>"
162 	print "<body>"
163 
164@@ -130,7 +132,7 @@ function showLists(name) {
165 			for (i = 1; i < n; i++) {
166 				formatted = formatted title[i]
167 			}
168-			sub("<>","/", formatted)
169+			gsub("<>","/", formatted)
170 			print "<li><a href='/cgi-bin/mailto.awk?list=" name "&view=" title[n] "'>" formatted "</a></li>"
171 		}
172 		print "</ul>"
173@@ -146,6 +148,8 @@ function openMail(folder, uid) {
174 	print "<html>"
175 	print "<head>"
176 	print "<title>MailTo: " name "</title>"
177+	print "<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>"
178+	print "<meta name='viewport' content='width=device-width, initial-scale=1'>"
179 	print "</head>"
180 	print "<body>"
181 		
182@@ -161,12 +165,11 @@ function openMail(folder, uid) {
183 
184 # This function will keep all email's up to date
185 function getThreads(username, password, inbox, query) {
186-	cmd = "curl -s -u '" username ":" password "' '" inbox "' -X 'UID SEARCH SUBJECT " query "'"
187-	while ((cmd | getline res) > 0) {             # collect last line
188-        	split(res, a);            # a[1]="*"; a[2]="SEARCH"; rest are UIDs
189-        	n = 0
190-        	for (i = 3; i <= length(a); i++) {        # skip "* SEARCH"
191-            		uids[++n] = a[i]
192+	cmd = "(echo 'USER " username "'; echo PASS '" password "'; echo LIST; echo QUIT;) | nc -i 1 " inbox " 110"
193+# 	. == end of message
194+	while (cmd | getline res) {
195+		if (res ~ !/^\+/) {
196+			print res
197 		}
198 	}
199 	close(cmd)
200@@ -210,7 +213,7 @@ function getThreads(username, password, inbox, query) {
201 			close(cmd)
202 			
203 			cleanSubj = subj
204-			sub("/", "<>", cleanSubj)
205+			gsub("/", "<>", cleanSubj)
206 			sub("\r", "", cleanSubj)
207 
208 			if (system("test -e \"/var/mailto/.cache/" query "/" cleanSubj "." uid "\"") != 0) {
209diff --git a/index.html b/index.html
210index 4e047e7..d5f477a 100644
211--- a/index.html
212+++ b/index.html
213@@ -1,7 +1,9 @@
214 <!DOCTYPE html>
215 <html>
216 	<head>
217+		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
218 		<title>DECODE</title>
219+		<meta name="viewport" content="width=device-width, initial-scale=1">
220 		<style>
221 			table,
222 			thead,
223@@ -13,35 +15,40 @@
224 			}
225 		</style>
226 	</head>
227-	<body>
228+	<body style="max-width: 900px;">
229 		<h1>DECODE</h1>
230-		<a href="irc.decode.sh">#IRC</a> <a href="/cgi-bin/mailto.awk">Mailing Lists</a>
231+		<a href="irc.decode.sh">#IRC</a> <a href="/cgi-bin/mailto.awk">Mailing Lists</a> <a href="/cgi-bin/git.awk">Git</a>
232 		<p>
233 			Decode is a project sharing website.
234 		</p>
235 
236 		<h2>Projects</h2>
237-		<table style="width: 90%; ">
238+		<table style="width: 90%; margin-bottom: 100px;">
239 			<thead>
240+			<tr>
241 				<th>Source</th>
242 				<th>About</th>
243 				<th>IRC</th>
244 				<th>Clone</th>
245+			</tr>
246 			</thead>
247 			<tbody>
248 			<tr>
249-				<td><a href="http://lakefox.net/grim">grim/</a></td>
250-				<td></td>
251+				<td><a href="/cgi-bin/git.awk?name=grim&action=readme">grim/</a></td>
252+				<td>HTML/CSS renderer with a C++ DOM API</td>
253 				<td><a href="irc.decode.sh/#grim">#grim</a></td>
254-				<td>http://lakefox.net/grim.git</td>
255+				<td>http://git.decode.sh/grim.git</td>
256 			</tr>
257-			 <tr>
258-				<td><a href="http://lakefox.net/asftp">asftp/</a></td>
259+			<tr>
260+				<td><a href="http://lakefox.net/decode/cgi-bin">mailto/</a></td>
261+				<td>CGI script to create a simple mailing list with archiving</td>
262+				<td><a href="irc.decode.sh/#mailto">#mailto</a></td>
263 				<td></td>
264-				<td><a href="irc.decode.sh/#asftp">#asftp</a></td>
265-				<td>http://lakefox.net/asftp.git</td>
266 			</tr> 
267 			</tbody>
268-		</div>
269+		</table>
270+		<hr>
271+		<p>This site is HTML 2.0 compliant.</p>
272+		<a href="http://validator.w3.org/check?uri=decode.sh"><img src="valid-html20.png" alt="Valid HTML 2.0"></a>
273 	</body>
274 </html>
275diff --git a/valid-html20.png b/valid-html20.png
276new file mode 100644
277index 0000000..19675ee
278Binary files /dev/null and b/valid-html20.png differ