user/dev discussion of public-inbox itself
 help / color / Atom feed
* [PATCH] examples: add grok-pull post_update_hook example
@ 2019-10-06 23:56 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2019-10-06 23:56 UTC (permalink / raw)
  To: meta

This requires the latest (to be in 1.2) -init changes for
synchronization and has no dependencies on GNU or bash-isms
so it should run on *BSD systems without GNU tools.

It does attempt to use curl on <$INBOX_URL/_/text/config/raw>,
but curl is fairly standard nowadays, and falls back to using
an invalid address to initialize.
---
 examples/grok-pull.post_update_hook.sh | 108 +++++++++++++++++++++++++
 1 file changed, 108 insertions(+)
 create mode 100755 examples/grok-pull.post_update_hook.sh

diff --git a/examples/grok-pull.post_update_hook.sh b/examples/grok-pull.post_update_hook.sh
new file mode 100755
index 00000000..66c5cea5
--- /dev/null
+++ b/examples/grok-pull.post_update_hook.sh
@@ -0,0 +1,108 @@
+#!/bin/sh
+# post_update_hook for repos.conf as used by grok-pull, takes a full
+# git repo path as it's first and only arg.
+full_git_dir="$1"
+
+# same default as other public-inbox-* tools
+PI_CONFIG=${PI_CONFIG-~/.public-inbox/config}
+
+# FreeBSD expr(1) only supports BRE, so no '+'
+EPOCH2MAIN='\(..*\)/git/[0-9][0-9]*\.git'
+
+# see if it's v2 or v1 based on tree contents, since somebody could
+# theoretically name a v1 inbox with a path that looks like a v2 epoch
+if git --git-dir="$full_git_dir" ls-tree --name-only HEAD | \
+	grep -E '^(m|d)$' >/dev/null
+then
+	inbox_fmt=2
+	inbox_mainrepo=$(expr "$full_git_dir" : "$EPOCH2MAIN")
+	inbox_name=$(basename "$inbox_mainrepo")
+	msgmap="$inbox_mainrepo"/msgmap.sqlite3
+else
+	inbox_fmt=1
+	inbox_mainrepo="$full_git_dir"
+	inbox_name=$(basename "$inbox_mainrepo" .git)
+	msgmap="$inbox_mainrepo"/public-inbox/msgmap.sqlite3
+fi
+
+# run public-inbox-init iff unconfigured
+cfg_mainrepo=$(git config -f "$PI_CONFIG" publicinbox."$inbox_name".mainrepo)
+case $cfg_mainrepo in
+'')
+	remote_git_url=$(git --git-dir="$full_git_dir" config remote.origin.url)
+	case $remote_git_url in
+	'')
+		echo >&2 "remote.origin.url unset in $full_git_dir/config"
+		exit 1
+		;;
+	esac
+
+	case $inbox_fmt in
+	1)
+		remote_inbox_url="$remote_git_url"
+		;;
+	2)
+		remote_inbox_url=$(expr "$remote_git_url" : "$EPOCH2MAIN")
+		;;
+	esac
+
+	config_url="$remote_inbox_url"/_/text/config/raw
+	remote_config="$inbox_mainrepo"/remote.config.$$
+	trap 'rm -f "$remote_config"' EXIT
+	if curl --compressed -sSf -v "$config_url" >"$remote_config"
+	then
+		# n.b. inbox_name on the remote may not match our local
+		# inbox_name, so we match all addresses in the remote config
+		addresses=$(git config -f "$remote_config" -l | \
+			sed -ne 's/^publicinbox\..\+\.address=//p')
+		case $addresses in
+		'')
+			echo >&2 'unable to extract address(es) from ' \
+				"$remote_config"
+			exit 1
+			;;
+		esac
+		newsgroups=$(git config -f "$remote_config" -l | \
+			sed -ne 's/^publicinbox\..\+\.newsgroup=//p')
+	else
+		newsgroups=
+		addresses="$inbox_name@$$.$(hostname).example.com"
+		echo >&2 "E: curl $config_url failed"
+		echo >&2 "E: using bogus <$addresses> for $inbox_mainrepo"
+	fi
+	local_url="http://127.0.0.1:8080/$inbox_name"
+	public-inbox-init -V$inbox_fmt "$inbox_name" \
+		"$inbox_mainrepo" "$local_url" $addresses
+
+	if test $? -ne 0
+	then
+		echo >&2 "E: public-inbox-init failed on $inbox_mainrepo"
+		exit 1
+	fi
+
+	for ng in $newsgroups
+	do
+		git config -f "$PI_CONFIG" \
+			"publicinbox.$inbox_name.newsgroup" "$ng"
+		# only one newsgroup per inbox
+		break
+	done
+	echo "I: $inbox_name at $inbox_mainrepo ($addresses) $local_url"
+	;;
+esac
+
+# only run public-inbox-index if an index exists and has messages,
+# since epochs may be cloned out-of-order by grokmirror and we also
+# don't know what indexlevel a user wants
+if test -f "$msgmap"
+then
+	n=$(echo 'SELECT COUNT(*) FROM msgmap' | sqlite3 -readonly "$msgmap")
+	case $n in
+	0|'')
+		: v2 inboxes may be init-ed with an empty msgmap
+		;;
+	*)
+		$EATMYDATA public-inbox-index -v "$inbox_mainrepo"
+		;;
+	esac
+fi

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, back to index

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-06 23:56 [PATCH] examples: add grok-pull post_update_hook example Eric Wong

user/dev discussion of public-inbox itself

Archives are clonable:
	git clone --mirror http://public-inbox.org/meta
	git clone --mirror http://czquwvybam4bgbro.onion/meta
	git clone --mirror http://hjrcffqmbrq6wope.onion/meta
	git clone --mirror http://ou63pmih66umazou.onion/meta

Example config snippet for mirrors

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta
	nntp://ou63pmih66umazou.onion/inbox.comp.mail.public-inbox.meta
	nntp://czquwvybam4bgbro.onion/inbox.comp.mail.public-inbox.meta
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.mail.public-inbox.meta
	nntp://news.gmane.org/gmane.mail.public-inbox.general

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox