about summary refs log tree commit homepage
path: root/examples
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-10-06 23:56:51 +0000
committerEric Wong <e@80x24.org>2019-10-07 09:42:21 +0000
commit34d99b28c1cbfb15ed8bab10a44dacebc46f5008 (patch)
treeb3ad3098fd902448a01701eec157be7361e24ba5 /examples
parent356e4a62e05fb1d379ee93c04818f23bc0563352 (diff)
downloadpublic-inbox-34d99b28c1cbfb15ed8bab10a44dacebc46f5008.tar.gz
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.
Diffstat (limited to 'examples')
-rwxr-xr-xexamples/grok-pull.post_update_hook.sh108
1 files changed, 108 insertions, 0 deletions
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