Repository navigation
Expand file tree
/
Copy pathgitreceive
More file actions
executable file
·82 lines (73 loc) · 2.08 KB
/
Copy pathgitreceive
File metadata and controls
executable file
·82 lines (73 loc) · 2.08 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
#!/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
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
;;
upload-key) # gitreceive upload-key <username>
KEY=$(cat)
FINGERPRINT=$(ssh-keygen -lf /dev/stdin <<< $(echo $KEY) | awk '{print $2}')
AUTHORIZED_KEYS=$GITHOME/.ssh/authorized_keys
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
;;
# Internal commands
run)
export RECEIVE_USER=$2
export RECEIVE_FINGERPRINT=$3
eval $(echo $SSH_ORIGINAL_COMMAND | awk '{print "export RECEIVE_REPO="$2}')
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
eval $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
echo "----> Receiving $RECEIVE_REPO ... "
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