Merge changes I8b4cf63f,Id49ccf39
* changes:
GetChange: populate ChangeInfo.metaRevId with the NoteDb meta ref SHA1
ChangeData: use a Java type for RefState rather than byte[]
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index 677fc6d..49bc7e5 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -4211,8 +4211,10 @@
|`branches` |optional|
A list of branches that should be initially created. +
For the branch names the `refs/heads/` prefix can be omitted. +
-The first entry of the list will be the default branch (ie. the target +
-of the `HEAD` symbolic ref).
+The first entry of the list will be the default branch (ie. the target
+of the `HEAD` symbolic ref). +
+Branches in the Gerrit internal ref space are not allowed, such as
+refs/groups/, refs/changes/, etc...
|`owners` |optional|
A list of groups that should be assigned as project owner. +
Each group in the list must be specified as
diff --git a/Documentation/user-porting-comments.txt b/Documentation/user-porting-comments.txt
index b85e592..8b6c005 100644
--- a/Documentation/user-porting-comments.txt
+++ b/Documentation/user-porting-comments.txt
@@ -4,7 +4,7 @@
Comments in Gerrit are associated with a patchset. When a new patchset is uploaded, the comments are lost since they are not associated with the newer patchset.
-image::images/user-porting-comment-original-comment.png["Comment left on Patchset 15", align="center"]
+image::images/user-porting-comments-original-comment.png["Comment left on Patchset 15", align="center"]
To solve this issue, Gerrit now has “Ported Comments”. These are comments that were left on an older patchset displayed on all the newer patchsets uploaded. For example, a comment left on Patchset 6 will be ported over to Patchset 7, 8 and all subsequent patchsets that are uploaded, not just the latest patchset.
@@ -18,7 +18,7 @@
Resolved comments are not ported over.
-image::images/user-porting-comment-ported-comment.png["Comment ported over to patchset 16", align="center"]
+image::images/user-porting-comments-ported-comment.png["Comment ported over to patchset 16", align="center"]
## Interaction
diff --git a/java/com/google/gerrit/auth/BUILD b/java/com/google/gerrit/auth/BUILD
index a390e14..609ec8a 100644
--- a/java/com/google/gerrit/auth/BUILD
+++ b/java/com/google/gerrit/auth/BUILD
@@ -20,8 +20,6 @@
"//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
- "//java/com/google/gerrit/git",
- "//java/com/google/gerrit/jgit",
"//java/com/google/gerrit/proto",
"//java/com/google/gerrit/server",
"//java/com/google/gerrit/server/cache/serialize",
diff --git a/java/com/google/gerrit/common/data/testing/BUILD b/java/com/google/gerrit/common/data/testing/BUILD
index b9ec30b..d39d05c 100644
--- a/java/com/google/gerrit/common/data/testing/BUILD
+++ b/java/com/google/gerrit/common/data/testing/BUILD
@@ -6,7 +6,6 @@
srcs = glob(["**/*.java"]),
visibility = ["//visibility:public"],
deps = [
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//lib/truth",
],
diff --git a/java/com/google/gerrit/pgm/util/BUILD b/java/com/google/gerrit/pgm/util/BUILD
index f7c2b75..cfdd383 100644
--- a/java/com/google/gerrit/pgm/util/BUILD
+++ b/java/com/google/gerrit/pgm/util/BUILD
@@ -12,7 +12,6 @@
"//java/com/google/gerrit/metrics",
"//java/com/google/gerrit/metrics/dropwizard",
"//java/com/google/gerrit/server",
- "//java/com/google/gerrit/server/cache/h2",
"//java/com/google/gerrit/server/cache/mem",
"//java/com/google/gerrit/server/restapi",
"//java/com/google/gerrit/server/schema",
diff --git a/java/com/google/gerrit/server/BUILD b/java/com/google/gerrit/server/BUILD
index 69e398d..9fa7456 100644
--- a/java/com/google/gerrit/server/BUILD
+++ b/java/com/google/gerrit/server/BUILD
@@ -62,7 +62,6 @@
"//java/com/google/gerrit/server/util/git",
"//java/com/google/gerrit/server/util/time",
"//java/com/google/gerrit/util/cli",
- "//java/com/google/gerrit/util/ssl",
"//java/org/apache/commons/net",
"//lib:args4j",
"//lib:autolink",
@@ -144,7 +143,6 @@
visibility = ["//visibility:public"],
deps = [
":server",
- "//java/com/google/gerrit/auth",
"//java/com/google/gerrit/extensions:api",
"//java/com/google/gerrit/server/git/receive",
"//java/com/google/gerrit/server/logging",
diff --git a/java/com/google/gerrit/server/cache/serialize/entities/BUILD b/java/com/google/gerrit/server/cache/serialize/entities/BUILD
index cb8c4ae..55080e8 100644
--- a/java/com/google/gerrit/server/cache/serialize/entities/BUILD
+++ b/java/com/google/gerrit/server/cache/serialize/entities/BUILD
@@ -5,12 +5,8 @@
srcs = glob(["*.java"]),
visibility = ["//visibility:public"],
deps = [
- "//java/com/google/gerrit/common:annotations",
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
- "//java/com/google/gerrit/git",
- "//java/com/google/gerrit/proto",
"//java/com/google/gerrit/server/cache/serialize",
"//lib:guava",
"//lib:jgit",
diff --git a/java/com/google/gerrit/server/data/BUILD b/java/com/google/gerrit/server/data/BUILD
index c3dc672..1aaab96 100644
--- a/java/com/google/gerrit/server/data/BUILD
+++ b/java/com/google/gerrit/server/data/BUILD
@@ -9,7 +9,6 @@
deps = [
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
- "//java/org/apache/commons/net",
"//lib:gson",
],
)
diff --git a/java/com/google/gerrit/server/git/TagSet.java b/java/com/google/gerrit/server/git/TagSet.java
index 43483bf..d6220a2 100644
--- a/java/com/google/gerrit/server/git/TagSet.java
+++ b/java/com/google/gerrit/server/git/TagSet.java
@@ -16,9 +16,9 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.entities.Project;
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.server.cache.proto.Cache.TagSetHolderProto.TagSetProto;
@@ -37,6 +37,7 @@
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectIdOwnerMap;
import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevSort;
@@ -44,6 +45,12 @@
class TagSet {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+ private static final ImmutableSet<String> SKIPPABLE_REF_PREFIXES =
+ ImmutableSet.of(
+ RefNames.REFS_CHANGES,
+ RefNames.REFS_CACHE_AUTOMERGE,
+ RefNames.REFS_DRAFT_COMMENTS,
+ RefNames.REFS_STARRED_CHANGES);
private final Project.NameKey projectName;
private final Map<String, CachedRef> refs;
@@ -179,7 +186,9 @@
try (TagWalk rw = new TagWalk(git)) {
rw.setRetainBody(false);
- for (Ref ref : git.getRefDatabase().getRefs()) {
+ for (Ref ref :
+ git.getRefDatabase()
+ .getRefsByPrefixWithExclusions(RefDatabase.ALL, SKIPPABLE_REF_PREFIXES)) {
if (skip(ref)) {
continue;
@@ -365,9 +374,7 @@
static boolean skip(Ref ref) {
return ref.isSymbolic()
|| ref.getObjectId() == null
- || PatchSet.isChangeRef(ref.getName())
- || RefNames.isNoteDbMetaRef(ref.getName())
- || ref.getName().startsWith(RefNames.REFS_CACHE_AUTOMERGE);
+ || SKIPPABLE_REF_PREFIXES.stream().anyMatch(p -> ref.getName().startsWith(p));
}
private static boolean isTag(Ref ref) {
diff --git a/java/com/google/gerrit/server/group/testing/BUILD b/java/com/google/gerrit/server/group/testing/BUILD
index fd61dff..77bb777 100644
--- a/java/com/google/gerrit/server/group/testing/BUILD
+++ b/java/com/google/gerrit/server/group/testing/BUILD
@@ -7,7 +7,6 @@
testonly = True,
srcs = glob(["*.java"]),
deps = [
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/server",
"//lib:guava",
diff --git a/java/com/google/gerrit/server/mail/send/MailSoySauceProvider.java b/java/com/google/gerrit/server/mail/send/MailSoySauceProvider.java
index 1b58057..aade30f 100644
--- a/java/com/google/gerrit/server/mail/send/MailSoySauceProvider.java
+++ b/java/com/google/gerrit/server/mail/send/MailSoySauceProvider.java
@@ -113,6 +113,11 @@
private void addTemplate(SoyFileSet.Builder builder, String resourcePath, String name)
throws ProvisionException {
+ if (!resourcePath.endsWith("/")) {
+ resourcePath += "/";
+ }
+ String logicalPath = resourcePath + name;
+
// Load as a file in the mail templates directory if present.
Path tmpl = site.mail_dir.resolve(name);
if (Files.isRegularFile(tmpl)) {
@@ -125,14 +130,11 @@
throw new ProvisionException(
"Failed to read template file " + tmpl.toAbsolutePath().toString(), err);
}
- builder.add(content, tmpl.toAbsolutePath().toString());
+ builder.add(content, logicalPath);
return;
}
// Otherwise load the template as a resource.
- if (!resourcePath.endsWith("/")) {
- resourcePath += "/";
- }
- builder.add(Resources.getResource(resourcePath + name));
+ builder.add(Resources.getResource(logicalPath), logicalPath);
}
}
diff --git a/java/com/google/gerrit/server/project/testing/BUILD b/java/com/google/gerrit/server/project/testing/BUILD
index 3112b5a..ab75ec7 100644
--- a/java/com/google/gerrit/server/project/testing/BUILD
+++ b/java/com/google/gerrit/server/project/testing/BUILD
@@ -5,8 +5,5 @@
testonly = True,
srcs = glob(["*.java"]),
visibility = ["//visibility:public"],
- deps = [
- "//java/com/google/gerrit/common:server",
- "//java/com/google/gerrit/entities",
- ],
+ deps = ["//java/com/google/gerrit/entities"],
)
diff --git a/java/com/google/gerrit/server/restapi/BUILD b/java/com/google/gerrit/server/restapi/BUILD
index 3cb0796..6d3e222 100644
--- a/java/com/google/gerrit/server/restapi/BUILD
+++ b/java/com/google/gerrit/server/restapi/BUILD
@@ -8,7 +8,6 @@
name = "restapi",
srcs = glob(["**/*.java"]),
deps = [
- "//java/com/google/gerrit/auth",
"//java/com/google/gerrit/common:annotations",
"//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
@@ -19,13 +18,11 @@
"//java/com/google/gerrit/index:query_exception",
"//java/com/google/gerrit/index/project",
"//java/com/google/gerrit/json",
- "//java/com/google/gerrit/mail",
"//java/com/google/gerrit/metrics",
"//java/com/google/gerrit/server",
"//java/com/google/gerrit/server/ioutil",
"//java/com/google/gerrit/server/logging",
"//java/com/google/gerrit/server/util/time",
- "//java/com/google/gerrit/util/cli",
"//lib:args4j",
"//lib:blame-cache",
"//lib:gson",
diff --git a/java/com/google/gerrit/server/restapi/project/CreateProject.java b/java/com/google/gerrit/server/restapi/project/CreateProject.java
index a5a0034..faab241 100644
--- a/java/com/google/gerrit/server/restapi/project/CreateProject.java
+++ b/java/com/google/gerrit/server/restapi/project/CreateProject.java
@@ -208,4 +208,18 @@
}
return normalizedBranches;
}
+
+ static class ValidBranchListener implements ProjectCreationValidationListener {
+ @Override
+ public void validateNewProject(CreateProjectArgs args) throws ValidationException {
+ for (String branch : args.branch) {
+ if (RefNames.isGerritRef(branch)) {
+ throw new ValidationException(
+ String.format(
+ "Cannot create a project with branch %s. Branches in the Gerrit internal refs namespace are not allowed",
+ branch));
+ }
+ }
+ }
+ }
}
diff --git a/java/com/google/gerrit/server/restapi/project/Module.java b/java/com/google/gerrit/server/restapi/project/Module.java
index 517b888..9217077 100644
--- a/java/com/google/gerrit/server/restapi/project/Module.java
+++ b/java/com/google/gerrit/server/restapi/project/Module.java
@@ -29,6 +29,7 @@
import com.google.gerrit.server.config.GerritConfigListener;
import com.google.gerrit.server.project.RefValidationHelper;
import com.google.gerrit.server.restapi.change.CherryPickCommit;
+import com.google.gerrit.server.validators.ProjectCreationValidationListener;
public class Module extends RestApiModule {
@@ -47,6 +48,8 @@
DynamicMap.mapOf(binder(), LABEL_KIND);
DynamicSet.bind(binder(), GerritConfigListener.class).to(SetParent.class);
+ DynamicSet.bind(binder(), ProjectCreationValidationListener.class)
+ .to(CreateProject.ValidBranchListener.class);
create(PROJECT_KIND).to(CreateProject.class);
put(PROJECT_KIND).to(PutProject.class);
diff --git a/java/gerrit/BUILD b/java/gerrit/BUILD
index 7dbf751..db831b7 100644
--- a/java/gerrit/BUILD
+++ b/java/gerrit/BUILD
@@ -5,7 +5,6 @@
srcs = glob(["**/*.java"]),
visibility = ["//visibility:public"],
deps = [
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
"//java/com/google/gerrit/server",
diff --git a/javatests/com/google/gerrit/acceptance/git/BUILD b/javatests/com/google/gerrit/acceptance/git/BUILD
index ef54c92..13311e3 100644
--- a/javatests/com/google/gerrit/acceptance/git/BUILD
+++ b/javatests/com/google/gerrit/acceptance/git/BUILD
@@ -21,7 +21,6 @@
deps = [
"//java/com/google/gerrit/acceptance:lib",
"//java/com/google/gerrit/git",
- "//java/com/google/gerrit/mail",
],
)
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/BUILD b/javatests/com/google/gerrit/acceptance/rest/project/BUILD
index 5e1fc83..edcb1f9 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/BUILD
+++ b/javatests/com/google/gerrit/acceptance/rest/project/BUILD
@@ -20,7 +20,6 @@
"LabelAssert.java",
],
deps = [
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
"//java/com/google/gerrit/server",
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
index 10fd65f..e5c5952 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
@@ -53,6 +53,7 @@
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.server.group.SystemGroupBackend;
import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.validators.ValidationException;
import com.google.inject.Inject;
import java.util.Collections;
import java.util.Optional;
@@ -328,6 +329,21 @@
}
@Test
+ public void createProjectWithInvalidBranch() throws Exception {
+ String newProjectName = name("newProject");
+ ProjectInput in = new ProjectInput();
+ in.name = newProjectName;
+ in.createEmptyCommit = true;
+ in.branches = ImmutableList.of("refs/heads/test", "refs/changes/34/1234");
+ Throwable thrown =
+ assertThrows(ResourceConflictException.class, () -> gApi.projects().create(in));
+ assertThat(thrown).hasCauseThat().isInstanceOf(ValidationException.class);
+ assertThat(thrown)
+ .hasMessageThat()
+ .contains("Cannot create a project with branch refs/changes/34/1234");
+ }
+
+ @Test
public void createProjectWithCapability() throws Exception {
projectOperations
.allProjectsForUpdate()
diff --git a/javatests/com/google/gerrit/acceptance/server/change/BUILD b/javatests/com/google/gerrit/acceptance/server/change/BUILD
index e41178f..19ca946 100644
--- a/javatests/com/google/gerrit/acceptance/server/change/BUILD
+++ b/javatests/com/google/gerrit/acceptance/server/change/BUILD
@@ -18,8 +18,6 @@
"//java/com/google/gerrit/acceptance:lib",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
- "//java/com/google/gerrit/server/logging",
- "//java/com/google/gerrit/server/util/time",
"@guava//jar",
],
)
diff --git a/javatests/com/google/gerrit/auth/BUILD b/javatests/com/google/gerrit/auth/BUILD
index d4bb16d..6a41d01 100644
--- a/javatests/com/google/gerrit/auth/BUILD
+++ b/javatests/com/google/gerrit/auth/BUILD
@@ -17,16 +17,13 @@
"//prolog:gerrit-prolog-common",
],
deps = [
- "//java/com/google/gerrit/acceptance/testsuite/project",
"//java/com/google/gerrit/auth",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
"//java/com/google/gerrit/proto/testing",
"//java/com/google/gerrit/server",
"//java/com/google/gerrit/server/cache/serialize",
- "//java/com/google/gerrit/server/cache/testing",
"//java/com/google/gerrit/testing:gerrit-test-util",
- "//java/com/google/gerrit/truth",
"//lib:guava",
"//lib:guava-retrying",
"//lib:jgit",
diff --git a/javatests/com/google/gerrit/server/cache/serialize/BUILD b/javatests/com/google/gerrit/server/cache/serialize/BUILD
index 6976d19..fa6a717 100644
--- a/javatests/com/google/gerrit/server/cache/serialize/BUILD
+++ b/javatests/com/google/gerrit/server/cache/serialize/BUILD
@@ -5,7 +5,6 @@
srcs = glob(["*.java"]),
deps = [
"//java/com/google/gerrit/entities",
- "//java/com/google/gerrit/extensions:api",
"//java/com/google/gerrit/server",
"//java/com/google/gerrit/server/cache/serialize",
"//java/com/google/gerrit/server/cache/testing",
diff --git a/javatests/com/google/gerrit/server/cache/serialize/entities/BUILD b/javatests/com/google/gerrit/server/cache/serialize/entities/BUILD
index b84febb..a8158fc 100644
--- a/javatests/com/google/gerrit/server/cache/serialize/entities/BUILD
+++ b/javatests/com/google/gerrit/server/cache/serialize/entities/BUILD
@@ -4,14 +4,10 @@
name = "tests",
srcs = glob(["*.java"]),
deps = [
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
"//java/com/google/gerrit/server",
- "//java/com/google/gerrit/server/cache/serialize",
"//java/com/google/gerrit/server/cache/serialize/entities",
- "//java/com/google/gerrit/server/cache/testing",
- "//java/com/google/gerrit/testing:gerrit-test-util",
"//lib:guava",
"//lib:jgit",
"//lib:protobuf",
diff --git a/javatests/com/google/gerrit/server/group/db/BUILD b/javatests/com/google/gerrit/server/group/db/BUILD
index 3303338..9f9f459 100644
--- a/javatests/com/google/gerrit/server/group/db/BUILD
+++ b/javatests/com/google/gerrit/server/group/db/BUILD
@@ -6,7 +6,6 @@
srcs = glob(["*.java"]),
deps = [
"//java/com/google/gerrit/common:annotations",
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/common/data/testing:common-data-test-util",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/exceptions",
diff --git a/javatests/com/google/gerrit/server/query/change/BUILD b/javatests/com/google/gerrit/server/query/change/BUILD
index 0258e5d..43b9690 100644
--- a/javatests/com/google/gerrit/server/query/change/BUILD
+++ b/javatests/com/google/gerrit/server/query/change/BUILD
@@ -19,7 +19,6 @@
"//java/com/google/gerrit/acceptance/config",
"//java/com/google/gerrit/acceptance/testsuite/project",
"//java/com/google/gerrit/common:annotations",
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
"//java/com/google/gerrit/httpd",
diff --git a/javatests/com/google/gerrit/server/rules/BUILD b/javatests/com/google/gerrit/server/rules/BUILD
index 250b0ce..5c57ede 100644
--- a/javatests/com/google/gerrit/server/rules/BUILD
+++ b/javatests/com/google/gerrit/server/rules/BUILD
@@ -7,7 +7,6 @@
resources = ["//prologtests:gerrit_common_test"],
runtime_deps = ["//prolog:gerrit-prolog-common"],
deps = [
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/server",
"//java/com/google/gerrit/server/project/testing:project-test-util",
diff --git a/javatests/com/google/gerrit/server/update/BUILD b/javatests/com/google/gerrit/server/update/BUILD
index e175b95..4fe4ab04 100644
--- a/javatests/com/google/gerrit/server/update/BUILD
+++ b/javatests/com/google/gerrit/server/update/BUILD
@@ -10,7 +10,6 @@
],
deps = [
"//java/com/google/gerrit/common:annotations",
- "//java/com/google/gerrit/common:server",
"//java/com/google/gerrit/entities",
"//java/com/google/gerrit/extensions:api",
"//java/com/google/gerrit/server",
diff --git a/plugins/singleusergroup b/plugins/singleusergroup
index 3548ec8..09623b9 160000
--- a/plugins/singleusergroup
+++ b/plugins/singleusergroup
@@ -1 +1 @@
-Subproject commit 3548ec83c0c271a8768a6b03b0c28711521ed6cf
+Subproject commit 09623b9432d360060f88ae48fb3386e374ca29c0
diff --git a/polygerrit-ui/app/api/diff.ts b/polygerrit-ui/app/api/diff.ts
index 5d7125c..7ee68b7 100644
--- a/polygerrit-ui/app/api/diff.ts
+++ b/polygerrit-ui/app/api/diff.ts
@@ -178,6 +178,11 @@
theme?: string;
}
+export declare interface RenderPreferences {
+ hide_left_side?: boolean;
+ disable_context_control_buttons?: boolean;
+}
+
/**
* Whether whitespace changes should be ignored and if yes, which whitespace
* changes should be ignored
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_html.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_html.ts
index 81aff90..7fd985a 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_html.ts
@@ -105,7 +105,7 @@
font-size: var(--font-size-mono);
line-height: var(--line-height-mono);
margin-right: var(--spacing-l);
- margin-bottom: var(--spacing-l);
+ margin-bottom: var(--spacing-s);
/* Account for border and padding and rounding errors. */
max-width: calc(72ch + 2px + 2 * var(--spacing-m) + 0.4px);
}
@@ -548,6 +548,7 @@
<gr-related-changes-list-experimental
change="[[_change]]"
id="relatedChangesExperimental"
+ patch-num="[[_computeLatestPatchNum(_allPatchSets)]]"
></gr-related-changes-list-experimental>
</template>
<template is="dom-if" if="[[!_isNewChangeSummaryUiEnabled]]">
@@ -681,6 +682,7 @@
logged-in="[[_loggedIn]]"
only-show-robot-comments-with-human-reply=""
unresolved-only
+ show-comment-context
></gr-thread-list>
</template>
<template
diff --git a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts
index 7af9d66..a966186 100644
--- a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts
+++ b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts
@@ -95,9 +95,11 @@
numberValue?: number
): string {
const detailedInfo = labels[labelName] as DetailedLabelInfo;
- for (const labelValue of Object.keys(detailedInfo.values)) {
- if (Number(labelValue) === numberValue) {
- return labelValue;
+ if (detailedInfo.values) {
+ for (const labelValue of Object.keys(detailedInfo.values)) {
+ if (Number(labelValue) === numberValue) {
+ return labelValue;
+ }
}
}
const stringVal = `${numberValue}`;
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts b/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
index 6515af0..0409a42 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
@@ -259,6 +259,7 @@
change-num="[[changeNum]]"
logged-in="[[_loggedIn]]"
hide-toggle-buttons
+ show-comment-context
>
</gr-thread-list>
</template>
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-change.ts b/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-change.ts
new file mode 100644
index 0000000..3ed545e
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-change.ts
@@ -0,0 +1,197 @@
+/**
+ * @license
+ * Copyright (C) 2021 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.
+ */
+import {html} from 'lit-html';
+import {GrLitElement} from '../../lit/gr-lit-element';
+import {customElement, property, css} from 'lit-element';
+import {sharedStyles} from '../../../styles/shared-styles';
+import {
+ ChangeInfo,
+ RelatedChangeAndCommitInfo,
+ CommitId,
+} from '../../../types/common';
+import {ChangeStatus} from '../../../constants/constants';
+import {isChangeInfo} from '../../../utils/change-util';
+
+@customElement('gr-related-change')
+export class GrRelatedChange extends GrLitElement {
+ @property()
+ change?: ChangeInfo | RelatedChangeAndCommitInfo;
+
+ @property()
+ href?: string;
+
+ @property()
+ isCurrentChange = false;
+
+ @property()
+ showSubmittableCheck = false;
+
+ @property()
+ showChangeStatus = false;
+
+ /*
+ * Needed for calculation if change is direct or indirect ancestor/descendant
+ * to current change.
+ */
+ @property()
+ connectedRevisions?: CommitId[];
+
+ static get styles() {
+ return [
+ sharedStyles,
+ css`
+ a {
+ display: block;
+ }
+ .changeContainer,
+ a {
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .changeContainer {
+ display: flex;
+ }
+ .strikethrough {
+ color: var(--deemphasized-text-color);
+ text-decoration: line-through;
+ }
+ .status {
+ color: var(--deemphasized-text-color);
+ font-weight: var(--font-weight-bold);
+ margin-left: var(--spacing-xs);
+ }
+ .notCurrent {
+ color: #e65100;
+ }
+ .indirectAncestor {
+ color: #33691e;
+ }
+ .submittableCheck {
+ padding-left: var(--spacing-s);
+ color: var(--positive-green-text-color);
+ display: none;
+ }
+ .submittableCheck.submittable {
+ display: inline;
+ }
+ .hidden,
+ .mobile {
+ display: none;
+ }
+ .submittableCheck {
+ padding-left: var(--spacing-s);
+ color: var(--positive-green-text-color);
+ display: none;
+ }
+ .submittableCheck.submittable {
+ display: inline;
+ }
+ .arrowToCurrentChange {
+ position: absolute;
+ }
+ `,
+ ];
+ }
+
+ render() {
+ const change = this.change;
+ if (!change) throw new Error('Missing change');
+ const linkClass = this._computeLinkClass(change);
+ return html`<span
+ role="img"
+ class="arrowToCurrentChange"
+ aria-label="Arrow marking current change"
+ ?hidden=${!this.isCurrentChange}
+ >➔</span
+ >
+ <div class="changeContainer">
+ <a href="${this.href}" class="${linkClass}"><slot></slot></a>
+ ${this.showSubmittableCheck
+ ? html`<span
+ tabindex="-1"
+ title="Submittable"
+ class="submittableCheck ${linkClass}"
+ role="img"
+ aria-label="Submittable"
+ >✓</span
+ >`
+ : ''}
+ ${this.showChangeStatus && !isChangeInfo(change)
+ ? html`<span class="${this._computeChangeStatusClass(change)}">
+ (${this._computeChangeStatus(change)})
+ </span>`
+ : ''}
+ </div> `;
+ }
+
+ _computeLinkClass(change: ChangeInfo | RelatedChangeAndCommitInfo) {
+ const statuses = [];
+ if (change.status === ChangeStatus.ABANDONED) {
+ statuses.push('strikethrough');
+ }
+ if (change.submittable) {
+ statuses.push('submittable');
+ }
+ return statuses.join(' ');
+ }
+
+ _computeChangeStatusClass(change: RelatedChangeAndCommitInfo) {
+ const classes = ['status'];
+ if (change._revision_number !== change._current_revision_number) {
+ classes.push('notCurrent');
+ } else if (this._isIndirectAncestor(change)) {
+ classes.push('indirectAncestor');
+ } else if (change.submittable) {
+ classes.push('submittable');
+ } else if (change.status === ChangeStatus.NEW) {
+ classes.push('hidden');
+ }
+ return classes.join(' ');
+ }
+
+ _computeChangeStatus(change: RelatedChangeAndCommitInfo) {
+ switch (change.status) {
+ case ChangeStatus.MERGED:
+ return 'Merged';
+ case ChangeStatus.ABANDONED:
+ return 'Abandoned';
+ }
+ if (change._revision_number !== change._current_revision_number) {
+ return 'Not current';
+ } else if (this._isIndirectAncestor(change)) {
+ return 'Indirect ancestor';
+ } else if (change.submittable) {
+ return 'Submittable';
+ }
+ return '';
+ }
+
+ _isIndirectAncestor(change: RelatedChangeAndCommitInfo) {
+ return (
+ this.connectedRevisions &&
+ !this.connectedRevisions.includes(change.commit.commit)
+ );
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'gr-related-change': GrRelatedChange;
+ }
+}
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-changes-list-experimental.ts b/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-changes-list-experimental.ts
index 5134b72..be48038 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-changes-list-experimental.ts
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-changes-list-experimental.ts
@@ -15,6 +15,7 @@
* limitations under the License.
*/
import {html, nothing} from 'lit-html';
+import './gr-related-change';
import {classMap} from 'lit-html/directives/class-map';
import {GrLitElement} from '../../lit/gr-lit-element';
import {customElement, property, css} from 'lit-element';
@@ -23,18 +24,15 @@
SubmittedTogetherInfo,
ChangeInfo,
RelatedChangeAndCommitInfo,
+ RelatedChangesInfo,
+ PatchSetNum,
+ CommitId,
} from '../../../types/common';
import {appContext} from '../../../services/app-context';
import {ParsedChangeInfo} from '../../../types/types';
import {GerritNav} from '../../core/gr-navigation/gr-navigation';
import {pluralize} from '../../../utils/string-util';
-import {ChangeStatus} from '../../../constants/constants';
-
-function isChangeInfo(
- x: ChangeInfo | RelatedChangeAndCommitInfo | ParsedChangeInfo
-): x is ChangeInfo | ParsedChangeInfo {
- return (x as ChangeInfo)._number !== undefined;
-}
+import {getRevisionKey, isChangeInfo} from '../../../utils/change-util';
/** What is the maximum number of shown changes in collapsed list? */
const MAX_CHANGES_WHEN_COLLAPSED = 3;
@@ -44,12 +42,18 @@
@property()
change?: ParsedChangeInfo;
+ @property({type: String})
+ patchNum?: PatchSetNum;
+
@property()
_submittedTogether?: SubmittedTogetherInfo = {
changes: [],
non_visible_changes: 0,
};
+ @property()
+ _relatedResponse?: RelatedChangesInfo = {changes: []};
+
private readonly restApiService = appContext.restApiService;
static get styles() {
@@ -81,16 +85,57 @@
}
render() {
+ const relatedChanges = this._relatedResponse?.changes ?? [];
+ let showWhenCollapsedPredicate = this.showWhenCollapsedPredicateFactory(
+ relatedChanges.length,
+ relatedChanges.findIndex(relatedChange =>
+ this._changesEqual(relatedChange, this.change)
+ )
+ );
+ const connectedRevisions = this._computeConnectedRevisions(
+ this.change,
+ this.patchNum,
+ relatedChanges
+ );
+ const relatedChangeSection = html` <section
+ class="relatedChanges"
+ ?hidden=${!relatedChanges.length}
+ >
+ <h4 class="title">Relation chain</h4>
+ <gr-related-collapse .length=${relatedChanges.length}>
+ ${relatedChanges.map(
+ (change, index) =>
+ html`<gr-related-change
+ class="${classMap({
+ ['show-when-collapsed']: showWhenCollapsedPredicate(index),
+ })}"
+ .isCurrentChange="${this._changesEqual(change, this.change)}"
+ .change="${change}"
+ .connectedRevisions="${connectedRevisions}"
+ .href="${change?._change_number
+ ? GerritNav.getUrlForChangeById(
+ change._change_number,
+ change.project,
+ change._revision_number as PatchSetNum
+ )
+ : ''}"
+ .showChangeStatus=${true}
+ >${change.commit.subject}</gr-related-change
+ >`
+ )}
+ </gr-related-collapse>
+ </section>`;
+
const submittedTogetherChanges = this._submittedTogether?.changes ?? [];
const countNonVisibleChanges =
this._submittedTogether?.non_visible_changes ?? 0;
- const showWhenCollapsedPredicate = this.showWhenCollapsedPredicateFactory(
+ showWhenCollapsedPredicate = this.showWhenCollapsedPredicateFactory(
submittedTogetherChanges.length,
submittedTogetherChanges.findIndex(relatedChange =>
this._changesEqual(relatedChange, this.change)
)
);
- return html` <section
+ const submittedTogetherSection = html`<section
id="submittedTogether"
?hidden=${!submittedTogetherChanges?.length &&
!this._submittedTogether?.non_visible_changes}
@@ -98,20 +143,29 @@
<h4 class="title">Submitted together</h4>
<gr-related-collapse .length=${submittedTogetherChanges.length}>
${submittedTogetherChanges.map(
- (relatedChange, index) =>
+ (change, index) =>
html`<gr-related-change
class="${classMap({
['show-when-collapsed']: showWhenCollapsedPredicate(index),
})}"
- .currentChange="${this._changesEqual(relatedChange, this.change)}"
- .change="${relatedChange}"
- ></gr-related-change>`
+ .currentChange="${this._changesEqual(change, this.change)}"
+ .change="${change}"
+ .href="${GerritNav.getUrlForChangeById(
+ change._number,
+ change.project
+ )}"
+ .showSubmittableCheck=${true}
+ >${change.project}: ${change.branch}:
+ ${change.subject}</gr-related-change
+ >`
)}
</gr-related-collapse>
<div class="note" ?hidden=${!countNonVisibleChanges}>
(+ ${pluralize(countNonVisibleChanges, 'non-visible change')})
</div>
</section>`;
+
+ return html`${relatedChangeSection}${submittedTogetherSection}`;
}
showWhenCollapsedPredicateFactory(length: number, highlightIndex: number) {
@@ -128,11 +182,24 @@
reload() {
if (!this.change) return Promise.reject(new Error('change missing'));
- return this.restApiService
- .getChangesSubmittedTogether(this.change._number)
- .then(response => {
- this._submittedTogether = response;
- });
+ if (!this.patchNum) return Promise.reject(new Error('patchNum missing'));
+ const promises: Array<Promise<void>> = [
+ this.restApiService
+ .getRelatedChanges(this.change._number, this.patchNum)
+ .then(response => {
+ if (!response) {
+ throw new Error('getRelatedChanges returned undefined response');
+ }
+ this._relatedResponse = response;
+ }),
+ this.restApiService
+ .getChangesSubmittedTogether(this.change._number)
+ .then(response => {
+ this._submittedTogether = response;
+ }),
+ ];
+
+ return Promise.all(promises);
}
/**
@@ -165,6 +232,46 @@
}
return change._change_number;
}
+
+ /*
+ * A list of commit ids connected to change to understand if other change
+ * is direct or indirect ancestor / descendant.
+ */
+ _computeConnectedRevisions(
+ change?: ParsedChangeInfo,
+ patchNum?: PatchSetNum,
+ relatedChanges?: RelatedChangeAndCommitInfo[]
+ ) {
+ if (!patchNum || !relatedChanges || !change) {
+ return [];
+ }
+
+ const connected: CommitId[] = [];
+ const changeRevision = getRevisionKey(change, patchNum);
+ const commits = relatedChanges.map(c => c.commit);
+ let pos = commits.length - 1;
+
+ while (pos >= 0) {
+ const commit: CommitId = commits[pos].commit;
+ connected.push(commit);
+ // TODO(TS): Ensure that both (commit and changeRevision) are string and use === instead
+ // eslint-disable-next-line eqeqeq
+ if (commit == changeRevision) {
+ break;
+ }
+ pos--;
+ }
+ while (pos >= 0) {
+ for (let i = 0; i < commits[pos].parents.length; i++) {
+ if (connected.includes(commits[pos].parents[i].commit)) {
+ connected.push(commits[pos].commit);
+ break;
+ }
+ }
+ --pos;
+ }
+ return connected;
+ }
}
@customElement('gr-related-collapse')
@@ -229,97 +336,9 @@
}
}
-@customElement('gr-related-change')
-export class GrRelatedChange extends GrLitElement {
- @property()
- change?: ChangeInfo;
-
- @property()
- currentChange = false;
-
- static get styles() {
- return [
- sharedStyles,
- css`
- a {
- display: block;
- }
- .changeContainer,
- a {
- max-width: 100%;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- .changeContainer {
- display: flex;
- }
- .strikethrough {
- color: var(--deemphasized-text-color);
- text-decoration: line-through;
- }
- .submittableCheck {
- padding-left: var(--spacing-s);
- color: var(--positive-green-text-color);
- display: none;
- }
- .submittableCheck.submittable {
- display: inline;
- }
- .arrowToCurrentChange {
- position: absolute;
- }
- `,
- ];
- }
-
- render() {
- const change = this.change;
- if (!change) throw new Error('Missing change');
- const linkClass = this._computeLinkClass(change);
- return html`<span
- role="img"
- class="arrowToCurrentChange"
- aria-label="Arrow marking current change"
- ?hidden=${!this.currentChange}
- >➔</span
- >
- <div class="changeContainer">
- <a
- href="${GerritNav.getUrlForChangeById(
- change._number,
- change.project
- )}"
- class="${linkClass}"
- >${change.project}: ${change.branch}: ${change.subject}</a
- >
- <span
- tabindex="-1"
- title="Submittable"
- class="submittableCheck ${linkClass}"
- role="img"
- aria-label="Submittable"
- >✓</span
- >
- </div> `;
- }
-
- _computeLinkClass(change: ChangeInfo) {
- const statuses = [];
- if (change.status === ChangeStatus.ABANDONED) {
- statuses.push('strikethrough');
- }
- if (change.submittable) {
- statuses.push('submittable');
- }
- return statuses.join(' ');
- }
-}
-
declare global {
interface HTMLElementTagNameMap {
'gr-related-changes-list-experimental': GrRelatedChangesListExperimental;
'gr-related-collapse': GrRelatedCollapse;
- 'gr-related-change': GrRelatedChange;
}
}
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.ts b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.ts
index 4ad99d5..b4b6d31 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.ts
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.ts
@@ -26,7 +26,11 @@
import {GerritNav} from '../../core/gr-navigation/gr-navigation';
import {ChangeStatus} from '../../../constants/constants';
-import {changeIsOpen, getRevisionKey} from '../../../utils/change-util';
+import {
+ changeIsOpen,
+ getRevisionKey,
+ isChangeInfo,
+} from '../../../utils/change-util';
import {getPluginEndpoints} from '../../shared/gr-js-api-interface/gr-plugin-endpoints';
import {customElement, observe, property} from '@polymer/decorators';
import {
@@ -48,12 +52,6 @@
return {changes: [], non_visible_changes: 0};
}
-function isChangeInfo(
- x: ChangeInfo | RelatedChangeAndCommitInfo
-): x is ChangeInfo {
- return (x as ChangeInfo)._number !== undefined;
-}
-
@customElement('gr-related-changes-list')
export class GrRelatedChangesList extends GestureEventListeners(
LegacyElementMixin(PolymerElement)
@@ -113,6 +111,8 @@
private readonly restApiService = appContext.restApiService;
+ private readonly reportingService = appContext.reportingService;
+
clear() {
this.loading = true;
this.hidden = true;
@@ -440,6 +440,25 @@
_computeNonVisibleChangesNote(n: number) {
return `(+ ${pluralize(n, 'non-visible change')})`;
}
+
+ // TODO(milutin): Temporary for data collection, remove when data collected
+ _reportClick(e: Event) {
+ const target = e.target as HTMLAnchorElement | undefined;
+ const section = target?.parentElement?.parentElement;
+ const sectionName = section?.getElementsByTagName('h4')[0]?.innerText;
+ const sectionLinks = [...(section?.getElementsByTagName('a') ?? [])];
+ const currentChange = section
+ ?.getElementsByClassName('arrowToCurrentChange')[0]
+ ?.nextElementSibling?.nextElementSibling?.getElementsByTagName('a')[0];
+
+ if (!target || !currentChange) return;
+ this.reportingService.reportInteraction('related-change-click', {
+ sectionName,
+ index: sectionLinks.indexOf(target) + 1,
+ countChanges: sectionLinks.length,
+ currentChangeIndex: sectionLinks.indexOf(currentChange) + 1,
+ });
+ }
}
declare global {
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_html.ts b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_html.ts
index 0f42028..8cb0638 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_html.ts
@@ -117,6 +117,7 @@
href$="[[_computeChangeURL(related._change_number, related.project, related._revision_number)]]"
class$="[[_computeLinkClass(related)]]"
title$="[[related.commit.subject]]"
+ on-click="_reportClick"
>
[[related.commit.subject]]
</a>
@@ -149,6 +150,7 @@
href$="[[_computeChangeURL(related._number, related.project)]]"
class$="[[_computeLinkClass(related)]]"
title$="[[related.project]]: [[related.branch]]: [[related.subject]]"
+ on-click="_reportClick"
>
[[related.project]]: [[related.branch]]: [[related.subject]]
</a>
@@ -176,6 +178,7 @@
href$="[[_computeChangeURL(change._number, change.project)]]"
class$="[[_computeLinkClass(change)]]"
title$="[[change.project]]: [[change.branch]]: [[change.subject]]"
+ on-click="_reportClick"
>
[[change.project]]: [[change.branch]]: [[change.subject]]
</a>
@@ -204,6 +207,7 @@
href$="[[_computeChangeURL(change._number, change.project)]]"
class$="[[_computeLinkClass(change)]]"
title$="[[change.branch]]: [[change.subject]]"
+ on-click="_reportClick"
>
[[change.branch]]: [[change.subject]]
</a>
diff --git a/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.ts b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.ts
index 22b2e43..28bccc6 100644
--- a/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.ts
+++ b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.ts
@@ -77,6 +77,9 @@
@property({type: Array})
_sortedThreads: CommentThread[] = [];
+ @property({type: Boolean})
+ showCommentContext = false;
+
@property({
computed:
'_computeDisplayedThreads(_sortedThreads.*, unresolvedOnly, ' +
diff --git a/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list_html.ts b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list_html.ts
index 8a52555..1be2da1 100644
--- a/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list_html.ts
@@ -25,7 +25,6 @@
gr-comment-thread {
display: block;
margin-bottom: var(--spacing-m);
- max-width: 80ch;
}
.header {
align-items: center;
@@ -172,6 +171,7 @@
<gr-comment-thread
show-file-path=""
show-ported-comment="[[thread.ported]]"
+ show-comment-context="[[showCommentContext]]"
change-num="[[changeNum]]"
comments="[[thread.comments]]"
diff-side="[[thread.diffSide]]"
diff --git a/polygerrit-ui/app/elements/checks/gr-checks-results.ts b/polygerrit-ui/app/elements/checks/gr-checks-results.ts
index 68ff67b..bc72b2a 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-results.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-results.ts
@@ -86,9 +86,9 @@
flex-shrink: 1;
overflow: hidden;
text-overflow: ellipsis;
+ margin-right: var(--spacing-s);
}
td .summary-cell .message {
- margin-left: var(--spacing-s);
flex-grow: 1;
/* Looks a bit stupid, but the idea is that .message shrinks first,
and only when that has shrunken to 0, then .summary should also
@@ -119,7 +119,7 @@
update(changedProperties: PropertyValues) {
if (changedProperties.has('result')) {
- this.isExpandable = !!this.result?.message;
+ this.isExpandable = !!this.result?.summary && !!this.result?.message;
}
super.update(changedProperties);
}
@@ -137,9 +137,7 @@
<td class="summaryCol">
<div class="summary-cell">
${(this.result.links ?? []).map(this.renderLink)}
- <!-- The is for being able to shrink a tiny amount without
- the text itself getting shrunk with an ellipsis. -->
- <div class="summary">${this.result.summary} </div>
+ ${this.renderSummary(this.result.summary)}
<div class="message">
${this.isExpanded ? '' : this.result.message}
</div>
@@ -163,7 +161,6 @@
aria-label="${this.isExpanded
? 'Collapse result row'
: 'Expand result row'}"
- @click="${this.toggleExpanded}"
@keydown="${this.toggleExpanded}"
>
<iron-icon
@@ -182,6 +179,15 @@
this.isExpanded = !this.isExpanded;
}
+ renderSummary(text?: string) {
+ if (!text) return;
+ return html`
+ <!-- The is for being able to shrink a tiny amount without
+ the text itself getting shrunk with an ellipsis. -->
+ <div class="summary">${text} </div>
+ `;
+ }
+
renderLink(link: Link) {
return html`
<a href="${link.url}" target="_blank">
@@ -250,7 +256,7 @@
padding: var(--spacing-xl);
}
.categoryHeader {
- margin-top: var(--spacing-xxl);
+ margin-top: var(--spacing-l);
margin-left: var(--spacing-l);
text-transform: capitalize;
}
@@ -360,7 +366,8 @@
renderSuccessfulRun(run: CheckRun) {
const adaptedRun: RunResult = {
category: Category.INFO, // will not be used, but is required
- summary: run.statusDescription ?? 'Completed without results.',
+ summary: run.statusDescription ?? '',
+ message: 'Completed without results.',
...run,
};
return html`<gr-result-row .result="${adaptedRun}"></gr-result-row>`;
diff --git a/polygerrit-ui/app/elements/checks/gr-checks-runs.ts b/polygerrit-ui/app/elements/checks/gr-checks-runs.ts
index 09a2319..4a34700 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-runs.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-runs.ts
@@ -104,7 +104,7 @@
border-radius: var(--border-radius);
padding: var(--spacing-s) var(--spacing-m);
margin-top: var(--spacing-s);
- cursor: default;
+ cursor: pointer;
}
.name {
font-weight: var(--font-weight-bold);
diff --git a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.ts b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.ts
index 468c8ca..19f43c2 100644
--- a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.ts
+++ b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.ts
@@ -594,6 +594,8 @@
export const _testOnly_findCommentById =
ChangeComments.prototype.findCommentById;
+export const _testOnly_getCommentsForPath =
+ ChangeComments.prototype.getCommentsForPath;
@customElement('gr-comment-api')
export class GrCommentApi extends GestureEventListeners(
LegacyElementMixin(PolymerElement)
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.ts b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.ts
index 035c1a3..5ac37dc 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.ts
@@ -235,7 +235,11 @@
return result;
}
- moveToNextCommentThread(): CursorMoveResult {
+ moveToNextCommentThread(): CursorMoveResult | undefined {
+ if (this.isAtEnd()) {
+ fireEvent(this, 'navigate-to-next-file-with-comments');
+ return;
+ }
const result = this.$.cursorManager.next({
filter: (row: HTMLElement) => this._rowHasThread(row),
});
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
index 62b34e9..1550108 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
@@ -711,7 +711,12 @@
);
}
- _navToFile(path: string, fileList: string[], direction: -1 | 1) {
+ _navToFile(
+ path: string,
+ fileList: string[],
+ direction: -1 | 1,
+ navigateToFirstComment?: boolean
+ ) {
const newPath = this._getNavLinkPath(path, fileList, direction);
if (!newPath) return;
if (!this._change) return;
@@ -727,11 +732,18 @@
}
if (!newPath.path) return;
+ let lineNum;
+ if (navigateToFirstComment)
+ lineNum = this._changeComments?.getCommentsForPath(
+ newPath.path,
+ this._patchRange
+ )?.[0].line;
GerritNav.navigateToDiff(
this._change,
newPath.path,
this._patchRange.patchNum,
- this._patchRange.basePatchNum
+ this._patchRange.basePatchNum,
+ lineNum
);
}
@@ -1757,6 +1769,23 @@
this._navToFile(this._path, unreviewedFiles, 1);
}
+ _navigateToNextFileWithCommentThread() {
+ if (!this._path) return;
+ if (!this._fileList) return;
+ if (!this._patchRange) return;
+ if (!this._change) return;
+ const hasComment = (path: string) => {
+ return (
+ this._changeComments?.getCommentsForPath(path, this._patchRange!)
+ ?.length ?? 0 > 0
+ );
+ };
+ const filesWithComments = this._fileList.filter(
+ file => file === this._path || hasComment(file)
+ );
+ this._navToFile(this._path, filesWithComments, 1, true);
+ }
+
_handleReloadingDiffPreference() {
this._getDiffPreferences();
}
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_html.ts b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_html.ts
index a00927c..bfb0cd8 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_html.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_html.ts
@@ -428,6 +428,7 @@
<gr-diff-cursor
id="cursor"
on-navigate-to-next-unreviewed-file="_handleNextUnreviewedFile"
+ on-navigate-to-next-file-with-comments="_navigateToNextFileWithCommentThread"
></gr-diff-cursor>
<gr-comment-api id="commentAPI"></gr-comment-api>
`;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
index 34e74b6..46a670d 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
@@ -21,7 +21,7 @@
import {ChangeStatus} from '../../../constants/constants.js';
import {TestKeyboardShortcutBinder} from '../../../test/test-utils.js';
import {Shortcut} from '../../../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin.js';
-import {_testOnly_findCommentById} from '../gr-comment-api/gr-comment-api.js';
+import {ChangeComments, _testOnly_findCommentById, _testOnly_getCommentsForPath} from '../gr-comment-api/gr-comment-api.js';
import {GerritView} from '../../../services/router/router-model.js';
import {
createChange,
@@ -137,6 +137,7 @@
computeUnresolvedNum: () => {},
getPaths: () => {},
getThreadsBySideForFile: () => [],
+ getCommentsForPath: _testOnly_getCommentsForPath,
findCommentById: _testOnly_findCommentById,
}));
@@ -465,6 +466,48 @@
assert.equal(element._setReviewed.lastCall.args[0], true);
});
+ test('moveToNextCommentThread navigates to next file', () => {
+ const diffNavStub = sinon.stub(GerritNav, 'navigateToDiff');
+ const diffChangeStub = sinon.stub(element, '_navigateToChange');
+ sinon.stub(element.$.cursor, 'isAtEnd').returns(true);
+ element._changeNum = '42';
+ const comment = {
+ 'wheatley.md': [{
+ ...createComment(),
+ patch_set: 10,
+ line: 21,
+ }],
+ };
+ element._changeComments = new ChangeComments(comment);
+ element._patchRange = {
+ basePatchNum: PARENT,
+ patchNum: 10,
+ };
+ element._change = {
+ _number: 42,
+ revisions: {
+ a: {_number: 10, commit: {parents: []}},
+ },
+ };
+ element._files = getFilesFromFileList(
+ ['chell.go', 'glados.txt', 'wheatley.md']);
+ element._path = 'glados.txt';
+ element.changeViewState.selectedFileIndex = 1;
+ element._loggedIn = true;
+
+ MockInteractions.pressAndReleaseKeyOn(element, 78, 'shift', 'n');
+ flush();
+ assert.isTrue(diffNavStub.calledWithExactly(
+ element._change, 'wheatley.md', 10, PARENT, 21));
+
+ element._path = 'wheatley.md'; // navigated to next file
+
+ MockInteractions.pressAndReleaseKeyOn(element, 78, 'shift', 'n');
+ flush();
+
+ assert.isTrue(diffChangeStub.called);
+ });
+
test('shift+x shortcut expands all diff context', () => {
const expandStub = sinon.stub(element.$.diffHost, 'expandAllContext');
MockInteractions.pressAndReleaseKeyOn(element, 88, 'shift', 'x');
@@ -621,14 +664,14 @@
MockInteractions.pressAndReleaseKeyOn(element, 221, null, ']');
assert.isTrue(element._loading);
assert(diffNavStub.lastCall.calledWithExactly(element._change,
- 'wheatley.md', 10, 5),
+ 'wheatley.md', 10, 5, undefined),
'Should navigate to /c/42/5..10/wheatley.md');
element._path = 'wheatley.md';
MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
assert.isTrue(element._loading);
assert(diffNavStub.lastCall.calledWithExactly(element._change,
- 'glados.txt', 10, 5),
+ 'glados.txt', 10, 5, undefined),
'Should navigate to /c/42/5..10/glados.txt');
element._path = 'glados.txt';
@@ -638,7 +681,8 @@
element._change,
'chell.go',
10,
- 5),
+ 5,
+ undefined),
'Should navigate to /c/42/5..10/chell.go');
element._path = 'chell.go';
@@ -692,13 +736,13 @@
MockInteractions.pressAndReleaseKeyOn(element, 221, null, ']');
assert(diffNavStub.lastCall.calledWithExactly(element._change,
- 'wheatley.md', 1, PARENT),
+ 'wheatley.md', 1, PARENT, undefined),
'Should navigate to /c/42/1/wheatley.md');
element._path = 'wheatley.md';
MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
assert(diffNavStub.lastCall.calledWithExactly(element._change,
- 'glados.txt', 1, PARENT),
+ 'glados.txt', 1, PARENT, undefined),
'Should navigate to /c/42/1/glados.txt');
element._path = 'glados.txt';
@@ -707,7 +751,8 @@
element._change,
'chell.go',
1,
- PARENT), 'Should navigate to /c/42/1/chell.go');
+ PARENT,
+ undefined), 'Should navigate to /c/42/1/chell.go');
element._path = 'chell.go';
changeNavStub.reset();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts
index 7946061..3fb1a50 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts
@@ -66,7 +66,10 @@
// @ts-ignore
import * as shadow from 'shadow-selection-polyfill/shadow.js';
-import {CreateCommentEventDetail as CreateCommentEventDetailApi} from '../../../api/diff';
+import {
+ CreateCommentEventDetail as CreateCommentEventDetailApi,
+ RenderPreferences,
+} from '../../../api/diff';
import {isSafari} from '../../../utils/dom-util';
const NO_NEWLINE_BASE = 'No newline at end of base file.';
@@ -158,6 +161,9 @@
@property({type: Object, observer: '_prefsObserver'})
prefs?: DiffPreferencesInfo;
+ @property({type: Object, observer: '_renderPrefsChanged'})
+ renderPrefs?: RenderPreferences;
+
@property({type: Boolean})
displayLine = false;
@@ -173,6 +179,10 @@
@property({type: Array})
_commentRanges: CommentRangeLayer[] = [];
+ // explicitly highlight a range if it is not associated with any comment
+ @property({type: Object})
+ highlightRange?: CommentRange;
+
@property({type: Array})
coverageRanges: CoverageRange[] = [];
@@ -413,6 +423,14 @@
if (addedCommentRanges && addedCommentRanges.length) {
this.push('_commentRanges', ...addedCommentRanges);
}
+ if (this.highlightRange) {
+ this.push('_commentRanges', {
+ side: Side.RIGHT,
+ range: this.highlightRange,
+ hovering: true,
+ rootId: '',
+ });
+ }
}
/**
@@ -727,6 +745,16 @@
}
}
+ _renderPrefsChanged(renderPrefs?: RenderPreferences) {
+ if (!renderPrefs) return;
+ if (renderPrefs.hide_left_side) {
+ this.classList.add('no-left');
+ }
+ if (renderPrefs.disable_context_control_buttons) {
+ this.updateStyles({'--context-control-display': 'none'});
+ }
+ }
+
_diffChanged(newValue?: DiffInfo) {
this._setLoading(true);
this._cleanup();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_html.ts b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_html.ts
index b0f48ce..4b477cd 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_html.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_html.ts
@@ -272,6 +272,7 @@
/* Context controls */
.contextControl {
+ display: var(--context-control-display, table-row-group);
background-color: transparent;
border: none;
--divider-height: var(--spacing-s);
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
index 6ee82c9..ec7be4a 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.ts
@@ -17,6 +17,7 @@
import '../../../styles/shared-styles';
import '../gr-storage/gr-storage';
import '../gr-comment/gr-comment';
+import '../../diff/gr-diff/gr-diff';
import {dom, EventApi} from '@polymer/polymer/lib/legacy/polymer.dom';
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners';
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin';
@@ -24,6 +25,7 @@
import {htmlTemplate} from './gr-comment-thread_html';
import {KeyboardShortcutMixin} from '../../../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin';
import {
+ computeDiffFromContext,
isDraft,
isRobot,
sortComments,
@@ -33,9 +35,14 @@
} from '../../../utils/comment-util';
import {GerritNav} from '../../core/gr-navigation/gr-navigation';
import {appContext} from '../../../services/app-context';
-import {CommentSide, Side, SpecialFilePath} from '../../../constants/constants';
+import {
+ CommentSide,
+ createDefaultDiffPrefs,
+ Side,
+ SpecialFilePath,
+} from '../../../constants/constants';
import {computeDisplayPath} from '../../../utils/path-list-util';
-import {customElement, observe, property} from '@polymer/decorators';
+import {computed, customElement, observe, property} from '@polymer/decorators';
import {
CommentRange,
ConfigInfo,
@@ -50,6 +57,9 @@
import {CustomKeyboardEvent} from '../../../types/events';
import {LineNumber, FILE} from '../../diff/gr-diff/gr-diff-line';
import {GrButton} from '../gr-button/gr-button';
+import {KnownExperimentId} from '../../../services/flags/flags';
+import {DiffInfo, DiffPreferencesInfo} from '../../../types/diff';
+import {RenderPreferences} from '../../../api/diff';
const UNRESOLVED_EXPAND_COUNT = 5;
const NEWLINE_PATTERN = /\n/g;
@@ -122,7 +132,7 @@
patchNum?: PatchSetNum;
@property({type: String})
- path?: string;
+ path: string | undefined;
@property({type: String, observer: '_projectNameChanged'})
projectName?: RepoName;
@@ -164,6 +174,15 @@
@property({type: Object})
_projectConfig?: ConfigInfo;
+ @property({type: Object})
+ _prefs: DiffPreferencesInfo = createDefaultDiffPrefs();
+
+ @property({type: Object})
+ _renderPrefs: RenderPreferences = {
+ hide_left_side: true,
+ disable_context_control_buttons: true,
+ };
+
@property({type: Boolean, reflectToAttribute: true})
isRobotComment = false;
@@ -176,6 +195,9 @@
@property({type: Boolean})
showPatchset = true;
+ @property({type: Boolean})
+ showCommentContext = false;
+
get keyBindings() {
return {
'e shift+e': '_handleEKey',
@@ -188,6 +210,10 @@
readonly storage = new GrStorage();
+ private isCommentContextExperimentEnabled = this.flagsService.isEnabled(
+ KnownExperimentId.COMMENT_CONTEXT
+ );
+
readonly restApiService = appContext.restApiService;
/** @override */
@@ -204,9 +230,34 @@
this._getLoggedIn().then(loggedIn => {
this._showActions = loggedIn;
});
+ this.restApiService.getDiffPreferences().then(prefs => {
+ if (!prefs) return;
+ this._prefs = {
+ ...prefs,
+ show_file_comment_button: false,
+ // override explicitly so that diff doesn't take too much width
+ // compared to the context
+ line_wrapping: false,
+ };
+ });
this._setInitialExpandedState();
}
+ @computed('comments', 'path')
+ get _diff() {
+ if (this.comments === undefined || this.path === undefined) return;
+ if (!this.comments[0]?.context_lines?.length) return;
+ return computeDiffFromContext(this.comments[0].context_lines, this.path);
+ }
+
+ _shouldShowCommentContext(diff?: DiffInfo) {
+ return (
+ this.isCommentContextExperimentEnabled &&
+ this.showCommentContext &&
+ !!diff
+ );
+ }
+
addOrEditDraft(lineNum?: LineNumber, rangeParam?: CommentRange) {
const lastComment = this.comments[this.comments.length - 1] || {};
if (isDraft(lastComment)) {
@@ -266,6 +317,10 @@
return GerritNav.getUrlForComment(changeNum, projectName, id);
}
+ getHighlightRange() {
+ return this.comments?.[0]?.range;
+ }
+
_getDiffUrlForComment(
projectName?: RepoName,
changeNum?: NumericChangeId,
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_html.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_html.ts
index 1a89a79..dfb0d45 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_html.ts
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_html.ts
@@ -23,6 +23,15 @@
font-size: var(--font-size-normal);
font-weight: var(--font-weight-normal);
line-height: var(--line-height-normal);
+ /* Explicitly set the background color of the diff to be white. We
+ * cannot use the diff content type ab because of the skip chunk preceding
+ * it, diff processor assumes the chunk of type skip/ab can be collapsed
+ * and hides our diff behind context control buttons.
+ * */
+ --dark-add-highlight-color: white;
+ --diff-container-styles: {
+ border: 1px solid var(--border-color);
+ }
}
gr-button {
margin-left: var(--spacing-m);
@@ -34,24 +43,29 @@
margin-left: auto;
padding: var(--spacing-s) var(--spacing-m);
}
- #container {
+ .comment-box {
+ width: 80ch;
+ max-width: 100%;
background-color: var(--comment-background-color);
color: var(--comment-text-color);
- display: var(--gr-comment-thread-display, block);
- margin: 0 var(--spacing-s) var(--spacing-s);
- white-space: normal;
box-shadow: var(--elevation-level-2);
border-radius: var(--border-radius);
+ }
+ #container {
+ display: var(--gr-comment-thread-display, flex);
+ align-items: flex-start;
+ margin: 0 var(--spacing-s) var(--spacing-s);
+ white-space: normal;
/** This is required for firefox to continue the inheritance */
-webkit-user-select: inherit;
-moz-user-select: inherit;
-ms-user-select: inherit;
user-select: inherit;
}
- #container.unresolved {
+ .comment-box.unresolved {
background-color: var(--unresolved-comment-background-color);
}
- #container.robotComment {
+ .comment-box.robotComment {
background-color: var(--robot-comment-background-color);
}
#commentInfoContainer {
@@ -75,7 +89,11 @@
.fileName {
padding: var(--spacing-m) var(--spacing-s) var(--spacing-m);
}
+ gr-diff {
+ margin-left: var(--spacing-l);
+ }
</style>
+
<template is="dom-if" if="[[showFilePath]]">
<template is="dom-if" if="[[showFileName]]">
<div class="fileName">
@@ -100,71 +118,82 @@
</template>
</div>
</template>
- <div
- id="container"
- class$="[[_computeHostClass(unresolved, isRobotComment)]]"
- >
- <template
- id="commentList"
- is="dom-repeat"
- items="[[_orderedComments]]"
- as="comment"
- >
- <gr-comment
- comment="{{comment}}"
- comments="{{comments}}"
- robot-button-disabled="[[_shouldDisableAction(_showActions, _lastComment)]]"
- change-num="[[changeNum]]"
- project-name="[[projectName]]"
- patch-num="[[patchNum]]"
- draft="[[_isDraft(comment)]]"
- show-actions="[[_showActions]]"
- show-patchset="[[showPatchset]]"
- show-ported-comment="[[_computeShowPortedComment(comment)]]"
- side="[[comment.side]]"
- project-config="[[_projectConfig]]"
- on-create-fix-comment="_handleCommentFix"
- on-comment-discard="_handleCommentDiscard"
- on-comment-save="_handleCommentSavedOrDiscarded"
- ></gr-comment>
- </template>
- <div
- id="commentInfoContainer"
- hidden$="[[_hideActions(_showActions, _lastComment)]]"
- >
- <span id="unresolvedLabel">[[_getUnresolvedLabel(unresolved)]]</span>
- <div id="actions">
- <gr-button
- id="replyBtn"
- link=""
- class="action reply"
- on-click="_handleCommentReply"
- >Reply</gr-button
- >
- <gr-button
- id="quoteBtn"
- link=""
- class="action quote"
- on-click="_handleCommentQuote"
- >Quote</gr-button
- >
- <template is="dom-if" if="[[unresolved]]">
+ <div id="container">
+ <div class$="[[_computeHostClass(unresolved, isRobotComment)]] comment-box">
+ <template
+ id="commentList"
+ is="dom-repeat"
+ items="[[_orderedComments]]"
+ as="comment"
+ >
+ <gr-comment
+ comment="{{comment}}"
+ comments="{{comments}}"
+ robot-button-disabled="[[_shouldDisableAction(_showActions, _lastComment)]]"
+ change-num="[[changeNum]]"
+ project-name="[[projectName]]"
+ patch-num="[[patchNum]]"
+ draft="[[_isDraft(comment)]]"
+ show-actions="[[_showActions]]"
+ show-patchset="[[showPatchset]]"
+ show-ported-comment="[[_computeShowPortedComment(comment)]]"
+ side="[[comment.side]]"
+ project-config="[[_projectConfig]]"
+ on-create-fix-comment="_handleCommentFix"
+ on-comment-discard="_handleCommentDiscard"
+ on-comment-save="_handleCommentSavedOrDiscarded"
+ ></gr-comment>
+ </template>
+ <div
+ id="commentInfoContainer"
+ hidden$="[[_hideActions(_showActions, _lastComment)]]"
+ >
+ <span id="unresolvedLabel">[[_getUnresolvedLabel(unresolved)]]</span>
+ <div id="actions">
<gr-button
- id="ackBtn"
+ id="replyBtn"
link=""
- class="action ack"
- on-click="_handleCommentAck"
- >Ack</gr-button
+ class="action reply"
+ on-click="_handleCommentReply"
+ >Reply</gr-button
>
<gr-button
- id="doneBtn"
+ id="quoteBtn"
link=""
- class="action done"
- on-click="_handleCommentDone"
- >Done</gr-button
+ class="action quote"
+ on-click="_handleCommentQuote"
+ >Quote</gr-button
>
- </template>
+ <template is="dom-if" if="[[unresolved]]">
+ <gr-button
+ id="ackBtn"
+ link=""
+ class="action ack"
+ on-click="_handleCommentAck"
+ >Ack</gr-button
+ >
+ <gr-button
+ id="doneBtn"
+ link=""
+ class="action done"
+ on-click="_handleCommentDone"
+ >Done</gr-button
+ >
+ </template>
+ </div>
</div>
</div>
+ <template is="dom-if" if="[[_shouldShowCommentContext(_diff)]]">
+ <gr-diff
+ id="diff"
+ change-num="[[changeNum]]"
+ diff="[[_diff]]"
+ path="[[path]]"
+ prefs="[[_prefs]]"
+ render-prefs="[[_renderPrefs]]"
+ highlight-range="[[getHighlightRange(comments)]]"
+ >
+ </gr-diff>
+ </template>
</div>
`;
diff --git a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.ts b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.ts
index 70f68ae..60a07a4 100644
--- a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.ts
+++ b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.ts
@@ -223,7 +223,7 @@
if (
!labelInfo ||
!isDetailedLabelInfo(labelInfo) ||
- !labelInfo.values[score]
+ !labelInfo.values?.[score]
) {
return '';
}
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts
index 6e17c75..f3be790 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts
@@ -2232,11 +2232,15 @@
path?: string
) {
if (!basePatchNum && !patchNum && !path) {
- return this._getDiffComments(changeNum, '/comments');
+ return this._getDiffComments(changeNum, '/comments', {
+ 'enable-context': true,
+ 'context-padding': 5,
+ });
}
return this._getDiffComments(
changeNum,
'/comments',
+ {'enable-context': true, 'context-padding': 5},
basePatchNum,
patchNum,
path
@@ -2267,6 +2271,7 @@
return this._getDiffComments(
changeNum,
'/robotcomments',
+ undefined,
basePatchNum,
patchNum,
path
@@ -2305,6 +2310,7 @@
return this._getDiffComments(
changeNum,
'/drafts',
+ undefined,
basePatchNum,
patchNum,
path
@@ -2337,7 +2343,8 @@
_getDiffComments(
changeNum: NumericChangeId,
- endpoint: '/comments' | '/drafts'
+ endpoint: '/comments' | '/drafts',
+ params?: FetchParams
): Promise<PathToCommentsInfoMap | undefined>;
_getDiffComments(
@@ -2348,6 +2355,7 @@
_getDiffComments(
changeNum: NumericChangeId,
endpoint: '/comments' | '/drafts',
+ params?: FetchParams,
basePatchNum?: PatchSetNum,
patchNum?: PatchSetNum,
path?: string
@@ -2356,6 +2364,7 @@
_getDiffComments(
changeNum: NumericChangeId,
endpoint: '/robotcomments',
+ params?: FetchParams,
basePatchNum?: PatchSetNum,
patchNum?: PatchSetNum,
path?: string
@@ -2364,6 +2373,7 @@
_getDiffComments(
changeNum: NumericChangeId,
endpoint: string,
+ params?: FetchParams,
basePatchNum?: PatchSetNum,
patchNum?: PatchSetNum,
path?: string
@@ -2388,6 +2398,7 @@
endpoint,
revision: patchNum,
reportEndpointAsIs: true,
+ params,
},
noAcceptHeader
) as Promise<
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.js
index 6db2bff..fbd675f 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.js
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.js
@@ -75,7 +75,8 @@
},
],
}));
- return element._getDiffComments('42', '', 'PARENT', 1, 'sieve.go').then(
+ return element._getDiffComments('42', '', undefined, 'PARENT', 1,
+ 'sieve.go').then(
obj => {
assert.equal(obj.baseComments.length, 1);
assert.deepEqual(obj.baseComments[0], {
@@ -239,7 +240,7 @@
});
}
});
- return element._getDiffComments('42', '', 1, 2, 'sieve.go').then(
+ return element._getDiffComments('42', '', undefined, 1, 2, 'sieve.go').then(
obj => {
assert.equal(obj.baseComments.length, 1);
assert.deepEqual(obj.baseComments[0], {
diff --git a/polygerrit-ui/app/services/flags/flags.ts b/polygerrit-ui/app/services/flags/flags.ts
index f96afaa..878b8f7 100644
--- a/polygerrit-ui/app/services/flags/flags.ts
+++ b/polygerrit-ui/app/services/flags/flags.ts
@@ -31,4 +31,5 @@
NEW_CHANGE_SUMMARY_UI = 'UiFeature__new_change_summary_ui',
PORTING_COMMENTS = 'UiFeature__porting_comments',
NEW_IMAGE_DIFF_UI = 'UiFeature__new_image_diff_ui',
+ COMMENT_CONTEXT = 'UiFeature__comment_context',
}
diff --git a/polygerrit-ui/app/types/common.ts b/polygerrit-ui/app/types/common.ts
index 5f196b1..aeacd9a 100644
--- a/polygerrit-ui/app/types/common.ts
+++ b/polygerrit-ui/app/types/common.ts
@@ -198,7 +198,7 @@
// This is not set when the change has no reviewers.
all?: ApprovalInfo[];
// Docs claim that 'values' is optional, but it is actually always set.
- values: LabelValueToDescriptionMap; // A map of all values that are allowed for this label
+ values?: LabelValueToDescriptionMap; // A map of all values that are allowed for this label
default_value?: number;
}
@@ -1173,11 +1173,21 @@
unresolved?: boolean;
change_message_id?: string;
commit_id?: string;
+ context_lines?: ContextLine[];
}
export type PathToCommentsInfoMap = {[path: string]: CommentInfo[]};
/**
+ * The ContextLine entity contains the line number and line text of a single line of the source file content..
+ * https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#context-line
+ */
+export interface ContextLine {
+ line_number: number;
+ context_line: string;
+}
+
+/**
* The ProjectInfo entity contains information about a project
* https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#project-info
*/
diff --git a/polygerrit-ui/app/utils/change-util.ts b/polygerrit-ui/app/utils/change-util.ts
index 8839be1..1228863 100644
--- a/polygerrit-ui/app/utils/change-util.ts
+++ b/polygerrit-ui/app/utils/change-util.ts
@@ -21,6 +21,7 @@
PatchSetNum,
ChangeInfo,
AccountInfo,
+ RelatedChangeAndCommitInfo,
} from '../types/common';
import {ParsedChangeInfo} from '../types/types';
@@ -225,3 +226,9 @@
(!reviewer._account_id && account.email === reviewer.email)
);
}
+
+export function isChangeInfo(
+ x: ChangeInfo | RelatedChangeAndCommitInfo | ParsedChangeInfo
+): x is ChangeInfo | ParsedChangeInfo {
+ return (x as ChangeInfo)._number !== undefined;
+}
diff --git a/polygerrit-ui/app/utils/comment-util.ts b/polygerrit-ui/app/utils/comment-util.ts
index 0c4a3c6..61456a2 100644
--- a/polygerrit-ui/app/utils/comment-util.ts
+++ b/polygerrit-ui/app/utils/comment-util.ts
@@ -24,12 +24,14 @@
CommentRange,
PatchRange,
ParentPatchSetNum,
+ ContextLine,
} from '../types/common';
import {CommentSide, Side} from '../constants/constants';
import {parseDate} from './date-util';
import {LineNumber} from '../elements/diff/gr-diff/gr-diff-line';
import {CommentIdToCommentThreadMap} from '../elements/diff/gr-comment-api/gr-comment-api';
import {isMergeParent, getParentIndex} from './patch-set-util';
+import {DiffInfo} from '../types/diff';
export interface DraftCommentProps {
__draft?: boolean;
@@ -285,3 +287,32 @@
};
}
}
+
+export function computeDiffFromContext(context: ContextLine[], path: string) {
+ const diff: DiffInfo = {
+ meta_a: {
+ name: '',
+ content_type: '',
+ lines: 0,
+ web_links: [],
+ },
+ meta_b: {
+ name: path,
+ content_type: '',
+ lines: context.length + context?.[0].line_number,
+ web_links: [],
+ },
+ change_type: 'MODIFIED',
+ intraline_status: 'OK',
+ diff_header: [],
+ content: [
+ {
+ skip: context[0].line_number - 1,
+ },
+ {
+ b: context.map(line => line.context_line),
+ },
+ ],
+ };
+ return diff;
+}
diff --git a/polygerrit-ui/app/utils/label-util.ts b/polygerrit-ui/app/utils/label-util.ts
index fc83d77..60ac4d8 100644
--- a/polygerrit-ui/app/utils/label-util.ts
+++ b/polygerrit-ui/app/utils/label-util.ts
@@ -27,7 +27,7 @@
export const CODE_REVIEW = 'Code-Review';
export function getVotingRange(label?: LabelInfo): VotingRangeInfo | undefined {
- if (!label || !isDetailedLabelInfo(label)) return undefined;
+ if (!label || !isDetailedLabelInfo(label) || !label.values) return undefined;
const values = Object.keys(label.values).map(v => Number(v));
values.sort((a, b) => a - b);
if (!values.length) return undefined;
diff --git a/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy b/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy
index 31ea7d2..93584c6 100644
--- a/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy
+++ b/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy
@@ -16,7 +16,7 @@
{namespace com.google.gerrit.httpd.raw}
-{template .Index}
+{template Index}
{@param canonicalPath: ?}
{@param staticResourcePath: ?}
{@param gerritInitialData: /** {string} map of REST endpoint to response for startup. */ ?}
diff --git a/resources/com/google/gerrit/server/mail/Abandoned.soy b/resources/com/google/gerrit/server/mail/Abandoned.soy
index d5aac0e..b57f00a 100644
--- a/resources/com/google/gerrit/server/mail/Abandoned.soy
+++ b/resources/com/google/gerrit/server/mail/Abandoned.soy
@@ -20,7 +20,7 @@
* The .Abandoned template will determine the contents of the email related to a
* change being abandoned.
*/
-{template .Abandoned kind="text"}
+{template Abandoned kind="text"}
{@param change: ?}
{@param coverLetter: ?}
{@param email: ?}
diff --git a/resources/com/google/gerrit/server/mail/AbandonedHtml.soy b/resources/com/google/gerrit/server/mail/AbandonedHtml.soy
index 9ad996e..9f80241 100644
--- a/resources/com/google/gerrit/server/mail/AbandonedHtml.soy
+++ b/resources/com/google/gerrit/server/mail/AbandonedHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .AbandonedHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template AbandonedHtml}
{@param coverLetter: ?}
{@param email: ?}
{@param fromName: ?}
@@ -26,7 +28,7 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
diff --git a/resources/com/google/gerrit/server/mail/AddKey.soy b/resources/com/google/gerrit/server/mail/AddKey.soy
index 8b609cf..c77ab56 100644
--- a/resources/com/google/gerrit/server/mail/AddKey.soy
+++ b/resources/com/google/gerrit/server/mail/AddKey.soy
@@ -16,11 +16,13 @@
{namespace com.google.gerrit.server.mail.template}
+import * as mailTemplate from 'com/google/gerrit/server/mail/NoReplyFooter.soy';
+
/**
* The .AddKey template will determine the contents of the email related to
* adding a new SSH or GPG key to an account.
*/
-{template .AddKey kind="text"}
+{template AddKey kind="text"}
{@param email: ?}
One or more new {$email.keyType} keys have been added to Gerrit Code Review at
{sp}{$email.gerritHost}:
@@ -64,5 +66,5 @@
browser window instead.
{\n}
- {call .NoReplyFooter /}
+ {call mailTemplate.NoReplyFooter /}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/AddKeyHtml.soy b/resources/com/google/gerrit/server/mail/AddKeyHtml.soy
index ed4f435..3987684 100644
--- a/resources/com/google/gerrit/server/mail/AddKeyHtml.soy
+++ b/resources/com/google/gerrit/server/mail/AddKeyHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .AddKeyHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/NoReplyFooterHtml.soy';
+
+{template AddKeyHtml}
{@param email: ?}
<p>
One or more new {$email.keyType} keys have been added to Gerrit Code Review
@@ -57,5 +59,5 @@
{/if}.
</p>
- {call .NoReplyFooterHtml /}
+ {call mailTemplate.NoReplyFooterHtml /}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/AddToAttentionSet.soy b/resources/com/google/gerrit/server/mail/AddToAttentionSet.soy
index 5ea41b2..64c1ad3 100644
--- a/resources/com/google/gerrit/server/mail/AddToAttentionSet.soy
+++ b/resources/com/google/gerrit/server/mail/AddToAttentionSet.soy
@@ -20,7 +20,7 @@
* The .AddToAttentionSet template will determine the contents of the email related to a
* user being added to the attention set.
*/
-{template .AddToAttentionSet kind="text"}
+{template AddToAttentionSet kind="text"}
{@param change: ?}
{@param coverLetter: ?}
{@param email: ?}
diff --git a/resources/com/google/gerrit/server/mail/AddToAttentionSetHtml.soy b/resources/com/google/gerrit/server/mail/AddToAttentionSetHtml.soy
index bac180a..04d759e 100644
--- a/resources/com/google/gerrit/server/mail/AddToAttentionSetHtml.soy
+++ b/resources/com/google/gerrit/server/mail/AddToAttentionSetHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .AddToAttentionSetHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template AddToAttentionSetHtml}
{@param coverLetter: ?}
{@param email: ?}
{@param fromName: ?}
@@ -33,11 +35,11 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
{if $coverLetter}
<div style="white-space:pre-wrap">{$coverLetter}</div>
{/if}
-{/template}
\ No newline at end of file
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/ChangeFooter.soy b/resources/com/google/gerrit/server/mail/ChangeFooter.soy
index a8170ca..236b171 100644
--- a/resources/com/google/gerrit/server/mail/ChangeFooter.soy
+++ b/resources/com/google/gerrit/server/mail/ChangeFooter.soy
@@ -20,7 +20,7 @@
* The .ChangeFooter template will determine the contents of the footer text
* that will be appended to ALL emails related to changes.
*/
-{template .ChangeFooter kind="text"}
+{template ChangeFooter kind="text"}
{@param email: ?}
--{sp}
{\n}
diff --git a/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy b/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy
index b619c53..28442ee 100644
--- a/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy
+++ b/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy
@@ -16,7 +16,7 @@
{namespace com.google.gerrit.server.mail.template}
-{template .ChangeFooterHtml}
+{template ChangeFooterHtml}
{@param change: ?}
{@param email: ?}
{if $email.changeUrl or $email.settingsUrl}
diff --git a/resources/com/google/gerrit/server/mail/ChangeHeader.soy b/resources/com/google/gerrit/server/mail/ChangeHeader.soy
index fde69f1..7a2da65 100644
--- a/resources/com/google/gerrit/server/mail/ChangeHeader.soy
+++ b/resources/com/google/gerrit/server/mail/ChangeHeader.soy
@@ -16,7 +16,7 @@
{namespace com.google.gerrit.server.mail.template}
-{template .ChangeHeader kind="text"}
+{template ChangeHeader kind="text"}
{@param attentionSet: ?}
{if $attentionSet}
Attention is currently required from:{sp}
diff --git a/resources/com/google/gerrit/server/mail/ChangeHeaderHtml.soy b/resources/com/google/gerrit/server/mail/ChangeHeaderHtml.soy
index ea12455..a1bcd8f 100644
--- a/resources/com/google/gerrit/server/mail/ChangeHeaderHtml.soy
+++ b/resources/com/google/gerrit/server/mail/ChangeHeaderHtml.soy
@@ -17,7 +17,7 @@
{namespace com.google.gerrit.server.mail.template}
-{template .ChangeHeaderHtml}
+{template ChangeHeaderHtml}
{@param attentionSet: ?}
{if $attentionSet}
<p> Attention is currently required from:{sp}
diff --git a/resources/com/google/gerrit/server/mail/ChangeSubject.soy b/resources/com/google/gerrit/server/mail/ChangeSubject.soy
index 7fcd213..12422ed 100644
--- a/resources/com/google/gerrit/server/mail/ChangeSubject.soy
+++ b/resources/com/google/gerrit/server/mail/ChangeSubject.soy
@@ -20,7 +20,7 @@
* The .ChangeSubject template will determine the contents of the email subject
* line for ALL emails related to changes.
*/
-{template .ChangeSubject kind="text"}
+{template ChangeSubject kind="text"}
{@param branch: ?}
{@param change: ?}
{@param shortProjectName: ?}
diff --git a/resources/com/google/gerrit/server/mail/Comment.soy b/resources/com/google/gerrit/server/mail/Comment.soy
index 893ef6f..973b369 100644
--- a/resources/com/google/gerrit/server/mail/Comment.soy
+++ b/resources/com/google/gerrit/server/mail/Comment.soy
@@ -20,7 +20,7 @@
* The .Comment template will determine the contents of the email related to a
* user submitting comments on changes.
*/
-{template .Comment kind="text"}
+{template Comment kind="text"}
{@param change: ?}
{@param coverLetter: ?}
{@param email: ?}
diff --git a/resources/com/google/gerrit/server/mail/CommentFooter.soy b/resources/com/google/gerrit/server/mail/CommentFooter.soy
index 3998438..3c111f7 100644
--- a/resources/com/google/gerrit/server/mail/CommentFooter.soy
+++ b/resources/com/google/gerrit/server/mail/CommentFooter.soy
@@ -21,5 +21,5 @@
* that will be appended to emails related to a user submitting comments on
* changes.
*/
-{template .CommentFooter kind="text"}
+{template CommentFooter kind="text"}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy b/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy
index 033c1b1..ce8a933 100644
--- a/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy
+++ b/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy
@@ -16,5 +16,5 @@
{namespace com.google.gerrit.server.mail.template}
-{template .CommentFooterHtml}
+{template CommentFooterHtml}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/CommentHtml.soy b/resources/com/google/gerrit/server/mail/CommentHtml.soy
index 21fee18..b3924c3 100644
--- a/resources/com/google/gerrit/server/mail/CommentHtml.soy
+++ b/resources/com/google/gerrit/server/mail/CommentHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .CommentHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template CommentHtml}
{@param commentFiles: ?}
{@param commentCount: ?}
{@param email: ?}
@@ -71,7 +73,9 @@
{/let}
{if $patchSetCommentBlocks}
- {call .WikiFormat}{param content: $patchSetCommentBlocks /}{/call}
+ {call mailTemplate.WikiFormat}
+ {param content: $patchSetCommentBlocks /}
+ {/call}
{/if}
{if length($labels) > 0}
@@ -97,7 +101,7 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
@@ -146,11 +150,13 @@
{if length($comment.lines) > 1}
<p>
<blockquote style="{$blockquoteStyle}">
- {call .Pre}{param content kind="html"}
- {for $line in $comment.lines}
- {$line}{\n}
- {/for}
- {/param}{/call}
+ {call mailTemplate.Pre}
+ {param content kind="html"}
+ {for $line in $comment.lines}
+ {$line}{\n}
+ {/for}
+ {/param}
+ {/call}
</blockquote>
</p>
{/if}
@@ -163,7 +169,9 @@
</p>
{/if}
- {call .WikiFormat}{param content: $comment.messageBlocks /}{/call}
+ {call mailTemplate.WikiFormat}
+ {param content: $comment.messageBlocks /}
+ {/call}
</li>
{/for}
</ul>
diff --git a/resources/com/google/gerrit/server/mail/DeleteKey.soy b/resources/com/google/gerrit/server/mail/DeleteKey.soy
index 30548c8..ffc12dc 100644
--- a/resources/com/google/gerrit/server/mail/DeleteKey.soy
+++ b/resources/com/google/gerrit/server/mail/DeleteKey.soy
@@ -20,7 +20,7 @@
* The .DeleteKey template will determine the contents of the email related to
* deleting a SSH or GPG key.
*/
-{template .DeleteKey kind="text"}
+{template DeleteKey kind="text"}
{@param email: ?}
One or more {$email.keyType} keys have been deleted on Gerrit Code Review at
{sp}{$email.gerritHost}:
diff --git a/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy b/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy
index 1ab3955..4ce5246 100644
--- a/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy
+++ b/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy
@@ -16,7 +16,7 @@
{namespace com.google.gerrit.server.mail.template}
-{template .DeleteKeyHtml}
+{template DeleteKeyHtml}
{@param email: ?}
<p>
One or more {$email.keyType} keys have been deleted on Gerrit Code Review
diff --git a/resources/com/google/gerrit/server/mail/DeleteReviewer.soy b/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
index 3310249..a9ba802 100644
--- a/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
+++ b/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
@@ -20,7 +20,7 @@
* The .DeleteReviewer template will determine the contents of the email related
* to removal of a reviewer (and the reviewer's votes) from reviews.
*/
-{template .DeleteReviewer kind="text"}
+{template DeleteReviewer kind="text"}
{@param change: ?}
{@param coverLetter: ?}
{@param email: ?}
diff --git a/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy b/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
index 54720fe..685ca4c 100644
--- a/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
+++ b/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .DeleteReviewerHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template DeleteReviewerHtml}
{@param email: ?}
{@param fromName: ?}
<p>
@@ -35,7 +37,7 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/DeleteVote.soy b/resources/com/google/gerrit/server/mail/DeleteVote.soy
index 0ee5454..74790f7 100644
--- a/resources/com/google/gerrit/server/mail/DeleteVote.soy
+++ b/resources/com/google/gerrit/server/mail/DeleteVote.soy
@@ -20,7 +20,7 @@
* The .DeleteVote template will determine the contents of the email related
* to removing votes on changes.
*/
-{template .DeleteVote kind="text"}
+{template DeleteVote kind="text"}
{@param change: ?}
{@param coverLetter: ?}
{@param email: ?}
diff --git a/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy b/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy
index 3a82927..dd3b423 100644
--- a/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy
+++ b/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .DeleteVoteHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template DeleteVoteHtml}
{@param coverLetter: ?}
{@param email: ?}
{@param fromName: ?}
@@ -26,7 +28,7 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
diff --git a/resources/com/google/gerrit/server/mail/Footer.soy b/resources/com/google/gerrit/server/mail/Footer.soy
index 7483cd9..6ce0d3b 100644
--- a/resources/com/google/gerrit/server/mail/Footer.soy
+++ b/resources/com/google/gerrit/server/mail/Footer.soy
@@ -21,7 +21,7 @@
* appended to the end of all outgoing emails after the ChangeFooter and
* CommentFooter.
*/
-{template .Footer kind="text"}
+{template Footer kind="text"}
{@param footers: ?}
{for $footer in $footers}
{$footer}{\n}
diff --git a/resources/com/google/gerrit/server/mail/FooterHtml.soy b/resources/com/google/gerrit/server/mail/FooterHtml.soy
index ce934d3..c89dea7 100644
--- a/resources/com/google/gerrit/server/mail/FooterHtml.soy
+++ b/resources/com/google/gerrit/server/mail/FooterHtml.soy
@@ -16,7 +16,7 @@
{namespace com.google.gerrit.server.mail.template}
-{template .FooterHtml}
+{template FooterHtml}
{@param footers: ?}
{\n}
{\n}
diff --git a/resources/com/google/gerrit/server/mail/HttpPasswordUpdate.soy b/resources/com/google/gerrit/server/mail/HttpPasswordUpdate.soy
index 38e679e..08daa932 100644
--- a/resources/com/google/gerrit/server/mail/HttpPasswordUpdate.soy
+++ b/resources/com/google/gerrit/server/mail/HttpPasswordUpdate.soy
@@ -20,7 +20,7 @@
* The .HttpPasswordUpdate template will determine the contents of the email related to
* adding, changing or deleting the HTTP password.
*/
-{template .HttpPasswordUpdate kind="text"}
+{template HttpPasswordUpdate kind="text"}
{@param email: ?}
The HTTP password was {$email.operation} on Gerrit Code Review at
{sp}{$email.gerritHost}.
diff --git a/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy b/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy
index 3c4594c..e28aaaa 100644
--- a/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy
+++ b/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy
@@ -16,7 +16,7 @@
{namespace com.google.gerrit.server.mail.template}
-{template .HttpPasswordUpdateHtml}
+{template HttpPasswordUpdateHtml}
{@param email: ?}
<p>
The HTTP password was {$email.operation} on Gerrit Code Review
diff --git a/resources/com/google/gerrit/server/mail/InboundEmailRejection.soy b/resources/com/google/gerrit/server/mail/InboundEmailRejection.soy
index 16c5c8d..378785a 100644
--- a/resources/com/google/gerrit/server/mail/InboundEmailRejection.soy
+++ b/resources/com/google/gerrit/server/mail/InboundEmailRejection.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .InboundEmailRejectionFooter kind="text"}
+import * as noReplyFooter from 'com/google/gerrit/server/mail/NoReplyFooter.soy';
+
+{template InboundEmailRejectionFooter kind="text"}
{\n}
{\n}
Thus, no actions were taken by Gerrit in response to this email,
@@ -24,7 +26,7 @@
{\n}
This email was sent in response to an email coming from this address.
In case you did not send Gerrit an email, feel free to ignore this.
- {call .NoReplyFooter /}
+ {call noReplyFooter.NoReplyFooter /}
{/template}
/**
@@ -32,39 +34,39 @@
* to warning users of error in inbound emails
*/
-{template .InboundEmailRejection_PARSING_ERROR kind="text"}
+{template InboundEmailRejection_PARSING_ERROR kind="text"}
Gerrit Code Review was unable to parse your email.{\n}
This might be because your email did not quote Gerrit's email,
because you are using an unsupported email client,
or because of a bug.
- {call .InboundEmailRejectionFooter /}
+ {call InboundEmailRejectionFooter /}
{/template}
-{template .InboundEmailRejection_UNKNOWN_ACCOUNT kind="text"}
+{template InboundEmailRejection_UNKNOWN_ACCOUNT kind="text"}
Gerrit Code Review was unable to match your email to an account.{\n}
This may happen if several accounts are linked to this email address.
- {call .InboundEmailRejectionFooter /}
+ {call InboundEmailRejectionFooter /}
{/template}
-{template .InboundEmailRejection_INACTIVE_ACCOUNT kind="text"}
+{template InboundEmailRejection_INACTIVE_ACCOUNT kind="text"}
Your account on this Gerrit Code Review instance is marked as inactive,
so your email has been ignored. {\n}
If you think this is an error, please contact your Gerrit instance administrator.
{\n}{\n}
This email was sent in response to an email coming from this address.
In case you did not send Gerrit an email, feel free to ignore this.
- {call .NoReplyFooter /}
+ {call noReplyFooter.NoReplyFooter /}
{/template}
-{template .InboundEmailRejection_INTERNAL_EXCEPTION kind="text"}
+{template InboundEmailRejection_INTERNAL_EXCEPTION kind="text"}
Gerrit Code Review encountered an internal exception and was unable to fulfil your request.
{\n}
This might be caused by an ongoing maintenance or a data corruption.
- {call .InboundEmailRejectionFooter /}
+ {call InboundEmailRejectionFooter /}
{/template}
-{template .InboundEmailRejection_COMMENT_REJECTED kind="text"}
+{template InboundEmailRejection_COMMENT_REJECTED kind="text"}
Gerrit Code Review rejected one or more comments because they did not pass validation, or
because the maximum number of comments per change would be exceeded.
- {call .InboundEmailRejectionFooter /}
+ {call InboundEmailRejectionFooter /}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/InboundEmailRejectionHtml.soy b/resources/com/google/gerrit/server/mail/InboundEmailRejectionHtml.soy
index 8762e10..f0b18d2 100644
--- a/resources/com/google/gerrit/server/mail/InboundEmailRejectionHtml.soy
+++ b/resources/com/google/gerrit/server/mail/InboundEmailRejectionHtml.soy
@@ -16,8 +16,11 @@
{namespace com.google.gerrit.server.mail.template}
+import * as noReplyFooter from 'com/google/gerrit/server/mail/NoReplyFooter.soy';
+import * as noReplyFooterHtml from 'com/google/gerrit/server/mail/NoReplyFooterHtml.soy';
-{template .InboundEmailRejectionFooterHtml}
+
+{template InboundEmailRejectionFooterHtml}
<p>
Thus, no actions were taken by Gerrit in response to this email,
and you should use the Gerrit website to continue.
@@ -25,7 +28,7 @@
<p>
In case you did not send Gerrit an email, feel free to ignore this.
</p>
- {call .NoReplyFooterHtml /}
+ {call noReplyFooterHtml.NoReplyFooterHtml /}
{/template}
/**
@@ -33,7 +36,7 @@
* to warning users of error in inbound emails
*/
-{template .InboundEmailRejectionHtml_PARSING_ERROR}
+{template InboundEmailRejectionHtml_PARSING_ERROR}
<p>
Gerrit Code Review was unable to parse your email.
</p>
@@ -42,20 +45,20 @@
because you are using an unsupported email client,
or because of a bug.
</p>
- {call .InboundEmailRejectionFooterHtml /}
+ {call InboundEmailRejectionFooterHtml /}
{/template}
-{template .InboundEmailRejectionHtml_UNKNOWN_ACCOUNT}
+{template InboundEmailRejectionHtml_UNKNOWN_ACCOUNT}
<p>
Gerrit Code Review was unable to match your email to an account.
</p>
<p>
This may happen if several accounts are linked to this email address.
</p>
- {call .InboundEmailRejectionFooterHtml /}
+ {call InboundEmailRejectionFooterHtml /}
{/template}
-{template .InboundEmailRejectionHtml_INACTIVE_ACCOUNT}
+{template InboundEmailRejectionHtml_INACTIVE_ACCOUNT}
<p>
Your account on this Gerrit Code Review instance is marked as inactive,
so your email has been ignored.
@@ -66,23 +69,23 @@
<p>
In case you did not send Gerrit an email, feel free to ignore this.
</p>
- {call .NoReplyFooter /}
+ {call noReplyFooter.NoReplyFooter /}
{/template}
-{template .InboundEmailRejectionHtml_INTERNAL_EXCEPTION}
+{template InboundEmailRejectionHtml_INTERNAL_EXCEPTION}
<p>
Gerrit Code Review encountered an internal exception and was unable to fulfil your request.
</p>
<p>
This might be caused by an ongoing maintenance or a data corruption.
<p>
- {call .InboundEmailRejectionFooterHtml /}
+ {call InboundEmailRejectionFooterHtml /}
{/template}
-{template .InboundEmailRejectionHtml_COMMENT_REJECTED}
+{template InboundEmailRejectionHtml_COMMENT_REJECTED}
<p>
Gerrit Code Review rejected one or more comments because they did not pass validation, or
because the maximum number of comments per change would be exceeded.
</p>
- {call .InboundEmailRejectionFooterHtml /}
+ {call InboundEmailRejectionFooterHtml /}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/Merged.soy b/resources/com/google/gerrit/server/mail/Merged.soy
index 59e73eb..b586851 100644
--- a/resources/com/google/gerrit/server/mail/Merged.soy
+++ b/resources/com/google/gerrit/server/mail/Merged.soy
@@ -21,7 +21,7 @@
* The .Merged template will determine the contents of the email related to
* a change successfully merged to the head.
*/
-{template .Merged kind="text"}
+{template Merged kind="text"}
{@param change: ?}
{@param email: ?}
{@param fromName: ?}
diff --git a/resources/com/google/gerrit/server/mail/MergedHtml.soy b/resources/com/google/gerrit/server/mail/MergedHtml.soy
index ca6451e..53c1645 100644
--- a/resources/com/google/gerrit/server/mail/MergedHtml.soy
+++ b/resources/com/google/gerrit/server/mail/MergedHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .MergedHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template MergedHtml}
{@param diffLines: ?}
{@param email: ?}
{@param fromName: ?}
@@ -26,16 +28,20 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
<div style="white-space:pre-wrap">{$email.approvals}</div>
- {call .Pre}{param content: $email.changeDetail /}{/call}
+ {call mailTemplate.Pre}
+ {param content: $email.changeDetail /}
+ {/call}
{if $email.includeDiff}
- {call .UnifiedDiff}{param diffLines: $diffLines /}{/call}
+ {call mailTemplate.UnifiedDiff}
+ {param diffLines: $diffLines /}
+ {/call}
{/if}
<div style="white-space:pre-wrap">{$email.stickyApprovalDiff}</div>
{/template}
diff --git a/resources/com/google/gerrit/server/mail/NewChange.soy b/resources/com/google/gerrit/server/mail/NewChange.soy
index fa447e9..fe99ba4 100644
--- a/resources/com/google/gerrit/server/mail/NewChange.soy
+++ b/resources/com/google/gerrit/server/mail/NewChange.soy
@@ -20,7 +20,7 @@
* The .NewChange template will determine the contents of the email related to a
* user submitting a new change for review.
*/
-{template .NewChange kind="text"}
+{template NewChange kind="text"}
{@param change: ?}
{@param email: ?}
{@param ownerName: ?}
diff --git a/resources/com/google/gerrit/server/mail/NewChangeHtml.soy b/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
index e16b213..756d6ce 100644
--- a/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
+++ b/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .NewChangeHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template NewChangeHtml}
{@param diffLines: ?}
{@param email: ?}
{@param fromName: ?}
@@ -41,20 +43,26 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
- {call .Pre}{param content: $email.changeDetail /}{/call}
+ {call mailTemplate.Pre}
+ {param content: $email.changeDetail /}
+ {/call}
{if $email.sshHost}
- {call .Pre}{param content kind="html"}
- git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
- {sp}{$patchSet.refName}
- {/param}{/call}
+ {call mailTemplate.Pre}
+ {param content kind="html"}
+ git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
+ {sp}{$patchSet.refName}
+ {/param}
+ {/call}
{/if}
{if $email.includeDiff}
- {call .UnifiedDiff}{param diffLines: $diffLines /}{/call}
+ {call mailTemplate.UnifiedDiff}
+ {param diffLines: $diffLines /}
+ {/call}
{/if}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/NoReplyFooter.soy b/resources/com/google/gerrit/server/mail/NoReplyFooter.soy
index 1443100..d309e90 100644
--- a/resources/com/google/gerrit/server/mail/NoReplyFooter.soy
+++ b/resources/com/google/gerrit/server/mail/NoReplyFooter.soy
@@ -16,7 +16,7 @@
{namespace com.google.gerrit.server.mail.template}
-{template .NoReplyFooter kind="text"}
+{template NoReplyFooter kind="text"}
{\n}
This is a send-only email address. Replies to this message will not be read
or answered.
diff --git a/resources/com/google/gerrit/server/mail/NoReplyFooterHtml.soy b/resources/com/google/gerrit/server/mail/NoReplyFooterHtml.soy
index 93df527..1baf5ab 100644
--- a/resources/com/google/gerrit/server/mail/NoReplyFooterHtml.soy
+++ b/resources/com/google/gerrit/server/mail/NoReplyFooterHtml.soy
@@ -16,7 +16,7 @@
{namespace com.google.gerrit.server.mail.template}
-{template .NoReplyFooterHtml}
+{template NoReplyFooterHtml}
<p>
This is a send-only email address. Replies to this message will not be read
or answered.
diff --git a/resources/com/google/gerrit/server/mail/Private.soy b/resources/com/google/gerrit/server/mail/Private.soy
index 510f15e..7920c21 100644
--- a/resources/com/google/gerrit/server/mail/Private.soy
+++ b/resources/com/google/gerrit/server/mail/Private.soy
@@ -23,7 +23,7 @@
/**
* Private template to generate "View Change" buttons.
*/
-{template .ViewChangeButton}
+{template ViewChangeButton}
{@param email: ?}
<a href="{$email.changeUrl}">View Change</a>
{/template}
@@ -31,7 +31,7 @@
/**
* Private template to render PRE block with consistent font-sizing.
*/
-{template .Pre}
+{template Pre}
{@param content: ?}
{let $preStyle kind="css"}
font-family: monospace,monospace; // Use this to avoid browsers scaling down
@@ -54,7 +54,7 @@
* This mechanism encodes as little structure as possible in order to depend on
* the Soy autoescape mechanism for all of the content.
*/
-{template .WikiFormat}
+{template WikiFormat}
{@param content: ?}
{let $blockquoteStyle kind="css"}
border-left: 1px solid #aaa;
@@ -72,10 +72,10 @@
<p style="{$pStyle}">{$block.text|changeNewlineToBr}</p>
{elseif $block.type == 'quote'}
<blockquote style="{$blockquoteStyle}">
- {call .WikiFormat}{param content: $block.quotedBlocks /}{/call}
+ {call WikiFormat}{param content: $block.quotedBlocks /}{/call}
</blockquote>
{elseif $block.type == 'pre'}
- {call .Pre}{param content: $block.text /}{/call}
+ {call Pre}{param content: $block.text /}{/call}
{elseif $block.type == 'list'}
<ul>
{for $item in $block.items}
@@ -86,7 +86,7 @@
{/for}
{/template}
-{template .UnifiedDiff}
+{template UnifiedDiff}
{@param diffLines: ?}
{let $addStyle kind="css"}
color: hsl(120, 100%, 40%);
diff --git a/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy b/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy
index ee03de0..bde8152 100644
--- a/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy
+++ b/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy
@@ -20,7 +20,7 @@
* The .RegisterNewEmail template will determine the contents of the email
* related to registering new email accounts.
*/
-{template .RegisterNewEmail kind="text"}
+{template RegisterNewEmail kind="text"}
{@param email: ?}
Welcome to Gerrit Code Review at {$email.gerritHost}.{\n}
diff --git a/resources/com/google/gerrit/server/mail/RegisterNewEmailHtml.soy b/resources/com/google/gerrit/server/mail/RegisterNewEmailHtml.soy
index 033d145..e3ec3a5 100644
--- a/resources/com/google/gerrit/server/mail/RegisterNewEmailHtml.soy
+++ b/resources/com/google/gerrit/server/mail/RegisterNewEmailHtml.soy
@@ -16,7 +16,7 @@
{namespace com.google.gerrit.server.mail.template}
-{template .RegisterNewEmailHtml}
+{template RegisterNewEmailHtml}
{@param email: ?}
<p>
Welcome to Gerrit Code Review at {$email.gerritHost}.
diff --git a/resources/com/google/gerrit/server/mail/RemoveFromAttentionSet.soy b/resources/com/google/gerrit/server/mail/RemoveFromAttentionSet.soy
index f116adb..a329f7b0 100644
--- a/resources/com/google/gerrit/server/mail/RemoveFromAttentionSet.soy
+++ b/resources/com/google/gerrit/server/mail/RemoveFromAttentionSet.soy
@@ -20,7 +20,7 @@
* The .RemoveFromAttentionSet template will determine the contents of the email related to a
* user being added to the attention set.
*/
-{template .RemoveFromAttentionSet kind="text"}
+{template RemoveFromAttentionSet kind="text"}
{@param change: ?}
{@param coverLetter: ?}
{@param email: ?}
diff --git a/resources/com/google/gerrit/server/mail/RemoveFromAttentionSetHtml.soy b/resources/com/google/gerrit/server/mail/RemoveFromAttentionSetHtml.soy
index 55eef13..c1c6185 100644
--- a/resources/com/google/gerrit/server/mail/RemoveFromAttentionSetHtml.soy
+++ b/resources/com/google/gerrit/server/mail/RemoveFromAttentionSetHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .RemoveFromAttentionSetHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template RemoveFromAttentionSetHtml}
{@param coverLetter: ?}
{@param email: ?}
{@param fromName: ?}
@@ -33,11 +35,11 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
{if $coverLetter}
<div style="white-space:pre-wrap">{$coverLetter}</div>
{/if}
-{/template}
\ No newline at end of file
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy b/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy
index bb84cf1..6dffa6b 100644
--- a/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy
+++ b/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy
@@ -20,7 +20,7 @@
* The .ReplacePatchSet template will determine the contents of the email
* related to a user submitting a new patchset for a change.
*/
-{template .ReplacePatchSet kind="text"}
+{template ReplacePatchSet kind="text"}
{@param change: ?}
{@param email: ?}
{@param fromEmail: ?}
diff --git a/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy b/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy
index 96cba5f..57c6db6 100644
--- a/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy
+++ b/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .ReplacePatchSetHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template ReplacePatchSetHtml}
{@param change: ?}
{@param email: ?}
{@param fromName: ?}
@@ -35,16 +37,20 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
- {call .Pre}{param content: $email.changeDetail /}{/call}
+ {call mailTemplate.Pre}
+ {param content: $email.changeDetail /}
+ {/call}
{if $email.sshHost}
- {call .Pre}{param content kind="html"}
- git pull ssh:{print '//'}{$email.sshHost}/{$projectName}{sp}
- {$patchSet.refName}
- {/param}{/call}
+ {call mailTemplate.Pre}
+ {param content kind="html"}
+ git pull ssh:{print '//'}{$email.sshHost}/{$projectName}{sp}
+ {$patchSet.refName}
+ {/param}
+ {/call}
{/if}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/Restored.soy b/resources/com/google/gerrit/server/mail/Restored.soy
index 0ec65b30..e09f95f 100644
--- a/resources/com/google/gerrit/server/mail/Restored.soy
+++ b/resources/com/google/gerrit/server/mail/Restored.soy
@@ -20,7 +20,7 @@
* The .Restored template will determine the contents of the email related to a
* change being restored.
*/
-{template .Restored kind="text"}
+{template Restored kind="text"}
{@param change: ?}
{@param coverLetter: ?}
{@param email: ?}
diff --git a/resources/com/google/gerrit/server/mail/RestoredHtml.soy b/resources/com/google/gerrit/server/mail/RestoredHtml.soy
index bcd358f..19c4b99 100644
--- a/resources/com/google/gerrit/server/mail/RestoredHtml.soy
+++ b/resources/com/google/gerrit/server/mail/RestoredHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .RestoredHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template RestoredHtml}
{@param email: ?}
{@param fromName: ?}
<p>
@@ -25,7 +27,7 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/Reverted.soy b/resources/com/google/gerrit/server/mail/Reverted.soy
index 32a65c6..bdfd0ad 100644
--- a/resources/com/google/gerrit/server/mail/Reverted.soy
+++ b/resources/com/google/gerrit/server/mail/Reverted.soy
@@ -20,7 +20,7 @@
* The .Reverted template will determine the contents of the email related
* to a change being reverted.
*/
-{template .Reverted kind="text"}
+{template Reverted kind="text"}
{@param change: ?}
{@param coverLetter: ?}
{@param email: ?}
diff --git a/resources/com/google/gerrit/server/mail/RevertedHtml.soy b/resources/com/google/gerrit/server/mail/RevertedHtml.soy
index 69260ad..d7b60df 100644
--- a/resources/com/google/gerrit/server/mail/RevertedHtml.soy
+++ b/resources/com/google/gerrit/server/mail/RevertedHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .RevertedHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template RevertedHtml}
{@param email: ?}
{@param fromName: ?}
<p>
@@ -25,7 +27,7 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
{/template}
diff --git a/resources/com/google/gerrit/server/mail/SetAssignee.soy b/resources/com/google/gerrit/server/mail/SetAssignee.soy
index 1fdf690..5e83cfb 100644
--- a/resources/com/google/gerrit/server/mail/SetAssignee.soy
+++ b/resources/com/google/gerrit/server/mail/SetAssignee.soy
@@ -20,7 +20,7 @@
* The .SetAssignee template will determine the contents of the email related
* to a user being assigned to a change.
*/
-{template .SetAssignee kind="text"}
+{template SetAssignee kind="text"}
{@param change: ?}
{@param email: ?}
{@param fromName: ?}
diff --git a/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy b/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy
index 1826314..4ff6cc1 100644
--- a/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy
+++ b/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy
@@ -16,7 +16,9 @@
{namespace com.google.gerrit.server.mail.template}
-{template .SetAssigneeHtml}
+import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';
+
+{template SetAssigneeHtml}
{@param diffLines: ?}
{@param email: ?}
{@param fromName: ?}
@@ -29,20 +31,26 @@
{if $email.changeUrl}
<p>
- {call .ViewChangeButton data="all" /}
+ {call mailTemplate.ViewChangeButton data="all" /}
</p>
{/if}
- {call .Pre}{param content: $email.changeDetail /}{/call}
+ {call mailTemplate.Pre}
+ {param content: $email.changeDetail /}
+ {/call}
{if $email.sshHost}
- {call .Pre}{param content kind="html"}
- git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
- {sp}{$patchSet.refName}
- {/param}{/call}
+ {call mailTemplate.Pre}
+ {param content kind="html"}
+ git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
+ {sp}{$patchSet.refName}
+ {/param}
+ {/call}
{/if}
{if $email.includeDiff}
- {call .UnifiedDiff}{param diffLines: $diffLines /}{/call}
+ {call mailTemplate.UnifiedDiff}
+ {param diffLines: $diffLines /}
+ {/call}
{/if}
{/template}
diff --git a/tools/nongoogle.bzl b/tools/nongoogle.bzl
index e8f12c8..3f5ef20 100644
--- a/tools/nongoogle.bzl
+++ b/tools/nongoogle.bzl
@@ -164,8 +164,8 @@
# Keep this version of Soy synchronized with the version used in Gitiles.
maven_jar(
name = "soy",
- artifact = "com.google.template:soy:2019-10-08",
- sha1 = "4518bf8bac2dbbed684849bc209c39c4cb546237",
+ artifact = "com.google.template:soy:2021-02-01",
+ sha1 = "8e833744832ba88059205a1e30e0898f925d8cb5",
)
# Test-only dependencies below.