Merge changes I80ff9460,I0ec8c888,I96bc3759,Ifdbd9a94,If7919bc6
* changes:
Derive isOnParent from existing comment's side
Move comment thread filtering to top-level
First create thread elements, then group them
Move thread element creation out of group
Switch to imperative comment thread creation
diff --git a/Documentation/dev-contributing.txt b/Documentation/dev-contributing.txt
index bc9f782..8710a2b 100644
--- a/Documentation/dev-contributing.txt
+++ b/Documentation/dev-contributing.txt
@@ -166,7 +166,7 @@
link:https://github.com/google/google-java-format[`google-java-format`]
tool (version 1.6), and to format Bazel BUILD, WORKSPACE and .bzl files the
link:https://github.com/bazelbuild/buildtools/tree/master/buildifier[`buildifier`]
-tool (version 0.15.0).
+tool (version 0.17.2).
These tools automatically apply format according to the style guides; this
streamlines code review by reducing the need for time-consuming, tedious,
and contentious discussions about trivial issues like whitespace.
diff --git a/WORKSPACE b/WORKSPACE
index 37080b7..a5dbbaf 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -30,9 +30,9 @@
urls = ["https://raw.githubusercontent.com/google/closure-compiler/35d2b3340ff23a69441f10fa3bc820691c2942f2/contrib/externs/polymer-1.0.js"],
)
-load("@bazel_skylib//:lib.bzl", "versions")
+load("@bazel_skylib//lib:versions.bzl", "versions")
-versions.check(minimum_bazel_version = "0.17.1")
+versions.check(minimum_bazel_version = "0.19.0")
load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")
@@ -759,7 +759,7 @@
sha1 = "bb562ee73f740bb6b2bf7955f97be6b870d9e9f0",
)
-# When updading Bouncy Castle, also update it in bazlets.
+# When updating Bouncy Castle, also update it in bazlets.
BC_VERS = "1.60"
maven_jar(
@@ -833,10 +833,18 @@
sha1 = "f5aa318bda4c6c8d688c9d00b90681dcd82ce636",
)
+# elasticsearch-rest-client explicitly depends on this version
maven_jar(
- name = "httpmime",
- artifact = "org.apache.httpcomponents:httpmime:" + HTTPCOMP_VERS,
- sha1 = "2f8757f5ac5e38f46c794e5229d1f3c522e9b1df",
+ name = "httpasyncclient",
+ artifact = "org.apache.httpcomponents:httpasyncclient:4.1.2",
+ sha1 = "95aa3e6fb520191a0970a73cf09f62948ee614be",
+)
+
+# elasticsearch-rest-client explicitly depends on this version
+maven_jar(
+ name = "httpcore-nio",
+ artifact = "org.apache.httpcomponents:httpcore-nio:4.4.5",
+ sha1 = "f4be009e7505f6ceddf21e7960c759f413f15056",
)
# Test-only dependencies below.
@@ -956,9 +964,9 @@
maven_jar(
name = "derby",
- artifact = "org.apache.derby:derby:10.11.1.1",
+ artifact = "org.apache.derby:derby:10.12.1.1",
attach_source = False,
- sha1 = "df4b50061e8e4c348ce243b921f53ee63ba9bbe1",
+ sha1 = "75070c744a8e52a7d17b8b476468580309d5cd09",
)
JETTY_VERS = "9.4.12.v20180830"
@@ -1038,8 +1046,8 @@
maven_jar(
name = "postgresql",
- artifact = "org.postgresql:postgresql:42.2.4",
- sha1 = "dff98730c28a4b3a3263f0cf4abb9a3392f815a7",
+ artifact = "org.postgresql:postgresql:42.2.5",
+ sha1 = "951b7eda125f3137538a94e2cbdcf744088ad4c2",
)
maven_jar(
@@ -1079,10 +1087,12 @@
sha1 = "76716d529710fc03d1d429b43e3cedd4419f78d4",
)
+# When upgrading elasticsearch-rest-client, also upgrade http-niocore
+# and httpasyncclient as necessary.
maven_jar(
name = "elasticsearch-rest-client",
- artifact = "org.elasticsearch.client:elasticsearch-rest-client:6.4.2",
- sha1 = "a2baf2d4fdf03f31fbd39351a32bee25fcdfa1cf",
+ artifact = "org.elasticsearch.client:elasticsearch-rest-client:6.4.3",
+ sha1 = "5c24325430971ba2fa4769eb446f026b7680d5e7",
)
JACKSON_VERSION = "2.9.7"
@@ -1094,18 +1104,6 @@
)
maven_jar(
- name = "httpasyncclient",
- artifact = "org.apache.httpcomponents:httpasyncclient:4.1.2",
- sha1 = "95aa3e6fb520191a0970a73cf09f62948ee614be",
-)
-
-maven_jar(
- name = "httpcore-nio",
- artifact = "org.apache.httpcomponents:httpcore-nio:" + HTTPCOMP_VERS,
- sha1 = "a8c5e3c3bfea5ce23fb647c335897e415eb442e3",
-)
-
-maven_jar(
name = "testcontainers",
artifact = "org.testcontainers:testcontainers:1.8.0",
sha1 = "bc413912f7044f9f12aa0782853aef0a067ee52a",
diff --git a/java/com/google/gerrit/extensions/api/changes/ChangeApi.java b/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
index 0150e1e..dfa2128 100644
--- a/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
+++ b/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
@@ -49,17 +49,21 @@
* @return API for accessing the revision.
* @throws RestApiException if an error occurred.
*/
- RevisionApi current() throws RestApiException;
+ default RevisionApi current() throws RestApiException {
+ return revision("current");
+ }
/**
* Look up a revision of a change by number.
*
* @see #current()
*/
- RevisionApi revision(int id) throws RestApiException;
+ default RevisionApi revision(int id) throws RestApiException {
+ return revision(Integer.toString(id));
+ }
/**
- * Look up a revision of a change by commit SHA-1.
+ * Look up a revision of a change by commit SHA-1 or other supported revision string.
*
* @see #current()
*/
@@ -79,15 +83,23 @@
*/
ReviewerApi reviewer(String id) throws RestApiException;
- void abandon() throws RestApiException;
+ default void abandon() throws RestApiException {
+ abandon(new AbandonInput());
+ }
void abandon(AbandonInput in) throws RestApiException;
- void restore() throws RestApiException;
+ default void restore() throws RestApiException {
+ restore(new RestoreInput());
+ }
void restore(RestoreInput in) throws RestApiException;
- void move(String destination) throws RestApiException;
+ default void move(String destination) throws RestApiException {
+ MoveInput in = new MoveInput();
+ in.destinationBranch = destination;
+ move(in);
+ }
void move(MoveInput in) throws RestApiException;
@@ -132,7 +144,9 @@
*
* @see Changes#id(int)
*/
- ChangeApi revert() throws RestApiException;
+ default ChangeApi revert() throws RestApiException {
+ return revert(new RevertInput());
+ }
/**
* Create a new change that reverts this change.
@@ -144,10 +158,17 @@
/** Create a merge patch set for the change. */
ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException;
- List<ChangeInfo> submittedTogether() throws RestApiException;
+ default List<ChangeInfo> submittedTogether() throws RestApiException {
+ SubmittedTogetherInfo info =
+ submittedTogether(
+ EnumSet.noneOf(ListChangesOption.class), EnumSet.noneOf(SubmittedTogetherOption.class));
+ return info.changes;
+ }
- SubmittedTogetherInfo submittedTogether(EnumSet<SubmittedTogetherOption> options)
- throws RestApiException;
+ default SubmittedTogetherInfo submittedTogether(EnumSet<SubmittedTogetherOption> options)
+ throws RestApiException {
+ return submittedTogether(EnumSet.noneOf(ListChangesOption.class), options);
+ }
SubmittedTogetherInfo submittedTogether(
EnumSet<ListChangesOption> listOptions, EnumSet<SubmittedTogetherOption> submitOptions)
@@ -155,10 +176,14 @@
/** Publishes a draft change. */
@Deprecated
- void publish() throws RestApiException;
+ default void publish() throws RestApiException {
+ throw new UnsupportedOperationException("draft workflow is discontinued");
+ }
/** Rebase the current revision of a change using default options. */
- void rebase() throws RestApiException;
+ default void rebase() throws RestApiException {
+ rebase(new RebaseInput());
+ }
/** Rebase the current revision of a change. */
void rebase(RebaseInput in) throws RestApiException;
@@ -172,13 +197,19 @@
IncludedInInfo includedIn() throws RestApiException;
- AddReviewerResult addReviewer(AddReviewerInput in) throws RestApiException;
+ default AddReviewerResult addReviewer(String reviewer) throws RestApiException {
+ AddReviewerInput in = new AddReviewerInput();
+ in.reviewer = reviewer;
+ return addReviewer(in);
+ }
- AddReviewerResult addReviewer(String in) throws RestApiException;
+ AddReviewerResult addReviewer(AddReviewerInput in) throws RestApiException;
SuggestedReviewersRequest suggestReviewers() throws RestApiException;
- SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException;
+ default SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException {
+ return suggestReviewers().withQuery(query);
+ }
ChangeInfo get(EnumSet<ListChangesOption> options) throws RestApiException;
@@ -198,10 +229,16 @@
* <li>{@code SKIP_MERGEABLE} is omitted, so the {@code mergeable} bit <em>is</em> set.
* </ul>
*/
- ChangeInfo get() throws RestApiException;
+ default ChangeInfo get() throws RestApiException {
+ return get(
+ EnumSet.complementOf(
+ EnumSet.of(ListChangesOption.CHECK, ListChangesOption.SKIP_MERGEABLE)));
+ }
/** {@link #get(ListChangesOption...)} with no options included. */
- ChangeInfo info() throws RestApiException;
+ default ChangeInfo info() throws RestApiException {
+ return get(EnumSet.noneOf(ListChangesOption.class));
+ }
/**
* Retrieve change edit when exists.
@@ -210,7 +247,9 @@
* ChangeEditApi#get()}.
*/
@Deprecated
- EditInfo getEdit() throws RestApiException;
+ default EditInfo getEdit() throws RestApiException {
+ return edit().get().orElse(null);
+ }
/**
* Provides access to an API regarding the change edit of this change.
@@ -221,7 +260,11 @@
ChangeEditApi edit() throws RestApiException;
/** Create a new patch set with a new commit message. */
- void setMessage(String message) throws RestApiException;
+ default void setMessage(String message) throws RestApiException {
+ CommitMessageInput in = new CommitMessageInput();
+ in.message = message;
+ setMessage(in);
+ }
/** Create a new patch set with a new commit message. */
void setMessage(CommitMessageInput in) throws RestApiException;
@@ -347,16 +390,6 @@
}
@Override
- public RevisionApi current() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
- public RevisionApi revision(int id) throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public ReviewerApi reviewer(String id) throws RestApiException {
throw new NotImplementedException();
}
@@ -367,31 +400,16 @@
}
@Override
- public void abandon() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public void abandon(AbandonInput in) throws RestApiException {
throw new NotImplementedException();
}
@Override
- public void restore() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public void restore(RestoreInput in) throws RestApiException {
throw new NotImplementedException();
}
@Override
- public void move(String destination) throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public void move(MoveInput in) throws RestApiException {
throw new NotImplementedException();
}
@@ -412,27 +430,11 @@
}
@Override
- public ChangeApi revert() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public ChangeApi revert(RevertInput in) throws RestApiException {
throw new NotImplementedException();
}
@Override
- public void publish() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Deprecated
- @Override
- public void rebase() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public void rebase(RebaseInput in) throws RestApiException {
throw new NotImplementedException();
}
@@ -463,51 +465,21 @@
}
@Override
- public AddReviewerResult addReviewer(String in) throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public SuggestedReviewersRequest suggestReviewers() throws RestApiException {
throw new NotImplementedException();
}
@Override
- public SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public ChangeInfo get(EnumSet<ListChangesOption> options) throws RestApiException {
throw new NotImplementedException();
}
@Override
- public ChangeInfo get() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
- public ChangeInfo info() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
- public void setMessage(String message) throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public void setMessage(CommitMessageInput in) throws RestApiException {
throw new NotImplementedException();
}
@Override
- public EditInfo getEdit() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public ChangeEditApi edit() throws RestApiException {
throw new NotImplementedException();
}
diff --git a/java/com/google/gerrit/extensions/api/changes/RevisionApi.java b/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
index 75cf3a6..14dc589 100644
--- a/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
+++ b/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
@@ -14,6 +14,7 @@
package com.google.gerrit.extensions.api.changes;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.common.ActionInfo;
import com.google.gerrit.extensions.common.CherryPickChangeInfo;
@@ -34,7 +35,9 @@
public interface RevisionApi {
@Deprecated
- void delete() throws RestApiException;
+ default void delete() throws RestApiException {
+ throw new UnsupportedOperationException("draft workflow is discontinued");
+ }
String description() throws RestApiException;
@@ -42,22 +45,32 @@
ReviewResult review(ReviewInput in) throws RestApiException;
- void submit() throws RestApiException;
+ default void submit() throws RestApiException {
+ SubmitInput in = new SubmitInput();
+ submit(in);
+ }
void submit(SubmitInput in) throws RestApiException;
- BinaryResult submitPreview() throws RestApiException;
+ default BinaryResult submitPreview() throws RestApiException {
+ return submitPreview("zip");
+ }
BinaryResult submitPreview(String format) throws RestApiException;
@Deprecated
- void publish() throws RestApiException;
+ default void publish() throws RestApiException {
+ throw new UnsupportedOperationException("draft workflow is discontinued");
+ }
ChangeApi cherryPick(CherryPickInput in) throws RestApiException;
CherryPickChangeInfo cherryPickAsInfo(CherryPickInput in) throws RestApiException;
- ChangeApi rebase() throws RestApiException;
+ default ChangeApi rebase() throws RestApiException {
+ RebaseInput in = new RebaseInput();
+ return rebase(in);
+ }
ChangeApi rebase(RebaseInput in) throws RestApiException;
@@ -69,9 +82,11 @@
Set<String> reviewed() throws RestApiException;
- Map<String, FileInfo> files() throws RestApiException;
+ default Map<String, FileInfo> files() throws RestApiException {
+ return files(null);
+ }
- Map<String, FileInfo> files(String base) throws RestApiException;
+ Map<String, FileInfo> files(@Nullable String base) throws RestApiException;
Map<String, FileInfo> files(int parentNum) throws RestApiException;
@@ -165,33 +180,16 @@
* interface.
*/
class NotImplemented implements RevisionApi {
- @Deprecated
- @Override
- public void delete() throws RestApiException {
- throw new NotImplementedException();
- }
-
@Override
public ReviewResult review(ReviewInput in) throws RestApiException {
throw new NotImplementedException();
}
@Override
- public void submit() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public void submit(SubmitInput in) throws RestApiException {
throw new NotImplementedException();
}
- @Deprecated
- @Override
- public void publish() throws RestApiException {
- throw new NotImplementedException();
- }
-
@Override
public ChangeApi cherryPick(CherryPickInput in) throws RestApiException {
throw new NotImplementedException();
@@ -203,11 +201,6 @@
}
@Override
- public ChangeApi rebase() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public ChangeApi rebase(RebaseInput in) throws RestApiException {
throw new NotImplementedException();
}
@@ -253,11 +246,6 @@
}
@Override
- public Map<String, FileInfo> files() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public List<String> queryFiles(String query) throws RestApiException {
throw new NotImplementedException();
}
@@ -348,11 +336,6 @@
}
@Override
- public BinaryResult submitPreview() throws RestApiException {
- throw new NotImplementedException();
- }
-
- @Override
public BinaryResult submitPreview(String format) throws RestApiException {
throw new NotImplementedException();
}
diff --git a/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
index 358a3a8..0f731ed 100644
--- a/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
+++ b/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
@@ -43,7 +43,6 @@
import com.google.gerrit.extensions.common.ChangeMessageInfo;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.common.CommitMessageInput;
-import com.google.gerrit.extensions.common.EditInfo;
import com.google.gerrit.extensions.common.Input;
import com.google.gerrit.extensions.common.MergePatchSetInput;
import com.google.gerrit.extensions.common.PureRevertInfo;
@@ -256,16 +255,6 @@
}
@Override
- public RevisionApi current() throws RestApiException {
- return revision("current");
- }
-
- @Override
- public RevisionApi revision(int id) throws RestApiException {
- return revision(String.valueOf(id));
- }
-
- @Override
public RevisionApi revision(String id) throws RestApiException {
try {
return revisionApi.create(revisions.parse(change, IdString.fromDecoded(id)));
@@ -284,11 +273,6 @@
}
@Override
- public void abandon() throws RestApiException {
- abandon(new AbandonInput());
- }
-
- @Override
public void abandon(AbandonInput in) throws RestApiException {
try {
abandon.apply(change, in);
@@ -298,11 +282,6 @@
}
@Override
- public void restore() throws RestApiException {
- restore(new RestoreInput());
- }
-
- @Override
public void restore(RestoreInput in) throws RestApiException {
try {
restore.apply(change, in);
@@ -312,13 +291,6 @@
}
@Override
- public void move(String destination) throws RestApiException {
- MoveInput in = new MoveInput();
- in.destinationBranch = destination;
- move(in);
- }
-
- @Override
public void move(MoveInput in) throws RestApiException {
try {
move.apply(change, in);
@@ -360,11 +332,6 @@
}
@Override
- public ChangeApi revert() throws RestApiException {
- return revert(new RevertInput());
- }
-
- @Override
public ChangeApi revert(RevertInput in) throws RestApiException {
try {
return changeApi.id(revert.apply(change, in)._number);
@@ -383,20 +350,6 @@
}
@Override
- public List<ChangeInfo> submittedTogether() throws RestApiException {
- SubmittedTogetherInfo info =
- submittedTogether(
- EnumSet.noneOf(ListChangesOption.class), EnumSet.noneOf(SubmittedTogetherOption.class));
- return info.changes;
- }
-
- @Override
- public SubmittedTogetherInfo submittedTogether(EnumSet<SubmittedTogetherOption> options)
- throws RestApiException {
- return submittedTogether(EnumSet.noneOf(ListChangesOption.class), options);
- }
-
- @Override
public SubmittedTogetherInfo submittedTogether(
EnumSet<ListChangesOption> listOptions, EnumSet<SubmittedTogetherOption> submitOptions)
throws RestApiException {
@@ -411,17 +364,6 @@
}
}
- @Deprecated
- @Override
- public void publish() throws RestApiException {
- throw new UnsupportedOperationException("draft workflow is discontinued");
- }
-
- @Override
- public void rebase() throws RestApiException {
- rebase(new RebaseInput());
- }
-
@Override
public void rebase(RebaseInput in) throws RestApiException {
try {
@@ -466,13 +408,6 @@
}
@Override
- public AddReviewerResult addReviewer(String reviewer) throws RestApiException {
- AddReviewerInput in = new AddReviewerInput();
- in.reviewer = reviewer;
- return addReviewer(in);
- }
-
- @Override
public AddReviewerResult addReviewer(AddReviewerInput in) throws RestApiException {
try {
return postReviewers.apply(change, in);
@@ -491,11 +426,6 @@
};
}
- @Override
- public SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException {
- return suggestReviewers().withQuery(query);
- }
-
private List<SuggestedReviewerInfo> suggestReviewers(SuggestedReviewersRequest r)
throws RestApiException {
try {
@@ -517,30 +447,11 @@
}
@Override
- public ChangeInfo get() throws RestApiException {
- return get(
- EnumSet.complementOf(
- EnumSet.of(ListChangesOption.CHECK, ListChangesOption.SKIP_MERGEABLE)));
- }
-
- @Override
- public EditInfo getEdit() throws RestApiException {
- return edit().get().orElse(null);
- }
-
- @Override
public ChangeEditApi edit() throws RestApiException {
return changeEditApi.create(change);
}
@Override
- public void setMessage(String msg) throws RestApiException {
- CommitMessageInput in = new CommitMessageInput();
- in.message = msg;
- setMessage(in);
- }
-
- @Override
public void setMessage(CommitMessageInput in) throws RestApiException {
try {
putMessage.apply(change, in);
@@ -550,11 +461,6 @@
}
@Override
- public ChangeInfo info() throws RestApiException {
- return get(EnumSet.noneOf(ListChangesOption.class));
- }
-
- @Override
public void setHashtags(HashtagsInput input) throws RestApiException {
try {
postHashtags.apply(change, input);
diff --git a/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java b/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
index 3f03b57..f8a2ecb 100644
--- a/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
+++ b/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
@@ -18,6 +18,7 @@
import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.api.changes.ChangeApi;
import com.google.gerrit.extensions.api.changes.Changes;
import com.google.gerrit.extensions.api.changes.CherryPickInput;
@@ -227,12 +228,6 @@
}
@Override
- public void submit() throws RestApiException {
- SubmitInput in = new SubmitInput();
- submit(in);
- }
-
- @Override
public void submit(SubmitInput in) throws RestApiException {
try {
submit.apply(revision, in);
@@ -242,11 +237,6 @@
}
@Override
- public BinaryResult submitPreview() throws RestApiException {
- return submitPreview("zip");
- }
-
- @Override
public BinaryResult submitPreview(String format) throws RestApiException {
try {
submitPreview.setFormat(format);
@@ -257,22 +247,6 @@
}
@Override
- public void publish() throws RestApiException {
- throw new UnsupportedOperationException("draft workflow is discontinued");
- }
-
- @Override
- public void delete() throws RestApiException {
- throw new UnsupportedOperationException("draft workflow is discontinued");
- }
-
- @Override
- public ChangeApi rebase() throws RestApiException {
- RebaseInput in = new RebaseInput();
- return rebase(in);
- }
-
- @Override
public ChangeApi rebase(RebaseInput in) throws RestApiException {
try {
return changes.id(rebase.apply(revision, in)._number);
@@ -366,17 +340,7 @@
@SuppressWarnings("unchecked")
@Override
- public Map<String, FileInfo> files() throws RestApiException {
- try {
- return (Map<String, FileInfo>) listFiles.apply(revision).value();
- } catch (Exception e) {
- throw asRestApiException("Cannot retrieve files", e);
- }
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public Map<String, FileInfo> files(String base) throws RestApiException {
+ public Map<String, FileInfo> files(@Nullable String base) throws RestApiException {
try {
return (Map<String, FileInfo>) listFiles.setBase(base).apply(revision).value();
} catch (Exception e) {
diff --git a/java/com/google/gerrit/server/git/DefaultAdvertiseRefsHook.java b/java/com/google/gerrit/server/git/DefaultAdvertiseRefsHook.java
index ef5e65b..be8fcdb 100644
--- a/java/com/google/gerrit/server/git/DefaultAdvertiseRefsHook.java
+++ b/java/com/google/gerrit/server/git/DefaultAdvertiseRefsHook.java
@@ -14,8 +14,11 @@
package com.google.gerrit.server.git;
+import com.google.common.collect.ImmutableMap;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackendException;
+import java.io.IOException;
+import java.util.List;
import java.util.Map;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
@@ -28,7 +31,6 @@
* implements {@link org.eclipse.jgit.transport.AdvertiseRefsHook}.
*/
public class DefaultAdvertiseRefsHook extends AbstractAdvertiseRefsHook {
-
private final PermissionBackend.ForProject perm;
private final PermissionBackend.RefFilterOptions opts;
@@ -42,9 +44,24 @@
protected Map<String, Ref> getAdvertisedRefs(Repository repo, RevWalk revWalk)
throws ServiceMayNotContinueException {
try {
- return perm.filter(repo.getAllRefs(), repo, opts);
- } catch (PermissionBackendException e) {
- throw new ServiceMayNotContinueException(e);
+ Map<String, Ref> refs;
+ List<String> prefixes = opts.prefixes();
+ if (prefixes.isEmpty() || prefixes.get(0).isEmpty()) {
+ refs = repo.getAllRefs();
+ } else {
+ ImmutableMap.Builder<String, Ref> b = new ImmutableMap.Builder<>();
+ for (String prefix : prefixes) {
+ for (Ref ref : repo.getRefDatabase().getRefsByPrefix(prefix)) {
+ b.put(ref.getName(), ref);
+ }
+ }
+ refs = b.build();
+ }
+ return perm.filter(refs, repo, opts);
+ } catch (IOException | PermissionBackendException e) {
+ ServiceMayNotContinueException ex = new ServiceMayNotContinueException();
+ ex.initCause(e);
+ throw ex;
}
}
}
diff --git a/java/com/google/gerrit/server/permissions/PermissionBackend.java b/java/com/google/gerrit/server/permissions/PermissionBackend.java
index db3c961..bea760c 100644
--- a/java/com/google/gerrit/server/permissions/PermissionBackend.java
+++ b/java/com/google/gerrit/server/permissions/PermissionBackend.java
@@ -18,6 +18,7 @@
import static java.util.stream.Collectors.toSet;
import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.common.data.LabelType;
@@ -40,6 +41,7 @@
import java.util.Collections;
import java.util.EnumSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
@@ -367,12 +369,19 @@
/** Separately add reachable tags. */
public abstract boolean filterTagsSeparately();
+ /**
+ * Select only refs with names matching prefixes per {@link
+ * org.eclipse.jgit.lib.RefDatabase#getRefsByPrefix}.
+ */
+ public abstract ImmutableList<String> prefixes();
+
public abstract Builder toBuilder();
public static Builder builder() {
return new AutoValue_PermissionBackend_RefFilterOptions.Builder()
.setFilterMeta(false)
- .setFilterTagsSeparately(false);
+ .setFilterTagsSeparately(false)
+ .setPrefixes(Collections.singletonList(""));
}
@AutoValue.Builder
@@ -381,6 +390,8 @@
public abstract Builder setFilterTagsSeparately(boolean val);
+ public abstract Builder setPrefixes(List<String> prefixes);
+
public abstract RefFilterOptions build();
}
diff --git a/java/com/google/gerrit/server/restapi/change/Files.java b/java/com/google/gerrit/server/restapi/change/Files.java
index 1bb6bf2..b374fdc 100644
--- a/java/com/google/gerrit/server/restapi/change/Files.java
+++ b/java/com/google/gerrit/server/restapi/change/Files.java
@@ -18,6 +18,7 @@
import com.google.common.flogger.FluentLogger;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.common.FileInfo;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.AuthException;
@@ -332,7 +333,7 @@
return this;
}
- public ListFiles setBase(String base) {
+ public ListFiles setBase(@Nullable String base) {
this.base = base;
return this;
}
diff --git a/java/com/google/gerrit/server/restapi/change/QueryChanges.java b/java/com/google/gerrit/server/restapi/change/QueryChanges.java
index 4a145bc..d1eea44 100644
--- a/java/com/google/gerrit/server/restapi/change/QueryChanges.java
+++ b/java/com/google/gerrit/server/restapi/change/QueryChanges.java
@@ -82,6 +82,7 @@
imp.setStart(start);
}
+ @Override
public void setDynamicBean(String plugin, DynamicOptions.DynamicBean dynamicBean) {
imp.setDynamicBean(plugin, dynamicBean);
}
diff --git a/java/com/google/gerrit/sshd/commands/Query.java b/java/com/google/gerrit/sshd/commands/Query.java
index c4a21d1..4d8351e 100644
--- a/java/com/google/gerrit/sshd/commands/Query.java
+++ b/java/com/google/gerrit/sshd/commands/Query.java
@@ -104,6 +104,7 @@
processor.query(join(query, " "));
}
+ @Override
public void setDynamicBean(String plugin, DynamicOptions.DynamicBean dynamicBean) {
processor.setDynamicBean(plugin, dynamicBean);
}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
index ed4137d..30aef73 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -1692,7 +1692,7 @@
PushOneCommit.Result result = createChange();
String username = name("new-user");
- gApi.accounts().create(username).setActive(false);
+ accountOperations.newAccount().username(username).inactive().create();
AddReviewerInput in = new AddReviewerInput();
in.reviewer = username;
@@ -1714,7 +1714,7 @@
PushOneCommit.Result result = createChange();
String username = "user@domain.com";
- gApi.accounts().create(username).setActive(false);
+ accountOperations.newAccount().username(username).inactive().create();
AddReviewerInput in = new AddReviewerInput();
in.reviewer = username;
@@ -2096,7 +2096,7 @@
ChangeResource rsrc = parseResource(r);
String oldETag = rsrc.getETag();
- gApi.accounts().id(admin.id.get()).setStatus("new status");
+ accountOperations.account(admin.id).forUpdate().status("new status").update();
rsrc = parseResource(r);
assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
}
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java b/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java
index 9ff2c05..b8380f5 100644
--- a/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java
@@ -17,6 +17,7 @@
import static com.google.common.truth.Truth.assertThat;
import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.testsuite.account.AccountOperations;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.ChangeMessageInfo;
import com.google.gerrit.extensions.common.CommentInfo;
@@ -33,6 +34,7 @@
public class MailProcessorIT extends AbstractMailIT {
@Inject private MailProcessor mailProcessor;
+ @Inject private AccountOperations accountOperations;
@Test
public void parseAndPersistChangeMessage() throws Exception {
@@ -163,16 +165,13 @@
b.textContent(txt + textFooterForChange(changeInfo._number, ts));
// Set account state to inactive
- gApi.accounts().id("user").setActive(false);
+ accountOperations.account(user.id).forUpdate().inactive().update();
mailProcessor.process(b.build());
comments = gApi.changes().id(changeId).current().commentsAsList();
// Check that comment size has not changed
assertThat(comments).hasSize(2);
-
- // Reset
- gApi.accounts().id("user").setActive(true);
}
@Test
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
index bb545c9..93e97c4 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
@@ -45,13 +45,13 @@
case V2_4:
return "elasticsearch:2.4.6-alpine";
case V5_6:
- return "docker.elastic.co/elasticsearch/elasticsearch:5.6.12";
+ return "docker.elastic.co/elasticsearch/elasticsearch:5.6.13";
case V6_2:
return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4";
case V6_3:
return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.2";
case V6_4:
- return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2";
+ return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.3";
}
throw new IllegalStateException("No tests for version: " + version.name());
}
diff --git a/lib/httpcomponents/BUILD b/lib/httpcomponents/BUILD
index 8e9fbc5..a875eaf 100644
--- a/lib/httpcomponents/BUILD
+++ b/lib/httpcomponents/BUILD
@@ -28,20 +28,15 @@
)
java_library(
- name = "httpmime",
- data = ["//lib:LICENSE-Apache2.0"],
- visibility = ["//visibility:public"],
- exports = ["@httpmime//jar"],
-)
-
-java_library(
name = "httpasyncclient",
data = ["//lib:LICENSE-Apache2.0"],
+ visibility = ["//java/com/google/gerrit/elasticsearch:__pkg__"],
exports = ["@httpasyncclient//jar"],
)
java_library(
name = "httpcore-nio",
data = ["//lib:LICENSE-Apache2.0"],
+ visibility = ["//java/com/google/gerrit/elasticsearch:__pkg__"],
exports = ["@httpcore-nio//jar"],
)
diff --git a/plugins/replication b/plugins/replication
index a7b900b..bc5efb5 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit a7b900bd524c333c8ca2825e37fa781ac055ac36
+Subproject commit bc5efb5b60a5a93c25c075f3667841e02532a99c
diff --git a/plugins/singleusergroup b/plugins/singleusergroup
index cc636d7..0f798f6 160000
--- a/plugins/singleusergroup
+++ b/plugins/singleusergroup
@@ -1 +1 @@
-Subproject commit cc636d7e36afb62455a9f045b125d246fd84afd0
+Subproject commit 0f798f61c0c598c1499cbaacc1c609078c8bf0d5
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
index 148cd34..38f5f2f 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
@@ -531,6 +531,7 @@
patch-num="{{_patchRange.patchNum}}"
base-patch-num="{{_patchRange.basePatchNum}}"
files-expanded="[[_filesExpanded]]"
+ diff-prefs-disabled="[[_diffPrefsDisabled]]"
on-open-diff-prefs="_handleOpenDiffPrefs"
on-open-download-dialog="_handleOpenDownloadDialog"
on-open-upload-help-dialog="_handleOpenUploadHelpDialog"
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index a905c9f..24453be 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -108,6 +108,14 @@
type: Boolean,
value: false,
},
+ disableDiffPrefs: {
+ type: Boolean,
+ value: false,
+ },
+ _diffPrefsDisabled: {
+ type: Boolean,
+ computed: '_computeDiffPrefsDisabled(disableDiffPrefs, _loggedIn)',
+ },
_commentThreads: Array,
/** @type {?} */
_serverConfig: {
@@ -978,6 +986,8 @@
if (this.shouldSuppressKeyboardShortcut(e) ||
this.modifierPressed(e)) { return; }
+ if (this._diffPrefsDisabled) { return; }
+
e.preventDefault();
this.$.fileList.openDiffPrefs();
},
@@ -1664,5 +1674,9 @@
_computeCurrentRevision(currentRevision, revisions) {
return revisions && revisions[currentRevision];
},
+
+ _computeDiffPrefsDisabled(disableDiffPrefs, loggedIn) {
+ return disableDiffPrefs || !loggedIn;
+ },
});
})();
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
index 4b6cc6c..df06e55 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
@@ -291,6 +291,16 @@
test(', should open diff preferences', () => {
const stub = sandbox.stub(element.$.fileList.$.diffPreferences, 'open');
+ element._loggedIn = false;
+ element.disableDiffPrefs = true;
+ MockInteractions.pressAndReleaseKeyOn(element, 188, null, ',');
+ assert.isFalse(stub.called);
+
+ element._loggedIn = true;
+ MockInteractions.pressAndReleaseKeyOn(element, 188, null, ',');
+ assert.isFalse(stub.called);
+
+ element.disableDiffPrefs = false;
MockInteractions.pressAndReleaseKeyOn(element, 188, null, ',');
assert.isTrue(stub.called);
});
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
index 142e706..924ddab 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
@@ -249,10 +249,10 @@
<gr-diff-mode-selector
id="modeSelect"
mode="{{diffViewMode}}"
- save-on-change="[[loggedIn]]"></gr-diff-mode-selector>
+ save-on-change="[[!diffPrefsDisabled]]"></gr-diff-mode-selector>
<span id="diffPrefsContainer"
class="hideOnEdit"
- hidden$="[[_computePrefsButtonHidden(diffPrefs, loggedIn)]]"
+ hidden$="[[_computePrefsButtonHidden(diffPrefs, diffPrefsDisabled)]]"
hidden>
<gr-button
link
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.js b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.js
index 665472b..b9e6288 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.js
+++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.js
@@ -62,6 +62,7 @@
serverConfig: Object,
shownFileCount: Number,
diffPrefs: Object,
+ diffPrefsDisabled: Boolean,
diffViewMode: {
type: String,
notify: true,
@@ -186,11 +187,10 @@
});
},
- _computePrefsButtonHidden(prefs, loggedIn) {
- return !loggedIn || !prefs;
+ _computePrefsButtonHidden(prefs, diffPrefsDisabled) {
+ return diffPrefsDisabled || !prefs;
},
-
_fileListActionsVisible(shownFileCount, maxFilesForBulkActions) {
return shownFileCount <= maxFilesForBulkActions;
},
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.html b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.html
index e2685e1..adfeeb4 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.html
@@ -62,21 +62,21 @@
});
});
- test('Diff preferences hidden when no prefs or logged out', () => {
- element.loggedIn = false;
+ test('Diff preferences hidden when no prefs or diffPrefsDisabled', () => {
+ element.diffPrefsDisabled = true;
flushAsynchronousOperations();
assert.isTrue(element.$.diffPrefsContainer.hidden);
- element.loggedIn = true;
+ element.diffPrefsDisabled = false;
flushAsynchronousOperations();
assert.isTrue(element.$.diffPrefsContainer.hidden);
- element.loggedIn = false;
+ element.diffPrefsDisabled = true;
element.diffPrefs = {font_size: '12'};
flushAsynchronousOperations();
assert.isTrue(element.$.diffPrefsContainer.hidden);
- element.loggedIn = true;
+ element.diffPrefsDisabled = false;
flushAsynchronousOperations();
assert.isFalse(element.$.diffPrefsContainer.hidden);
});
@@ -265,7 +265,7 @@
suite('editMode behavior', () => {
setup(() => {
- element.loggedIn = true;
+ element.diffPrefsDisabled = false;
element.diffPrefs = {};
});
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js
index ff5b290..f2cfe87 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js
@@ -290,14 +290,14 @@
_resultsChanged(related, submittedTogether, conflicts,
cherryPicks, sameTopic) {
const results = [
- related,
- submittedTogether,
+ related && related.changes,
+ submittedTogether && submittedTogether.changes,
conflicts,
cherryPicks,
sameTopic,
];
for (let i = 0; i < results.length; i++) {
- if (results[i].length > 0) {
+ if (results[i] && results[i].length > 0) {
this.hidden = false;
this.fire('update', null, {bubbles: false});
return;
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.html b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.html
index bfeb694..48cc565 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.html
@@ -382,7 +382,7 @@
true);
});
- test('clear and empties', () => {
+ suite('hidden attribute and update event', () => {
const changes = [{
project: 'foo/bar',
change_id: 'Ideadbeef',
@@ -397,33 +397,68 @@
_current_revision_number: 1,
status: 'NEW',
}];
- element._relatedResponse = {changes};
- element._submittedTogether = {changes};
- element._conflicts = changes;
- element._cherryPicks = changes;
- element._sameTopic = changes;
- element.hidden = false;
- element.clear();
- assert.isTrue(element.hidden);
- assert.equal(element._relatedResponse.changes.length, 0);
- assert.equal(element._submittedTogether.changes.length, 0);
- assert.equal(element._conflicts.length, 0);
- assert.equal(element._cherryPicks.length, 0);
- assert.equal(element._sameTopic.length, 0);
- });
+ test('clear and empties', () => {
+ element._relatedResponse = {changes};
+ element._submittedTogether = {changes};
+ element._conflicts = changes;
+ element._cherryPicks = changes;
+ element._sameTopic = changes;
- test('update fires', () => {
- const updateHandler = sandbox.stub();
- element.addEventListener('update', updateHandler);
+ element.hidden = false;
+ element.clear();
+ assert.isTrue(element.hidden);
+ assert.equal(element._relatedResponse.changes.length, 0);
+ assert.equal(element._submittedTogether.changes.length, 0);
+ assert.equal(element._conflicts.length, 0);
+ assert.equal(element._cherryPicks.length, 0);
+ assert.equal(element._sameTopic.length, 0);
+ });
- element._resultsChanged([], [], [], [], []);
- assert.isTrue(element.hidden);
- assert.isFalse(updateHandler.called);
+ test('update fires', () => {
+ const updateHandler = sandbox.stub();
+ element.addEventListener('update', updateHandler);
- element._resultsChanged([], [], [], [], ['test']);
- assert.isFalse(element.hidden);
- assert.isTrue(updateHandler.called);
+ element._resultsChanged({}, {}, [], [], []);
+ assert.isTrue(element.hidden);
+ assert.isFalse(updateHandler.called);
+
+ element._resultsChanged({}, {}, [], [], ['test']);
+ assert.isFalse(element.hidden);
+ assert.isTrue(updateHandler.called);
+ });
+
+ suite('hiding and unhiding', () => {
+ test('related response', () => {
+ assert.isTrue(element.hidden);
+ element._resultsChanged({changes}, {}, [], [], []);
+ assert.isFalse(element.hidden);
+ });
+
+ test('submitted together', () => {
+ assert.isTrue(element.hidden);
+ element._resultsChanged({}, {changes}, [], [], []);
+ assert.isFalse(element.hidden);
+ });
+
+ test('conflicts', () => {
+ assert.isTrue(element.hidden);
+ element._resultsChanged({}, {}, changes, [], []);
+ assert.isFalse(element.hidden);
+ });
+
+ test('cherrypicks', () => {
+ assert.isTrue(element.hidden);
+ element._resultsChanged({}, {}, [], changes, []);
+ assert.isFalse(element.hidden);
+ });
+
+ test('same topic', () => {
+ assert.isTrue(element.hidden);
+ element._resultsChanged({}, {}, [], [], changes);
+ assert.isFalse(element.hidden);
+ });
+ });
});
test('_computeChangeURL uses Gerrit.Nav', () => {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
index 6ea0330..72c7285 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
@@ -91,10 +91,12 @@
text-align: right;
white-space: nowrap;
}
- a.date:link,
- a.date:visited {
+ span.date {
color: var(--deemphasized-text-color);
}
+ span.date:hover {
+ text-decoration: underline;
+ }
.actions {
display: flex;
justify-content: flex-end;
@@ -255,11 +257,11 @@
on-tap="_handleCommentDelete">
(Delete)
</gr-button>
- <a class="date" href$="[[_computeLinkToComment(comment)]]" on-tap="_handleLinkTap">
+ <span class="date" on-tap="_handleAnchorTap">
<gr-date-formatter
has-tooltip
date-str="[[comment.updated]]"></gr-date-formatter>
- </a>
+ </span>
<div class="show-hide">
<label class="show-hide">
<input type="checkbox" class="show-hide"
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.js b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.js
index 90d465f..5165db0 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.js
@@ -29,6 +29,8 @@
const REPORT_UPDATE_DRAFT = 'UpdateDraftComment';
const REPORT_DISCARD_DRAFT = 'DiscardDraftComment';
+ const FILE = 'FILE';
+
Polymer({
is: 'gr-diff-comment',
@@ -64,6 +66,12 @@
* @event comment-mouse-out
*/
+ /**
+ * Fired when the comment's timestamp is tapped.
+ *
+ * @event comment-anchor-tap
+ */
+
properties: {
changeNum: String,
/** @type {?} */
@@ -333,10 +341,6 @@
}
},
- _computeLinkToComment(comment) {
- return '#' + comment.line;
- },
-
_computeDeleteButtonClass(isAdmin, draft) {
return isAdmin && !draft ? 'showDeleteButtons' : '';
},
@@ -401,15 +405,16 @@
}, STORAGE_DEBOUNCE_INTERVAL);
},
- _handleLinkTap(e) {
+ _handleAnchorTap(e) {
e.preventDefault();
- const hash = this._computeLinkToComment(this.comment);
- // Don't add the hash to the window history if it's already there.
- // Otherwise you mess up expected back button behavior.
- if (window.location.hash == hash) { return; }
- // Change the URL but don’t trigger a nav event. Otherwise it will
- // reload the page.
- page.show(window.location.pathname + hash, null, false);
+ if (!this.comment.line) { return; }
+ this.dispatchEvent(new CustomEvent('comment-anchor-tap', {
+ bubbles: true,
+ detail: {
+ number: this.comment.line || FILE,
+ side: this.side,
+ },
+ }));
},
_handleEdit(e) {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment_test.html b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment_test.html
index ca85892..912e615 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment_test.html
@@ -99,15 +99,17 @@
'header middle content is not visible');
});
- test('clicking on date link does not trigger nav', () => {
- const showStub = sinon.stub(page, 'show');
+ test('clicking on date link fires event', () => {
+ element.side = 'PARENT';
+ const stub = sinon.stub();
+ element.addEventListener('comment-anchor-tap', stub);
const dateEl = element.$$('.date');
assert.ok(dateEl);
MockInteractions.tap(dateEl);
- const dest = window.location.pathname + '#5';
- assert(showStub.lastCall.calledWithExactly(dest, null, false),
- 'Should navigate to ' + dest + ' without triggering nav');
- showStub.restore();
+
+ assert.isTrue(stub.called);
+ assert.deepEqual(stub.lastCall.args[0].detail,
+ {side: element.side, number: element.comment.line});
});
test('message is not retrieved from storage when other edits', done => {
@@ -733,17 +735,6 @@
assert.isTrue(saveStub.calledOnce);
});
- test('clicking on date link does not trigger nav', () => {
- const showStub = sinon.stub(page, 'show');
- const dateEl = element.$$('.date');
- assert.ok(dateEl);
- MockInteractions.tap(dateEl);
- const dest = window.location.pathname + '#5';
- assert(showStub.lastCall.calledWithExactly(dest, null, false),
- 'Should navigate to ' + dest + ' without triggering nav');
- showStub.restore();
- });
-
test('proper event fires on resolve, comment is not saved', done => {
const save = sandbox.stub(element, 'save');
element.addEventListener('comment-update', e => {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
index 0866849..8acbd5d 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
@@ -286,11 +286,11 @@
<span>Diff view:</span>
<gr-diff-mode-selector
id="modeSelect"
- save-on-change="[[_loggedIn]]"
+ save-on-change="[[!_diffPrefsDisabled]]"
mode="{{changeViewState.diffMode}}"></gr-diff-mode-selector>
</div>
<span id="diffPrefsContainer"
- hidden$="[[_computePrefsButtonHidden(_prefs, _loggedIn)]]" hidden>
+ hidden$="[[_computePrefsButtonHidden(_prefs, _diffPrefsDisabled)]]" hidden>
<span class="preferences desktop">
<gr-button
link
@@ -336,6 +336,7 @@
project-name="[[_change.project]]"
view-mode="[[_diffMode]]"
is-blame-loaded="{{_isBlameLoaded}}"
+ on-comment-anchor-tap="_onLineSelected"
on-line-selected="_onLineSelected">
</gr-diff-host>
<gr-diff-preferences
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
index 6f361d8..59c5b1f 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
@@ -69,6 +69,14 @@
value() { return {}; },
observer: '_changeViewStateChanged',
},
+ disableDiffPrefs: {
+ type: Boolean,
+ value: false,
+ },
+ _diffPrefsDisabled: {
+ type: Boolean,
+ computed: '_computeDiffPrefsDisabled(disableDiffPrefs, _loggedIn)',
+ },
/** @type {?} */
_patchRange: Object,
/** @type {?} */
@@ -450,6 +458,7 @@
_handleCommaKey(e) {
if (this.shouldSuppressKeyboardShortcut(e) ||
this.modifierPressed(e)) { return; }
+ if (this._diffPrefsDisabled) { return; }
e.preventDefault();
this.$.diffPreferences.open();
@@ -791,8 +800,8 @@
(unresolvedString ? `${unresolvedString}` : '');
},
- _computePrefsButtonHidden(prefs, loggedIn) {
- return !loggedIn || !prefs;
+ _computePrefsButtonHidden(prefs, prefsDisabled) {
+ return prefsDisabled || !prefs;
},
_handleFileChange(e) {
@@ -1012,5 +1021,9 @@
if (this.shouldSuppressKeyboardShortcut(e)) { return; }
this.$.diffHost.expandAllContext();
},
+
+ _computeDiffPrefsDisabled(disableDiffPrefs, loggedIn) {
+ return disableDiffPrefs || !loggedIn;
+ },
});
})();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
index 431578b..3a5ca51 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
@@ -135,6 +135,7 @@
element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
element._path = 'glados.txt';
element.changeViewState.selectedFileIndex = 1;
+ element._loggedIn = true;
const diffNavStub = sandbox.stub(Gerrit.Nav, 'navigateToDiff');
const changeNavStub = sandbox.stub(Gerrit.Nav, 'navigateToChange');
@@ -177,6 +178,10 @@
MockInteractions.pressAndReleaseKeyOn(element, 188, null, ',');
assert(showPrefsStub.calledOnce);
+ element.disableDiffPrefs = true;
+ MockInteractions.pressAndReleaseKeyOn(element, 188, null, ',');
+ assert(showPrefsStub.calledOnce);
+
let scrollStub = sandbox.stub(element.$.cursor, 'moveToNextChunk');
MockInteractions.pressAndReleaseKeyOn(element, 78, null, 'n');
assert(scrollStub.calledOnce);
@@ -343,23 +348,39 @@
PARENT), 'Should navigate to /c/42/1');
});
- test('Diff preferences hidden when no prefs or logged out', () => {
- element._loggedIn = false;
- flushAsynchronousOperations();
- assert.isTrue(element.$.diffPrefsContainer.hidden);
+ suite('diff prefs hidden', () => {
+ test('when no prefs or logged out', () => {
+ element.disableDiffPrefs = false;
+ element._loggedIn = false;
+ flushAsynchronousOperations();
+ assert.isTrue(element.$.diffPrefsContainer.hidden);
- element._loggedIn = true;
- flushAsynchronousOperations();
- assert.isTrue(element.$.diffPrefsContainer.hidden);
+ element._loggedIn = true;
+ flushAsynchronousOperations();
+ assert.isTrue(element.$.diffPrefsContainer.hidden);
- element._loggedIn = false;
- element._prefs = {font_size: '12'};
- flushAsynchronousOperations();
- assert.isTrue(element.$.diffPrefsContainer.hidden);
+ element._loggedIn = false;
+ element._prefs = {font_size: '12'};
+ flushAsynchronousOperations();
+ assert.isTrue(element.$.diffPrefsContainer.hidden);
- element._loggedIn = true;
- flushAsynchronousOperations();
- assert.isFalse(element.$.diffPrefsContainer.hidden);
+ element._loggedIn = true;
+ flushAsynchronousOperations();
+ assert.isFalse(element.$.diffPrefsContainer.hidden);
+ });
+
+ test('when disableDiffPrefs is set', () => {
+ element._loggedIn = true;
+ element._prefs = {font_size: '12'};
+ element.disableDiffPrefs = false;
+ flushAsynchronousOperations();
+
+ assert.isFalse(element.$.diffPrefsContainer.hidden);
+ element.disableDiffPrefs = true;
+ flushAsynchronousOperations();
+
+ assert.isTrue(element.$.diffPrefsContainer.hidden);
+ });
});
test('prefsButton opens gr-diff-preferences', () => {
diff --git a/tools/BUILD b/tools/BUILD
index c368eed..aefb867 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -13,7 +13,7 @@
default_java_toolchain(
name = "error_prone_warnings_toolchain",
- bootclasspath = ["@bazel_tools//tools/jdk:platformclasspath9.jar"],
+ bootclasspath = ["@bazel_tools//tools/jdk:platformclasspath.jar"],
jvm_opts = JDK9_JVM_OPTS,
package_configuration = [
":error_prone",