diff --git a/testing_support/gerrit-init.sh b/testing_support/gerrit-init.sh new file mode 100755 index 0000000000..83d617161a --- /dev/null +++ b/testing_support/gerrit-init.sh @@ -0,0 +1,137 @@ +#!/bin/bash +# Copyright (c) 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +if [ -n "$1" ]; then + rundir="$1" +else + rundir=$(mktemp -d) +fi + +account_id=101 +full_name='Test Account' +maximum_page_size='25' +password='test-password' +preferred_email="${username}@test.org" +registered_on=$(date '+%Y-%m-%d %H:%M:%S.000%:::z') +username='test-username' + +# The python code below for picking the "latest" gerrit release is cribbed and +# ported from the javascript at: +# +# http://gerrit-releases.storage.googleapis.com/index.html +url='https://www.googleapis.com/storage/v1beta2/b/gerrit-releases/o?projection=noAcl' +curl --ssl-reqd -s $url | python <(cat <.war", +# "md5Hash": "", +# }, +# { +# "name": "gerrit-.war", +# "md5Hash": "", +# }, +# ... +# } +# +# ...and prints the name and md5sum of the latest non-release-candidate version. + +import json +import re +import sys + +gerrit_re = re.compile('gerrit(?:-full)?-([0-9.]+(?:-rc[0-9]+)?)[.]war') +j = json.load(sys.stdin) +items = [(x, gerrit_re.match(x['name'])) for x in j['items']] +items = [(x, m.group(1)) for x, m in items if m] +def _cmp(a, b): + an = a[1].replace('-rc', '.rc').split('.') + bn = b[1].replace('-rc', '.rc').split('.') + while len(an) < len(bn): + an.append('0') + while len(bn) < len(an): + bn.append('0') + for i in range(len(an)): + ai = int(an[i][2:]) if 'rc' in an[i] else 1000 + int(an[i]) + bi = int(bn[i][2:]) if 'rc' in bn[i] else 1000 + int(bn[i]) + if ai != bi: + return -1 if ai > bi else 1 + return 0 +items.sort(cmp=_cmp) +for x in items: + if 'rc' not in x[0]['name']: + print '"%s" "%s"' % (x[0]['name'], x[0]['md5Hash']) + sys.exit(0) +EOF +) | xargs | while read name md5; do + # Download the latest gerrit version if necessary, and verify the md5sum. + net_sum=$(echo -n $md5 | base64 -d | od -tx1 | head -1 | cut -d ' ' -f 2- | + sed 's/ //g') + if [ -f "./$name" ]; then + file_sum=$(md5sum "./$name" | awk '{print $1}' | xargs) + if [ "$file_sum" = "$net_sum" ]; then + ln -sf "./$name" gerrit.war + break + else + rm -rf "./$name" + fi + fi + curl --ssl-reqd -s -o "./$name" \ + "https://gerrit-releases.storage.googleapis.com/$name" + file_sum=$(md5sum "./$name" | awk '{print $1}' | xargs) + if [ "$file_sum" != "$net_sum" ]; then + echo "ERROR: md5sum mismatch when downloading $name" 1>&2 + rm -rf "./$name" + exit 1 + else + ln -sf "./$name" gerrit.war + fi +done + +if [ ! -e "./gerrit.war" ]; then + echo "ERROR: No gerrit.war file or link present, and unable " 1>&2 + echo " to download the latest version." 1>&2 + exit 1 +fi + +# By default, gerrit only accepts https connections, which is a good thing. But +# for testing, it's convenient to enable plain http. +mkdir -p "${rundir}/etc" +cat < "${rundir}/etc/gerrit.config" +[auth] + type = http + gitBasicAuth = true +EOF + +# Initialize the gerrit instance. +java -jar "./gerrit.war" init --no-auto-start --batch -d "${rundir}" + +# Set up the first user, with admin priveleges. +cat < /dev/null +INSERT 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}); +INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EXTERNAL_ID) VALUES (${account_id}, 'gerrit:${username}'); +INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EXTERNAL_ID) VALUES (${account_id}, 'username:${username}'); +INSERT INTO ACCOUNT_EXTERNAL_IDS (ACCOUNT_ID, EMAIL_ADDRESS, PASSWORD) VALUES (${account_id}, '${preferred_email}', '${password}'); +INSERT INTO ACCOUNT_GROUP_MEMBERS (ACCOUNT_ID, GROUP_ID) VALUES (${account_id}, 1); +EOF + +# Create a netrc file to authenticate as the first user. +mkdir -p "${rundir}/tmp" +cat < "${rundir}/tmp/.netrc" +machine localhost login ${username} password ${password} +EOF + +echo +echo "To start gerrit server:" +echo " ${rundir}/bin/gerrit.sh start" +echo +echo "To use the REST API:" +echo " curl --netrc-file ${rundir}/tmp/.netrc http://localhost:8080/" +echo +echo "To stop the server:" +echo " ${rundir}/bin/gerrit.sh stop" +echo