blob: 0bc15319519ea7a6f427e0811c78a1180a3859de [file] [log] [blame]
James E. Blaira208dcc2011-11-16 11:24:15 -08001#!/bin/sh -e
2# Copyright (c) 2010-2011 Gluster, Inc. <http://www.gluster.com>
3# This initial version of this file was taken from the source tree
4# of GlusterFS. It was not directly attributed, but is assumed to be
5# Copyright (c) 2010-2011 Gluster, Inc and release GPLv3
6# Subsequent modifications are Copyright (c) 2011 OpenStack, LLC.
7#
8# GlusterFS is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published
10# by the Free Software Foundation; either version 3 of the License,
11# or (at your option) any later version.
12#
13# GlusterFS is distributed in the hope that it will be useful, but
14# WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16# General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see
20# <http://www.gnu.org/licenses/>.
21
22
23branch="master";
24
25set_hooks_commit_msg()
26{
27 top_dir=`git rev-parse --show-toplevel`
28 f="${top_dir}/.git/hooks/commit-msg";
29 u="https://review.openstack.org/tools/hooks/commit-msg";
30
31 if [ -x "$f" ]; then
32 return;
33 fi
34
35 curl -o $f $u || wget -O $f $u;
36
37 chmod +x $f;
38
39 GIT_EDITOR=true git commit --amend
40}
41
42add_remote()
43{
44 username=$1
45 project=$2
46
47 echo "No remote set, testing ssh://$username@review.openstack.org:29418"
48 if project_list=`ssh -p29418 -o StrictHostKeyChecking=no $username@review.openstack.org gerrit ls-projects 2>/dev/null`
49 then
50 echo "$username@review.openstack.org:29418 worked."
51 if echo $project_list | grep $project >/dev/null
52 then
53 echo "Creating a git remote called gerrit that maps to:"
54 echo " ssh://$username@review.openstack.org:29418/$project"
55 git remote add gerrit ssh://$username@review.openstack.org:29418/$project
56 else
57 echo "The current project name, $project, is not a known project."
58 echo "Please either reclone from github/gerrit or create a"
59 echo "remote named gerrit that points to the intended project."
60 return 1
61 fi
62
63 return 0
64 fi
65 return 1
66}
67
68check_remote()
69{
70 if ! git remote | grep gerrit >/dev/null 2>&1
71 then
72 origin_project=`git remote show origin | grep 'Fetch URL' | perl -nle '@fields = split(m|[:/]|); $len = $#fields; print $fields[$len-1], "/", $fields[$len];'`
73 if add_remote $USERNAME $origin_project
74 then
75 return 0
76 else
77 echo "Your local name doesn't work on Gerrit."
78 echo -n "Enter Gerrit username (same as launchpad): "
79 read gerrit_user
80 if add_remote $gerrit_user $origin_project
81 then
82 return 0
83 else
84 echo "Can't infer where gerrit is - please set a remote named"
85 echo "gerrit manually and then try again."
86 echo
87 echo "For more information, please see:"
88 echo "\thttp://wiki.openstack.org/GerritWorkflow"
89 exit 1
90 fi
91 fi
92 fi
93}
94
95rebase_changes()
96{
97 git fetch;
98
99 GIT_EDITOR=true git rebase -i origin/$branch || exit $?;
100}
101
102
103assert_diverge()
104{
105 if ! git diff origin/$branch..HEAD | grep -q .
106 then
107 echo "No changes between the current branch and origin/$branch."
108 exit 1
109 fi
110}
111
112
113main()
114{
115 set_hooks_commit_msg;
116
117 check_remote;
118
119 rebase_changes;
120
121 assert_diverge;
122
123 bug=$(git show --format='%s %b' | perl -nle 'if (/\b([Bb]ug|[Ll][Pp])\s*[#:]?\s*(\d+)/) {print "$2"; exit}')
124
125 bp=$(git show --format='%s %b' | perl -nle 'if (/\b([Bb]lue[Pp]rint|[Bb][Pp])\s*[#:]?\s*([0-9a-zA-Z-_]+)/) {print "$2"; exit}')
126
127 if [ "$DRY_RUN" = 1 ]; then
128 drier='echo -e Please use the following command to send your commits to review:\n\n'
129 else
130 drier=
131 fi
132
133 local_branch=`git branch | grep -Ei "\* (.*)" | cut -f2 -d' '`
134 if [ -z "$bug" ]; then
135 if [ -z "$bp" ]; then
136 $drier git push gerrit HEAD:refs/for/$branch/$local_branch;
137 else
138 $drier git push gerrit HEAD:refs/for/$branch/bp/$bp;
139 fi
140 else
141 $drier git push gerrit HEAD:refs/for/$branch/bug/$bug;
142 fi
143}
144
145main "$@"