forked from dokku-alt/dokku-alt
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgitreceive
More file actions
executable file
·86 lines (77 loc) · 2.41 KB
/
gitreceive
File metadata and controls
executable file
·86 lines (77 loc) · 2.41 KB
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
#!/bin/bash
GITUSER=${GITUSER:-git}
GITHOME="/home/$GITUSER"
SELF=`which $0`
case "$1" in
# Public commands
init) # gitreceive init
useradd -d $GITHOME $GITUSER || true
mkdir -p $GITHOME/.ssh
touch $GITHOME/.ssh/authorized_keys
cat > $GITHOME/receiver <<EOF
#!/bin/bash
#URL=http://requestb.in/rlh4znrl
#echo "----> Posting to \$URL ..."
#curl \\
# -X 'POST' \\
# -F "repository=\$1" \\
# -F "revision=\$2" \\
# -F "username=\$3" \\
# -F "fingerprint=\$4" \\
# -F contents=@- \\
# --silent \$URL
EOF
chmod +x $GITHOME/receiver
chown -R $GITUSER $GITHOME
echo "Created receiver script in $GITHOME for user '$GITUSER'."
;;
upload-key) # sudo gitreceive upload-key <username>
KEY=$(cat)
FINGERPRINT=$(ssh-keygen -lf /dev/stdin <<< $(echo $KEY) | awk '{print $2}')
AUTHORIZED_KEYS=$GITHOME/.ssh/authorized_keys
# When this key is used, use the ssh 'forced command' feature to have 'gitreceive run' to run instead.
KEY_PREFIX="command=\"$SELF run $2 $FINGERPRINT\",no-agent-forwarding,no-pty,no-user-rc,no-X11-forwarding,no-port-forwarding"
echo "$KEY_PREFIX $KEY" >> $AUTHORIZED_KEYS
echo $FINGERPRINT
;;
# Internal commands
run)
export RECEIVE_USER=$2
export RECEIVE_FINGERPRINT=$3
# ssh provides the original requested command in $SSH_ORIGINAL_COMMAND
export RECEIVE_REPO="$(echo $SSH_ORIGINAL_COMMAND | awk '{print $2}' | perl -pe 's/(?<!\\)'\''//g' | sed 's/\\'\''/'\''/g')"
REPO_PATH="$GITHOME/$RECEIVE_REPO"
if [ ! -d $REPO_PATH ]; then
mkdir -p $REPO_PATH
cd $REPO_PATH
git init --bare > /dev/null
fi
cd $GITHOME
PRERECEIVE_HOOK="$REPO_PATH/hooks/pre-receive"
cat > $PRERECEIVE_HOOK <<EOF
#!/bin/bash
cat | $SELF hook
EOF
chmod +x $PRERECEIVE_HOOK
git-shell -c "$SSH_ORIGINAL_COMMAND"
;;
hook)
while read oldrev newrev refname
do
# Only run this script for the master branch. You can remove this
# if block if you wish to run it for others as well.
if [[ $refname = "refs/heads/master" ]] ; then
git archive $newrev | $GITHOME/receiver "$RECEIVE_REPO" "$newrev" "$RECEIVE_USER" "$RECEIVE_FINGERPRINT"
rc=$?
if [[ $rc != 0 ]] ; then
echo " ERROR: failed on rev $newrev - push denied"
exit $rc
fi
fi
done
#exit 1 # for debugging
;;
*)
echo "Usage: gitreceive <command> [options]"
;;
esac