Merge branch 'stable-2.15' into stable-2.16
* stable-2.15:
Bazel: Make build tool chain forward compatible
AccountIT: Add test that it is possible to delete all emails
Change-Id: I6ed0558e119a538fa695cc2fd7a2081971c87414
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java
index c5c2911..cff1ba1 100644
--- a/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java
@@ -1088,6 +1088,27 @@
}
@Test
+ @Sandboxed
+ public void deleteAllEmails() throws Exception {
+ EmailInput input = new EmailInput();
+ input.email = "foo.bar@example.com";
+ input.noConfirmation = true;
+ gApi.accounts().self().addEmail(input);
+
+ resetCurrentApiUser();
+ Set<String> allEmails = getEmails();
+ assertThat(allEmails).hasSize(2);
+
+ for (String email : allEmails) {
+ gApi.accounts().self().deleteEmail(email);
+ }
+
+ resetCurrentApiUser();
+ assertThat(getEmails()).isEmpty();
+ assertThat(gApi.accounts().self().get().email).isNull();
+ }
+
+ @Test
public void deleteEmailFromCustomExternalIdSchemes() throws Exception {
String email = "foo.bar@example.com";
String extId1 = "foo:bar";
diff --git a/tools/bzl/js.bzl b/tools/bzl/js.bzl
index c567380..d2aee01 100644
--- a/tools/bzl/js.bzl
+++ b/tools/bzl/js.bzl
@@ -45,6 +45,8 @@
implementation = _npm_binary_impl,
)
+ComponentInfo = provider()
+
# for use in repo rules.
def _run_npm_binary_str(ctx, tarball, args):
python_bin = ctx.which("python")
@@ -133,31 +135,29 @@
def _bower_component_impl(ctx):
transitive_zipfiles = depset(
direct = [ctx.file.zipfile],
- transitive = [d.transitive_zipfiles for d in ctx.attr.deps],
+ transitive = [d[ComponentInfo].transitive_zipfiles for d in ctx.attr.deps],
)
transitive_licenses = depset(
direct = [ctx.file.license],
- transitive = [d.transitive_licenses for d in ctx.attr.deps],
+ transitive = [d[ComponentInfo].transitive_licenses for d in ctx.attr.deps],
)
transitive_versions = depset(
direct = ctx.files.version_json,
- transitive = [d.transitive_versions for d in ctx.attr.deps],
+ transitive = [d[ComponentInfo].transitive_versions for d in ctx.attr.deps],
)
- return struct(
- transitive_licenses = transitive_licenses,
- transitive_versions = transitive_versions,
- transitive_zipfiles = transitive_zipfiles,
- )
+ return [
+ ComponentInfo(
+ transitive_licenses = transitive_licenses,
+ transitive_versions = transitive_versions,
+ transitive_zipfiles = transitive_zipfiles,
+ ),
+ ]
_common_attrs = {
- "deps": attr.label_list(providers = [
- "transitive_zipfiles",
- "transitive_versions",
- "transitive_licenses",
- ]),
+ "deps": attr.label_list(providers = [ComponentInfo]),
}
def _js_component(ctx):
@@ -187,11 +187,13 @@
if ctx.file.license:
licenses.append(ctx.file.license)
- return struct(
- transitive_licenses = depset(licenses),
- transitive_versions = depset(),
- transitive_zipfiles = list([ctx.outputs.zip]),
- )
+ return [
+ ComponentInfo(
+ transitive_licenses = depset(licenses),
+ transitive_versions = depset(),
+ transitive_zipfiles = list([ctx.outputs.zip]),
+ ),
+ ]
js_component = rule(
_js_component,
@@ -233,16 +235,16 @@
"""A bunch of bower components zipped up."""
zips = depset()
for d in ctx.attr.deps:
- files = d.transitive_zipfiles
+ files = d[ComponentInfo].transitive_zipfiles
# TODO(davido): Make sure the field always contains a depset
if type(files) == "list":
files = depset(files)
zips = depset(transitive = [zips, files])
- versions = depset(transitive = [d.transitive_versions for d in ctx.attr.deps])
+ versions = depset(transitive = [d[ComponentInfo].transitive_versions for d in ctx.attr.deps])
- licenses = depset(transitive = [d.transitive_versions for d in ctx.attr.deps])
+ licenses = depset(transitive = [d[ComponentInfo].transitive_versions for d in ctx.attr.deps])
out_zip = ctx.outputs.zip
out_versions = ctx.outputs.version_json
@@ -272,11 +274,13 @@
command = "(echo '{' ; for j in %s ; do cat $j; echo ',' ; done ; echo \\\"\\\":\\\"\\\"; echo '}') > %s" % (" ".join([v.path for v in versions.to_list()]), out_versions.path),
)
- return struct(
- transitive_licenses = licenses,
- transitive_versions = versions,
- transitive_zipfiles = zips,
- )
+ return [
+ ComponentInfo(
+ transitive_licenses = licenses,
+ transitive_versions = versions,
+ transitive_zipfiles = zips,
+ ),
+ ]
bower_component_bundle = rule(
_bower_component_bundle_impl,
@@ -304,7 +308,7 @@
else:
bundled = ctx.outputs.html
destdir = ctx.outputs.html.path + ".dir"
- zips = [z for d in ctx.attr.deps for z in d.transitive_zipfiles.to_list()]
+ zips = [z for d in ctx.attr.deps for z in d[ComponentInfo].transitive_zipfiles.to_list()]
hermetic_npm_binary = " ".join([
"python",
@@ -404,7 +408,7 @@
),
"pkg": attr.string(mandatory = True),
"split": attr.bool(default = True),
- "deps": attr.label_list(providers = ["transitive_zipfiles"]),
+ "deps": attr.label_list(providers = [ComponentInfo]),
"_bundler_archive": attr.label(
default = Label("@polymer-bundler//:%s" % _npm_tarball("polymer-bundler")),
allow_single_file = True,