blob: b834fb814c13639e9edd0b290a252ccb331c2597 [file] [log] [blame]
szager@chromium.orgef2ba742013-07-16 22:43:59 +00001#!/bin/bash
2# Copyright (c) 2013 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +00006set -e
7
8while test $# -ne 0; do
9 case "$1" in
10 -v)
11 version="$2"
12 shift
13 ;;
14 -d)
15 rundir="$2"
16 shift
17 ;;
18 *)
19 rundir="$1"
20 ;;
21 esac
22 shift
23done
24
25if [ -z "$rundir" ]; then
szager@chromium.orgef2ba742013-07-16 22:43:59 +000026 rundir=$(mktemp -d)
27fi
28
szager@chromium.org3e2fff22013-07-17 22:41:21 +000029this_dir=$(dirname $0)
30gerrit_exe="$this_dir/gerrit.war"
31
szager@chromium.orgef2ba742013-07-16 22:43:59 +000032account_id=101
33full_name='Test Account'
34maximum_page_size='25'
35password='test-password'
szager@chromium.org3e2fff22013-07-17 22:41:21 +000036preferred_email="test-username@test.org"
szager@chromium.orgef2ba742013-07-16 22:43:59 +000037registered_on=$(date '+%Y-%m-%d %H:%M:%S.000%:::z')
38username='test-username'
39
40# The python code below for picking the "latest" gerrit release is cribbed and
41# ported from the javascript at:
42#
43# http://gerrit-releases.storage.googleapis.com/index.html
44url='https://www.googleapis.com/storage/v1beta2/b/gerrit-releases/o?projection=noAcl'
45curl --ssl-reqd -s $url | python <(cat <<EOF
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +000046# Receives Gerrit version via command line and reads json-encoded
47# text from stdin in the format:
szager@chromium.orgef2ba742013-07-16 22:43:59 +000048#
49# {
50# "items": [
51# {
52# "name": "gerrit-<version>.war",
53# "md5Hash": "<base64 encoded md5sum>",
54# },
55# {
56# "name": "gerrit-<version>.war",
57# "md5Hash": "<base64 encoded md5sum>",
58# },
59# ...
60# }
61#
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +000062# ...and prints the name and md5sum of the corresponding *.war file.
szager@chromium.orgef2ba742013-07-16 22:43:59 +000063
64import json
65import re
66import sys
67
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +000068requested_version = sys.argv[1] if len(sys.argv) > 1 else None
szager@chromium.orgef2ba742013-07-16 22:43:59 +000069gerrit_re = re.compile('gerrit(?:-full)?-([0-9.]+(?:-rc[0-9]+)?)[.]war')
70j = json.load(sys.stdin)
71items = [(x, gerrit_re.match(x['name'])) for x in j['items']]
72items = [(x, m.group(1)) for x, m in items if m]
73def _cmp(a, b):
74 an = a[1].replace('-rc', '.rc').split('.')
75 bn = b[1].replace('-rc', '.rc').split('.')
76 while len(an) < len(bn):
77 an.append('0')
78 while len(bn) < len(an):
79 bn.append('0')
80 for i in range(len(an)):
81 ai = int(an[i][2:]) if 'rc' in an[i] else 1000 + int(an[i])
82 bi = int(bn[i][2:]) if 'rc' in bn[i] else 1000 + int(bn[i])
83 if ai != bi:
84 return -1 if ai > bi else 1
85 return 0
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +000086
87if requested_version:
88 for info, version in items:
89 if version == requested_version:
90 print '"%s" "%s"' % (info['name'], info['md5Hash'])
91 sys.exit(0)
92 print >> sys.stderr, 'No such Gerrit version: %s' % requested_version
93 sys.exit(1)
94
szager@chromium.orgef2ba742013-07-16 22:43:59 +000095items.sort(cmp=_cmp)
96for x in items:
97 if 'rc' not in x[0]['name']:
98 print '"%s" "%s"' % (x[0]['name'], x[0]['md5Hash'])
99 sys.exit(0)
100EOF
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000101) "$version" | xargs | while read name md5; do
102 # Download the requested gerrit version if necessary, and verify the md5sum.
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000103 target="$this_dir/$name"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000104 net_sum=$(echo -n $md5 | base64 -d | od -tx1 | head -1 | cut -d ' ' -f 2- |
105 sed 's/ //g')
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000106 if [ -f "$target" ]; then
107 file_sum=$(md5sum "$target" | awk '{print $1}' | xargs)
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000108 if [ "$file_sum" = "$net_sum" ]; then
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000109 ln -sf "$name" "$gerrit_exe"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000110 break
111 else
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000112 rm -rf "$target"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000113 fi
114 fi
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000115 curl --ssl-reqd -s -o "$target" \
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000116 "https://gerrit-releases.storage.googleapis.com/$name"
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000117 file_sum=$(md5sum "$target" | awk '{print $1}' | xargs)
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000118 if [ "$file_sum" != "$net_sum" ]; then
119 echo "ERROR: md5sum mismatch when downloading $name" 1>&2
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000120 rm -rf "$target"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000121 exit 1
122 else
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000123 ln -sf "$name" "$gerrit_exe"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000124 fi
125done
126
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000127if [ ! -e "$gerrit_exe" ]; then
128 echo "ERROR: No $gerrit_exe file or link present, and unable " 1>&2
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000129 echo " to download the latest version." 1>&2
130 exit 1
131fi
132
133# By default, gerrit only accepts https connections, which is a good thing. But
134# for testing, it's convenient to enable plain http.
135mkdir -p "${rundir}/etc"
136cat <<EOF > "${rundir}/etc/gerrit.config"
137[auth]
138 type = http
139 gitBasicAuth = true
140EOF
141
142# Initialize the gerrit instance.
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000143java -jar "$gerrit_exe" init --no-auto-start --batch -d "${rundir}"
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000144
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000145# Create SSH key pair for the first user.
146mkdir -p "${rundir}/tmp"
147ssh-keygen -t rsa -q -f "${rundir}/tmp/id_rsa" -N ""
148ssh_public_key="$(cat ${rundir}/tmp/id_rsa.pub)"
149
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000150# Set up the first user, with admin priveleges.
szager@chromium.org3e2fff22013-07-17 22:41:21 +0000151cat <<EOF | java -jar "$gerrit_exe" gsql -d "${rundir}" > /dev/null
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000152INSERT INTO ACCOUNTS (FULL_NAME, MAXIMUM_PAGE_SIZE, PREFERRED_EMAIL, REGISTERED_ON, ACCOUNT_ID) VALUES ('${full_name}', ${maximum_page_size}, '${preferred_email}', '${registered_on}', ${account_id});
153INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EXTERNAL_ID) VALUES (${account_id}, 'gerrit:${username}');
154INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EXTERNAL_ID) VALUES (${account_id}, 'username:${username}');
155INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EMAIL_ADDRESS, PASSWORD) VALUES (${account_id}, '${preferred_email}', '${password}');
156INSERT INTO ACCOUNT_GROUP_MEMBERS (ACCOUNT_ID, GROUP_ID) VALUES (${account_id}, 1);
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000157INSERT INTO ACCOUNT_SSH_KEYS (ACCOUNT_ID, SSH_PUBLIC_KEY, VALID, SEQ) VALUES (${account_id}, '${ssh_public_key}', 'Y', 0);
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000158EOF
159
160# Create a netrc file to authenticate as the first user.
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000161cat <<EOF > "${rundir}/tmp/.netrc"
162machine localhost login ${username} password ${password}
163EOF
164
szager@chromium.org3592f932013-07-19 23:27:44 +0000165# Create a .git-credentials file, to enable password-less push.
166cat <<EOF > "${rundir}/tmp/.git-credentials"
167http://${username}:${password}@localhost:8080
168EOF
169
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000170echo
171echo "To start gerrit server:"
172echo " ${rundir}/bin/gerrit.sh start"
173echo
174echo "To use the REST API:"
175echo " curl --netrc-file ${rundir}/tmp/.netrc http://localhost:8080/<endpoint>"
176echo
vadimsh@chromium.orgf6916482013-08-06 22:41:03 +0000177echo "To use SSH API:"
178echo " ssh ${username}@localhost -p 29418 -i ${rundir}/tmp/id_rsa gerrit"
179echo
szager@chromium.org3592f932013-07-19 23:27:44 +0000180echo "To enable 'git push' without a password prompt:"
181echo " git config credential.helper 'store --file=${rundir}/tmp/.git-credentials'"
182echo
szager@chromium.orgef2ba742013-07-16 22:43:59 +0000183echo "To stop the server:"
184echo " ${rundir}/bin/gerrit.sh stop"
185echo