Merge branch 'stable-2.13' * stable-2.13: Replace EasyMock with Mockito Change-Id: I28fae8d964fca37580f6779b6b3819688eecd4ff
diff --git a/.buckconfig b/.buckconfig index 2b818b6..275ec6a 100644 --- a/.buckconfig +++ b/.buckconfig
@@ -6,7 +6,8 @@ [java] jar_spool_mode = direct_to_jar src_roots = java, resources - + source_level = 8 + target_level = 8 [project] ignore = .git, eclipse-out/ parallel_parsing = true
diff --git a/.gitignore b/.gitignore index c27e17f..9556f7c 100644 --- a/.gitignore +++ b/.gitignore
@@ -4,6 +4,13 @@ /.project /.settings/ /.watchmanconfig +/.primary_build_tool /buck-out/ /bucklets /eclipse-out/ +/bazel-bin +/bazel-genfiles +/bazel-out +/bazel-reviewers +/bazel-testlogs +/bazel-sync-index
diff --git a/BUCK b/BUCK index bd6696e..1126b12 100644 --- a/BUCK +++ b/BUCK
@@ -5,11 +5,7 @@ SOURCES = glob(['src/main/java/**/*.java']) RESOURCES = glob(['src/main/resources/**/*']) -DEPS = [ - ':wiremock', -] - -TEST_DEPS = GERRIT_PLUGIN_API + GERRIT_TESTS + DEPS + [ +TEST_DEPS = GERRIT_PLUGIN_API + GERRIT_TESTS + [ ':sync-index__plugin', ':mockito', ] @@ -27,8 +23,6 @@ 'Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/sync-index', 'Implementation-Vendor: Ericsson', ], - provided_deps = GERRIT_TESTS, - deps = DEPS, ) java_sources( @@ -50,8 +44,8 @@ maven_jar( name = 'wiremock', - id = 'com.github.tomakehurst:wiremock:1.58:standalone', - sha1 = '21c8386a95c5dc54a9c55839c5a95083e42412ae', + id = 'com.github.tomakehurst:wiremock-standalone:2.1.12', + sha1 = 'fee73e0913ff3801cf83e660a14d6e4aac9a9cbd', license = 'Apache2.0', attach_source = False, )
diff --git a/BUILD b/BUILD new file mode 100644 index 0000000..ed6ffe4 --- /dev/null +++ b/BUILD
@@ -0,0 +1,34 @@ +load("//tools/bzl:junit.bzl", "junit_tests") +load( + "//tools/bzl:plugin.bzl", + "gerrit_plugin", + "PLUGIN_DEPS", + "PLUGIN_TEST_DEPS", +) + +gerrit_plugin( + name = "sync-index", + srcs = glob(["src/main/java/**/*.java"]), + resources = glob(["src/main/resources/**/*"]), + manifest_entries = [ + 'Gerrit-PluginName: sync-index', + 'Gerrit-Module: com.ericsson.gerrit.plugins.syncindex.Module', + 'Gerrit-HttpModule: com.ericsson.gerrit.plugins.syncindex.HttpModule', + 'Implementation-Title: sync-index plugin', + 'Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/sync-index', + 'Implementation-Vendor: Ericsson', + ], +) + +junit_tests( + name = "sync_index_tests", + srcs = glob(["src/test/java/**/*.java"]), + tags = ["sync-index", "local"], + deps = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [ + "@wiremock//jar", + "@mockito//jar", + "@byte-buddy//jar", + "@objenesis//jar", + ":sync-index__plugin", + ], +)
diff --git a/WORKSPACE b/WORKSPACE new file mode 100644 index 0000000..c4582eb --- /dev/null +++ b/WORKSPACE
@@ -0,0 +1,51 @@ +workspace(name = "sync_index") +load("//:bazlets.bzl", "load_bazlets") + +load_bazlets( + commit = "8a4cbdc993f41fcfe7290e7d1007cfedf8d87c18", + #local_path = "/home/davido/projects/bazlets", +) + +#Snapshot Plugin API +load( + "@com_googlesource_gerrit_bazlets//:gerrit_api_maven_local.bzl", + "gerrit_api_maven_local", +) + +# Load snapshot Plugin API +gerrit_api_maven_local() + +# Release Plugin API +#load( +# "@com_googlesource_gerrit_bazlets//:gerrit_api.bzl", +# "gerrit_api", +#) + +# Load release Plugin API +#gerrit_api() + +load("@com_googlesource_gerrit_bazlets//tools:maven_jar.bzl", "maven_jar") + +maven_jar( + name = "wiremock", + artifact = "com.github.tomakehurst:wiremock-standalone:2.4.1", + sha1 = "228d3047147fffa0f12771f5dc2b3cd3b38c454b", +) + +maven_jar( + name = 'mockito', + artifact = 'org.mockito:mockito-core:2.5.0', + sha1 = 'be28d46a52c7f2563580adeca350145e9ce916f8', +) + +maven_jar( + name = 'byte-buddy', + artifact = 'net.bytebuddy:byte-buddy:1.5.12', + sha1 = 'b1ba1d15f102b36ed43b826488114678d6d413da', +) + +maven_jar( + name = 'objenesis', + artifact = 'org.objenesis:objenesis:2.4', + sha1 = '2916b6c96b50c5b3ec4452ed99401db745aabb27', +)
diff --git a/WORKSPACE.in_gerrit_tree b/WORKSPACE.in_gerrit_tree new file mode 100644 index 0000000..511225c --- /dev/null +++ b/WORKSPACE.in_gerrit_tree
@@ -0,0 +1,6 @@ + +maven_jar( + name = "wiremock", + artifact = "com.github.tomakehurst:wiremock-standalone:2.4.1", + sha1 = "228d3047147fffa0f12771f5dc2b3cd3b38c454b", +)
diff --git a/bazlets.bzl b/bazlets.bzl new file mode 100644 index 0000000..e14e488 --- /dev/null +++ b/bazlets.bzl
@@ -0,0 +1,17 @@ +NAME = "com_googlesource_gerrit_bazlets" + +def load_bazlets( + commit, + local_path = None + ): + if not local_path: + native.git_repository( + name = NAME, + remote = "https://gerrit.googlesource.com/bazlets", + commit = commit, + ) + else: + native.local_repository( + name = NAME, + path = local_path, + )
diff --git a/lib/gerrit/BUCK b/lib/gerrit/BUCK index f83d917..8d5f0e9 100644 --- a/lib/gerrit/BUCK +++ b/lib/gerrit/BUCK
@@ -1,12 +1,11 @@ include_defs('//bucklets/maven_jar.bucklet') -VER = '2.13' -REPO = MAVEN_CENTRAL +VER = '2.14-SNAPSHOT' +REPO = MAVEN_LOCAL maven_jar( name = 'acceptance-framework', id = 'com.google.gerrit:gerrit-acceptance-framework:' + VER, - sha1 = 'a6913a61196a8fccdb45e761f43a0b7e21867c90', license = 'Apache2.0', attach_source = False, repository = REPO, @@ -15,7 +14,6 @@ maven_jar( name = 'plugin-api', id = 'com.google.gerrit:gerrit-plugin-api:' + VER, - sha1 = 'e25d55b8f41627c4ae6b9d2069ec398638b219a3', license = 'Apache2.0', attach_source = False, repository = REPO,
diff --git a/src/main/java/com/ericsson/gerrit/plugins/syncindex/HttpClientProvider.java b/src/main/java/com/ericsson/gerrit/plugins/syncindex/HttpClientProvider.java index 3b2f177..07cad78 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/syncindex/HttpClientProvider.java +++ b/src/main/java/com/ericsson/gerrit/plugins/syncindex/HttpClientProvider.java
@@ -91,10 +91,9 @@ private HttpRequestRetryHandler customRetryHandler() { return new HttpRequestRetryHandler() { - @Override public boolean retryRequest(IOException exception, int executionCount, - HttpContext context) { + HttpContext httpContext) { if (executionCount > cfg.getMaxTries() || exception instanceof SSLException) { return false;
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md index 3babed2..7e65e73 100644 --- a/src/main/resources/Documentation/build.md +++ b/src/main/resources/Documentation/build.md
@@ -1,21 +1,61 @@ -Build -===== +# Build -This plugin is built with Buck. +This plugin can be built with Bazel or Buck and two build modes are supported: + * Standalone + * In Gerrit tree. -Two build modes are supported: Standalone and in Gerrit tree. Standalone -build mode is recommended, as this mode doesn't require local Gerrit -tree to exist. +Standalone build mode is recommended, as this mode doesn't require local Gerrit +tree to exist. Moreover, there are some limitations and additional manual steps +required when building in Gerrit tree mode (see corresponding sections). -Build standalone ----------------- +## Build standalone + +### Bazel + +To build the plugin, issue the following command: + +``` + bazel build @PLUGIN@ +``` + +The output is created in + +``` + bazel-genfiles/@PLUGIN@.jar +``` + +To package the plugin sources run: + +``` + bazel build libsync-index__plugin-src.jar +``` + +The output is created in: + +``` + bazel-bin/libsync-index__plugin-src.jar +``` + +To execute the tests run: + +``` + bazel test sync_index_tests +``` + +This project can be imported into the Eclipse IDE: + +``` + ./tools/eclipse.py +``` + +### Buck Clone bucklets library: ``` git clone https://gerrit.googlesource.com/bucklets - ``` + and link it to @PLUGIN@ directory: ``` @@ -51,6 +91,9 @@ ``` ./bucklets/tools/eclipse.py ``` +* Note: wiremock jar should be added manually to classpath. In Eclipse: +`Project -> Java Build Path -> Add External JARS -> <location of +wiremock-standalone.jar in local file system>` To execute the tests run: @@ -70,11 +113,59 @@ buck-out/gen/@PLUGIN@-sources.jar ``` -Build in Gerrit tree --------------------- +## Build in Gerrit tree -Clone or link this plugin to the plugins directory of Gerrit's source -tree, and issue the command: +### Bazel + +Clone or link this plugin to the plugins directory of Gerrit's source tree, and +issue the command: + +``` + bazel build plugins/@PLUGIN@ +``` + +The output is created in + +``` + bazel-genfiles/plugins/@PLUGIN@/@PLUGIN@.jar +``` + +This project can be imported into the Eclipse IDE. First, list the plugin in the +custom plugin list, in `gerrit/tools/bzl/plugins.bzl`: + +``` +CUSTOM_PLUGINS = [ + ... + '@PLUGIN@', +] +``` + +and issue the command: + +``` + ./tools/eclipse/project_bzl.py +``` + +* Note: wiremock jar should be added manually to classpath. In Eclipse: +`Project -> Java Build Path -> Add External JARS -> <location of +wiremock-standalone.jar in local file system>` + +To execute the tests, Gerrit WORKSPACE should be patched: + +``` + cat plugins/sync-index/WORKSPACE.in_gerrit_tree >> WORKSPACE +``` + +then run: + +``` + bazel test plugins/@PLUGIN@:sync_index_tests +``` + +### Buck + +Clone or link this plugin to the plugins directory of Gerrit's source tree, and +issue the command: ``` buck build plugins/@PLUGIN@ @@ -92,6 +183,11 @@ ./tools/eclipse/project.py ``` +* Note: wiremock jar should be added manually to classpath. In Eclipse: +`Project -> Java Build Path -> Add External JARS -> <location of +wiremock-standalone.jar in local file system>` + + To execute the tests run: ```
diff --git a/src/test/java/com/ericsson/gerrit/plugins/syncindex/IndexEventHandlerTest.java b/src/test/java/com/ericsson/gerrit/plugins/syncindex/IndexEventHandlerTest.java index 045aefa..bb83dcc 100644 --- a/src/test/java/com/ericsson/gerrit/plugins/syncindex/IndexEventHandlerTest.java +++ b/src/test/java/com/ericsson/gerrit/plugins/syncindex/IndexEventHandlerTest.java
@@ -102,8 +102,9 @@ public void testSyncIndexTaskHashCodeAndEquals() { SyncIndexTask task = indexEventHandler.new SyncIndexTask(CHANGE_ID, false); - assertThat(task.equals(task)).isTrue(); - assertThat(task.hashCode()).isEqualTo(task.hashCode()); + SyncIndexTask sameTask = task; + assertThat(task.equals(sameTask)).isTrue(); + assertThat(task.hashCode()).isEqualTo(sameTask.hashCode()); SyncIndexTask identicalTask = indexEventHandler.new SyncIndexTask(CHANGE_ID, false);
diff --git a/tools/BUILD b/tools/BUILD new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tools/BUILD
diff --git a/tools/bazel.rc b/tools/bazel.rc new file mode 100644 index 0000000..4ed16cf --- /dev/null +++ b/tools/bazel.rc
@@ -0,0 +1,2 @@ +build --workspace_status_command=./tools/workspace-status.sh +test --build_tests_only
diff --git a/tools/bzl/BUILD b/tools/bzl/BUILD new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tools/bzl/BUILD
diff --git a/tools/bzl/junit.bzl b/tools/bzl/junit.bzl new file mode 100644 index 0000000..3af7e58 --- /dev/null +++ b/tools/bzl/junit.bzl
@@ -0,0 +1,4 @@ +load( + "@com_googlesource_gerrit_bazlets//tools:junit.bzl", + "junit_tests", +)
diff --git a/tools/bzl/plugin.bzl b/tools/bzl/plugin.bzl new file mode 100644 index 0000000..a2e438f --- /dev/null +++ b/tools/bzl/plugin.bzl
@@ -0,0 +1,6 @@ +load( + "@com_googlesource_gerrit_bazlets//:gerrit_plugin.bzl", + "gerrit_plugin", + "PLUGIN_DEPS", + "PLUGIN_TEST_DEPS", +)
diff --git a/tools/eclipse/BUILD b/tools/eclipse/BUILD new file mode 100644 index 0000000..cb18eda --- /dev/null +++ b/tools/eclipse/BUILD
@@ -0,0 +1,27 @@ +load("@com_googlesource_gerrit_bazlets//tools:commons.bzl", + "PLUGIN_DEPS", + "PLUGIN_TEST_DEPS",) +load("@com_googlesource_gerrit_bazlets//tools:classpath.bzl", + "classpath_collector") + +java_library( + name = "classpath", + runtime_deps = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [ + "@wiremock//jar", + "@mockito//jar", + "@byte-buddy//jar", + "@objenesis//jar", + "//:sync-index__plugin", + ], +) + +classpath_collector( + name = "main_classpath_collect", + deps = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [ + "@wiremock//jar", + "@mockito//jar", + "@byte-buddy//jar", + "@objenesis//jar", + "//:sync-index__plugin" + ], +)
diff --git a/tools/eclipse/project.py b/tools/eclipse/project.py new file mode 100755 index 0000000..88ca4b0 --- /dev/null +++ b/tools/eclipse/project.py
@@ -0,0 +1,179 @@ +#!/usr/bin/env python +# Copyright (C) 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import print_function +# TODO(davido): use Google style for importing instead: +# import optparse +# +# optparse.OptionParser +from optparse import OptionParser +from os import environ, path, makedirs +from subprocess import CalledProcessError, check_call, check_output +from xml.dom import minidom +import re +import sys + +MAIN = '//tools/eclipse:classpath' +JRE = '/'.join([ + 'org.eclipse.jdt.launching.JRE_CONTAINER', + 'org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType', + 'JavaSE-1.8', +]) +# Map of targets to corresponding classpath collector rules +cp_targets = { + MAIN: '//tools/eclipse:main_classpath_collect', +} + +ROOT = path.abspath(__file__) +while not path.exists(path.join(ROOT, 'WORKSPACE')): + ROOT = path.dirname(ROOT) + +opts = OptionParser() +opts.add_option('--name', help='name of the generated project', + action='store', default='sync-index', dest='project_name') +args, _ = opts.parse_args() + +def retrieve_ext_location(): + return check_output(['bazel', 'info', 'output_base']).strip() + +def gen_primary_build_tool(): + bazel = check_output(['which', 'bazel']).strip() + with open(path.join(ROOT, ".primary_build_tool"), 'w') as fd: + fd.write("bazel=%s\n" % bazel) + fd.write("PATH=%s\n" % environ["PATH"]) + +def _query_classpath(target): + deps = [] + t = cp_targets[target] + try: + check_call(['bazel', 'build', t]) + except CalledProcessError: + exit(1) + name = 'bazel-bin/tools/eclipse/' + t.split(':')[1] + '.runtime_classpath' + deps = [line.rstrip('\n') for line in open(name)] + return deps + +def gen_project(name='gerrit', root=ROOT): + p = path.join(root, '.project') + with open(p, 'w') as fd: + print("""\ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>%(name)s</name> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription>\ + """ % {"name": name}, file=fd) + +def gen_classpath(ext): + def make_classpath(): + impl = minidom.getDOMImplementation() + return impl.createDocument(None, 'classpath', None) + + def classpathentry(kind, path, src=None, out=None, exported=None): + e = doc.createElement('classpathentry') + e.setAttribute('kind', kind) + # TODO(davido): Remove this and other exclude BUILD files hack + # when this Bazel bug is fixed: + # https://github.com/bazelbuild/bazel/issues/1083 + if kind == 'src': + e.setAttribute('excluding', '**/BUILD') + e.setAttribute('path', path) + if src: + e.setAttribute('sourcepath', src) + if out: + e.setAttribute('output', out) + if exported: + e.setAttribute('exported', 'true') + doc.documentElement.appendChild(e) + + doc = make_classpath() + src = set() + lib = set() + + # Classpath entries are absolute for cross-cell support + java_library = re.compile('bazel-out/local-fastbuild/bin/lib[^/]+[.]jar$') + srcs = re.compile('(.*/external/[^/]+)/jar/(.*)[.]jar') + for p in _query_classpath(MAIN): + m = java_library.match(p) + if m: + src.add(".") + else: + if p.startswith("external"): + p = path.join(ext, p) + lib.add(p) + + for s in sorted(src): + out = None + + if s.startswith('lib/'): + out = 'eclipse-out/lib' + + p = path.join(s, 'java') + if path.exists(p): + classpathentry('src', p, out=out) + continue + + for env in ['main', 'test']: + o = None + if out: + o = out + '/' + env + elif env == 'test': + o = 'eclipse-out/test' + + for srctype in ['java', 'resources']: + p = path.join(s, 'src', env, srctype) + if path.exists(p): + classpathentry('src', p, out=o) + + for libs in [lib]: + for j in sorted(libs): + s = None + m = srcs.match(j) + if m: + prefix = m.group(1) + suffix = m.group(2) + p = path.join(prefix, "src", "%s-src.jar" % suffix) + if path.exists(p): + s = p + classpathentry('lib', j, s) + + classpathentry('con', JRE) + classpathentry('output', 'eclipse-out/classes') + + p = path.join(ROOT, '.classpath') + with open(p, 'w') as fd: + doc.writexml(fd, addindent='\t', newl='\n', encoding='UTF-8') + +try: + ext_location = retrieve_ext_location() + gen_project(args.project_name) + gen_classpath(ext_location) + gen_primary_build_tool() + + try: + check_call(['bazel', 'build', MAIN]) + except CalledProcessError: + exit(1) +except KeyboardInterrupt: + print('Interrupted by user', file=sys.stderr) + exit(1)
diff --git a/tools/workspace-status.sh b/tools/workspace-status.sh new file mode 100755 index 0000000..3102f64 --- /dev/null +++ b/tools/workspace-status.sh
@@ -0,0 +1,17 @@ +#!/bin/bash + +# This script will be run by bazel when the build process starts to +# generate key-value information that represents the status of the +# workspace. The output should be like +# +# KEY1 VALUE1 +# KEY2 VALUE2 +# +# If the script exits with non-zero code, it's considered as a failure +# and the output will be discarded. + +function rev() { + cd $1; git describe --always --match "v[0-9].*" --dirty +} + +echo STABLE_BUILD_SYNC-INDEX_LABEL $(rev .)