list

scripts

Repo containing scripts to be used with dovel, and git hooks that powers our web interface.

curl https://dovel.email/scripts.tar tar

991ef89

Author: blmayer (bleemayer@gmail.com)

Date: Mon Oct 2 14:59:47 2023 -0300

Parent: b405a3a

Merged other scripts in post-receive

Diff

diff --git a/post-receive b/post-receive
index 7ce8aaf..b6b44b6 100755
--- a/post-receive
+++ b/post-receive
@@ -2,39 +2,264 @@

# for debugging
# set -ex
+. ./hooks/aux.sh

+ROOT="$HOME/www/dovel.email"
REPO="$(basename $PWD)"
-OUT="$HOME/www/dovel.email"
+OUT="$ROOT/$REPO"

-[ -d "$OUT/$REPO/tree" ] && rm -rf "$OUT/$REPO/tree"
-git clone . "$OUT/$REPO/tree"
+updategit() {
+	cat <<- EOF > "$ROOT/git.html"
+		$(pagehead "dovel")
+		&larr; <a href="/">dovel website</a>

-while read oldrev newrev ref
-do
-        # only checking out the master (or whatever branch you would like to deploy)
-	case "$ref" in
-	"refs/heads/$BRANCH")
-		# update git's index page
-		. ./hooks/update-git-index
+		<h1>Dovel project Git home</h1>
+		Welcome! Here you'll find general info about our projects and how to
+		contribute to them. We proudly use dovel email technology for our
+		mailing lists. Its hooks are in the scripts repo. Please read the next
+		sections before making a contribution.
+
+		<h2>Repositories</h2>
+		<dl>
+	EOF
+
+	for dir in "$HOME/git/dovel.email"/*
+	do
+		cat <<- EOF >> "$ROOT/git.html"
+		<dt><a href=$(basename $dir)/index.html>$(basename $dir)</a></dt>
+		<dd>$(cat "$dir/description")</dd>
+		EOF
+	done
+
+	cat <<- EOF >> "$ROOT/git.html"
+		</dl>
+
+		<h2>Contributing</h2>
+		The dovel team uses the git email workflow to accept contributions.
+		All email sent to dovel.email is considered as git mailling lists, check
+		each repository for email to a specific project. To send email about
+		other subjects please address them to
+		<a href=mailto:dovel@myr.sh>dovel@myr.sh</a>.
+
+		<h3>Email addresses</h3>
+		To send contributions use the repo name as the email's recipient, i.e.
+		to contribute to the server project send email to
+		<kbd>server@dovel.email</kbd>. Please CC me as well so I can reply
+		faster: <kbd>dovel@myr.sh</kbd>.
+
+		<h3>Email etiquette</h3>
+		We only accept plain text email. More info and recomendations can be
+		found on <a href=//useplaintext.email>useplaintext.email</a>. Also
+		<a href=//git-send-email.io>git-send-email.io</a> has instructions on
+		how to setup git to send email for many platforms.
+	</body>
+	</html>
+	EOF
+}
+
+updateindex() {
+	echo "creating archives"
+	tar -C "$OUT" -cz tree/ --xform="s/tree/$REPO/" > "$OUT.tar.gz"
+
+	echo "creating index.html"
+	cat <<- EOF > "$OUT/index.html"
+		$(pagehead "$REPO")
+		$(pagesummary)
+		<hr>
+		<p>Latest commit: $(git log -n 1 --format="(%h) by %an at %as: %s")</p>
+		<pre>$(cat "$OUT/tree/README"*)</pre>
+	</body>
+	</html>
+	EOF
+}
+
+filepage() {
+	cat <<- EOF
+	$(pagehead "$REPO")
+	$(pagesummary)
+	<hr>
+	<h2>$1</h2>
+	<file>
+	<pre>
+	<ol>
+	EOF
+
+	# print file
+	while IFS= read -r l
+	do
+		printf "<li>%s</li>\n" "$(escapehtml "$l")"
+	done < "$OUT/tree/$1"
+
+	echo "</ol>\n</pre>\n</file>\n</body>\n</html>"
+}
+
+createcommitpage() {
+	cat <<- EOF
+	$(pagehead "$REPO")
+	$(pagesummary)
+	<hr>
+	<h2>$1</h2>
+	EOF
+
+	# print commit
+	git show --format='%an%n%ae%n%ad%n%p%n%B' -s "$1" | {
+		read -r name
+		read -r email
+		read -r date
+		read -r parent
+
+		cat <<- EOF
+		<p>Author: $name ($email)</p>
+		<p>Date: $date</p>
+		<p>Parent: <a href=$parent.html>$parent</a></p>
+		<p><pre>
+		EOF
+
+		# the rest is the message
+		cat -

-		# update repo's index page
-		. ./hooks/update-repo-index
+		# now the diff
+		cat <<- EOF
+		</pre>
+		<h3>Diff</h3>
+		<pre style="overflow-x:auto;white-space:pre">
+		EOF
+	}

-		# update repo's refs page
-		. ./hooks/update-repo-refs
+	git show --format='' "$1" | while read -r l
+	do
+		printf "%s\n" "$(escapehtml "$l")"
+	done

-		# update repo's tree page
-		. ./hooks/update-repo-tree
+	cat <<- EOF
+	</pre>
+	</body>
+	</html>
+	EOF
+}

-		# update repo's log page
-		. ./hooks/update-repo-log
+updatelog() {
+	echo "creating log.html"
+	cat <<- EOF > "$OUT/log.html"
+		$(pagehead "$REPO")
+		$(pagesummary)
+		<hr>
+		<h2>Log</h2>
+		<table>
+			<tr><th>Hash</th><th>Author</th><th>Date</th><th>Subject</td></tr>
+	EOF
+
+	git log -n 100 --format='%h%n%ad%n%an%n%s' --date=iso | while read -r h
+	do
+		read -r date
+		read -r name
+		read -r msg
+
+		cat <<- EOF >> "$OUT/log.html"
+		<tr><td><a href=log/$h.html>$h</a></td><td>$name</td><td>$date</td><td>$msg</td></tr>
+		EOF
+
+		[ -f "$OUT/log/$h.html" ] && continue
+		echo "creating commit page $h"
+		createcommitpage "$h" > "$OUT/log/$h.html"
+	done
+	cat <<- EOF >> "$OUT/log.html"
+	</table>
+	<p>Note: Only showing up to 100 commits, for full log clone the repo.</p>
+	</body>
+	</html>
+	EOF
+}
+
+updaterefs() {
+	echo "creating refs.html"
+	cat <<- EOF > "$OUT/refs.html"
+		$(pagehead "$REPO")
+		$(pagesummary)
+		<hr>
+		<h2>Branches</h2>
+		<table>
+	EOF
+
+	git show-ref --heads | while read -r h n
+	do
+		echo "<tr><td>$h</td><td>$n</td></tr>" >> "$OUT/refs.html"
+	done
+
+	echo "</table>\n<h2>Tags</h2>\n<table>" >> "$OUT/refs.html"
+
+	git show-ref --tags | while read -r h n
+	do
+		echo "<tr><td>$h</td><td>$n</td></tr>" >> "$OUT/refs.html"
+	done
+
+	cat <<- EOF >> "$OUT/refs.html"
+	</table>
+	</body>
+	</html>
+	EOF
+}
+
+updatetree() {
+	echo "creating tree.html"
+	cat <<- EOF > "$OUT/tree.html"
+		$(pagehead "$REPO")
+		$(pagesummary)
+		<hr>
+		<h2>Tree</h2>
+		<table>
+			<tr><th>Size</th><th>Name</th><th>Raw</th></tr>
+	EOF
+
+	(cd "$OUT/tree" && find * -type f -printf '%s %p\n') | while read -r s f
+	do
+		echo "updating file $f"
+
+		cat <<- EOF >> "$OUT/tree.html"
+		<tr>
+		<td>$s</td>
+		<td><a href=tree/$f.html>$f</a></td>
+		<td><a href=tree/$f>raw</a></td>
+		</tr>
+		EOF
+		filepage "$f" > "$OUT/tree/$f.html"
+	done
+	cat <<- EOF >> "$OUT/tree.html"
+	</table>
+	</body>
+	</html>
+	EOF
+}
+
+# first argument should be the version, e.g. v0.1.0
+creategomod() {
+	[ -d "$OUT/@latest" ] || mkdir -p "$OUT/@latest"
+	[ -d "$OUT/@v/$1" ] || mkdir -p "$OUT/@v/$1"
+
+	find "$OUT/tree/"* -print | sed "s:$OUT/tree/:dovel.email/$REPO@v$1/" | zip -@ > "$OUT/@v/$1.zip"
+	cp "$OUT/$1.zip" "$OUT/@latest/"
+}
+
+[ -d "$OUT/tree" ] && rm -rf "$OUT/tree"
+[ -d "$OUT/log" ] || mkdir -p "$OUT/log"
+git clone . "$OUT/tree"
+
+while read oldrev newrev ref
+do
+	case "$ref" in
+	"refs/heads/$BRANCH")
+		updategit
+		updateindex
+		updaterefs
+		updatetree
+		updatelog
;;
"refs/tags/v"*)
echo "received version tag $ref"

# check repo for go mod
tag="${ref#refs/tags/}"
-		find "$OUT/$REPO/tree/" -name go.mod && .hooks/create-go-mod "$tag"
+		find "$OUT/tree/" -name go.mod && creategomod "$tag"
;;
*) echo "Ref $ref received. Doing nothing." ;;
esac
diff --git a/post-receive-scripts b/post-receive-scripts
index cf44b5f..ac6f2c1 100755
--- a/post-receive-scripts
+++ b/post-receive-scripts
@@ -3,54 +3,22 @@
#for debugging
#set -ex

-BRANCH="main"
-REPO="$(basename $PWD)"
-OUT="$HOME/www/dovel.email"
+echo "copying scritps"
+TMP="$(mktemp -d)"
+git --work-tree="$TMP" checkout -f ${BRANCH}

-while read oldrev newrev ref
+# copy main scripts to projects
+for dir in ../*
do
-        # only checking out the master (or whatever branch you would like to deploy)
-	case "$ref" in
-	"refs/heads/$BRANCH")
-                echo "Ref $ref received. Updating git pages"
-		TMP="$(mktemp -d)"
-                git --work-tree="$TMP" checkout -f ${BRANCH}
-
-		# copy main scripts to projects
-		for dir in ../*
-		do
-			cp "$TMP/post-receive" "$dir/hooks/"
-			cp "$TMP/update-git-index" "$dir/hooks/"
-			cp "$TMP/update-repo-index" "$dir/hooks/"
-			cp "$TMP/update-repo-refs" "$dir/hooks/"
-			cp "$TMP/update-repo-tree" "$dir/hooks/"
-			cp "$TMP/update-repo-log" "$dir/hooks/"
-			cp "$TMP/create-go-mod" "$dir/hooks/"
-			cp "$TMP/aux.sh" "$dir/hooks/"
-		done
-
-		# for this repo copy scripts
-		rm ./hooks/post-receive
-		cp "$TMP/post-receive-scripts" ./hooks/post-receive
-		echo "cleaning up TMP"
-		rm -fr "$TMP"
+	cp "$TMP/post-receive" "$dir/hooks/"
+	cp "$TMP/aux.sh" "$dir/hooks/"
+done

-		# the common part
-		[ -d "$OUT/$REPO/tree" ] && rm -rf "$OUT/$REPO/tree"
-		git clone . "$OUT/$REPO/tree"
+# for this repo copy scripts
+mv hooks/post-receive hooks/post-receive-all
+cp "$TMP/post-receive-scripts" hooks/post-receive

-		. ./hooks/update-git-index
-		. ./hooks/update-repo-index
-		. ./hooks/update-repo-refs
-		. ./hooks/update-repo-tree
-		. ./hooks/update-repo-log
-		;;
-	"refs/tags/v"*)
-		# check repo for go mod
-		tag="${ref#refs/tags/}"
-		find -name go.mod tree/ && .hooks/create-go-mod "$tag"
-		;;
-	*) echo "Ref $ref received. Doing nothing." ;;
-	esac
-done
+echo "cleaning up TMP"
+rm -fr "$TMP"

+. hooks/post-receive-all