* [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 related [flat|nested] only message in thread
only message in thread, other threads:[~2019-10-06 23:56 UTC | newest]
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
Code repositories for project(s) associated with this public inbox
https://80x24.org/public-inbox.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).