aboutsummaryrefslogtreecommitdiffstats
path: root/sendmail-pi-feed
blob: 67c46688b5d59e8f79371b0d8b24ad1f94798dd2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/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"