| #!/bin/bash |
| # Simplest possible way to generate a personal public-inbox feed |
| # using just bash and git. It is intended for use with git-send-email, |
| # but can be used with any tool that accepts custom sendmail command paths, |
| # like mutt. |
| # |
| # Simplest configuration is to set the following in your git config file, |
| # either per repository, or globally in ~/.gitconfig if you want a single |
| # developer feed for all your work. |
| # |
| # [sendemail] |
| # smtpserver = /path/to/bin/sendmail-pi-feed |
| # |
| # [sendemail "sendmail-pi-feed"] |
| # # the directory where to put the feed (will be created with --init) |
| # inboxdir = /path/to/toplevel/public-inbox-dir |
| # # if not set, the epoch will be 0, which is strongly suggested; |
| # # if you increment it for some reason, make sure you don't skip numbers |
| # epoch = 0 |
| # # if defined, will pipe the stdin to this command as well, in case |
| # # you want to actually send out the patches in addition to writing them |
| # # to the public-inbox feed; leave undefined otherwise |
| # sendmail = /usr/sbin/sendmail |
| # |
| # Once this is done, run "sendmail-pi-feed --init" to initialize the feed. |
| # During the init process, you will be asked whether you would like to |
| # PGP-sign the commits, which is strongly recommended if you already |
| # have PGP-signing set up on your system. |
| # |
| # After the --init is complete, you can use "git send-email" as you |
| # normally would and all patches will be automatically added to the |
| # feed. You can then publish the feed on any git hosting service by |
| # setting a remote and performing a git push. |
| # |
| # If you would like to auto-push the feed, you can add an appropriate |
| # post-commit hook. |
| # |
| # SPDX-License-Identifier: GPL-2.0-or-later |
| # |
| # |
| # Do we have some basic configuration? |
| INBOXDIR="$(git config --get sendemail.sendmail-pi-feed.inboxdir)" |
| if [[ -z "$INBOXDIR" ]]; then |
| echo "You need to add config entries to git-config first" |
| exit 1 |
| fi |
| |
| SENDMAIL="$(git config --get sendemail.sendmail-pi-feed.sendmail)" |
| EPOCH="$(git config --get sendemail.sendmail-pi-feed.epoch)" |
| |
| if [[ -z $EPOCH ]]; then |
| EPOCH=0 |
| fi |
| |
| PIGITDIR="$INBOXDIR/$EPOCH" |
| PIGITDIR="${PIGITDIR/#\~/$HOME}" |
| |
| if [[ $1 == '--init' ]]; then |
| if ! mkdir -p "$PIGITDIR"; then |
| echo "Could not mkdir $PIGITDIR" |
| exit 1 |
| fi |
| cd "$PIGITDIR" || exit 1 |
| git init |
| read -r -p "GPG-sign your feed? [Y/n] " YN |
| if [[ $YN != "n" ]]; then |
| git config commit.gpgSign true |
| fi |
| exit 0 |
| fi |
| |
| if [[ ! -d $PIGITDIR/.git ]]; then |
| echo "ERROR: $PIGITDIR/.git does not exist." |
| echo " Run this first: $0 --init" |
| exit 1 |
| fi |
| |
| cd "$PIGITDIR" || exit 1 |
| cat > m |
| |
| # Grab the subject line and other commit info |
| LOGLINE=$(grep "^Subject: " m | head -n 1 | sed 's/^Subject: //') |
| AUTHOR=$(grep "^From: " m | head -n 1 | sed 's/^From: //') |
| DATE=$(grep "^Date: " m | head -n 1 | sed 's/^Date: //') |
| if [[ -z $LOGLINE ]] || [[ -z $AUTHOR ]] || [[ -z $DATE ]]; then |
| echo "Could not find Subject/From/Date lines in stdin. Bailing out." |
| git reset --hard |
| git clean -f -d -x |
| exit 1 |
| fi |
| |
| git add m |
| if ! git commit --author "$AUTHOR" --date "$DATE" -m "$LOGLINE"; then |
| echo "ERROR: git-commit failed. Check the messages above" |
| exit $? |
| fi |
| |
| if [[ -n $SENDMAIL ]]; then |
| echo "Invoking: $SENDMAIL" |
| $SENDMAIL "$@" < m |
| fi |
| |
| echo "Remember to push $PIGITDIR" |