Merge "Only use the externally set needs-review attribute in change-list-item"
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index 2e70760..ecc2ba0 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -2046,14 +2046,6 @@
 By default unset, meaning no bug report URL will be displayed. Administrators
 should set this to the URL of their issue tracker, if necessary.
 
-[[gerrit.reportBugText]]gerrit.reportBugText::
-+
-Text to be displayed in the link to the bug report URL.
-+
-Only used when `gerrit.reportBugUrl` is set.
-+
-Defaults to "Report Bug".
-
 [[gerrit.enableReverseDnsLookup]]gerrit.enableReverseDnsLookup::
 +
 Enable reverse DNS lookup during computing ref log entry for identified user,
diff --git a/Documentation/pg-plugin-dev.txt b/Documentation/pg-plugin-dev.txt
index e5404c7..8fb5655 100644
--- a/Documentation/pg-plugin-dev.txt
+++ b/Documentation/pg-plugin-dev.txt
@@ -30,15 +30,13 @@
 
 ``` html
 <dom-module id="my-plugin">
-  <template>
-    <script>
-      Gerrit.install(plugin => {
-        'use strict';
+  <script>
+    Gerrit.install(plugin => {
+      'use strict';
 
-        // Your code here.
-      });
-    </script>
-  </template>
+      // Your code here.
+    });
+  </script>
 </dom-module>
 ```
 
diff --git a/Documentation/rest-api-config.txt b/Documentation/rest-api-config.txt
index 3ea3ba1..96b376d 100644
--- a/Documentation/rest-api-config.txt
+++ b/Documentation/rest-api-config.txt
@@ -1799,9 +1799,6 @@
 Whether to enable the web UI for editing GPG keys.
 |`report_bug_url`    |optional|
 link:config-gerrit.html#gerrit.reportBugUrl[URL to report bugs].
-|`report_bug_text`   |optional, not set if default|
-link:config-gerrit.html#gerrit.reportBugText[Display text for report
-bugs link].
 |=================================
 
 [[hit-ration-info]]
diff --git a/WORKSPACE b/WORKSPACE
index 33b32fb..fa72a35 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -882,30 +882,30 @@
     sha1 = "42a25dc3219429f0e5d060061f71acb49bf010a0",
 )
 
-TRUTH_VERS = "0.46"
+TRUTH_VERS = "1.0"
 
 maven_jar(
     name = "truth",
     artifact = "com.google.truth:truth:" + TRUTH_VERS,
-    sha1 = "5907b14d1af802644e7f4fb7230419b709e06c6b",
+    sha1 = "998e5fb3fa31df716574b4c9e8d374855e800451",
 )
 
 maven_jar(
     name = "truth-java8-extension",
     artifact = "com.google.truth.extensions:truth-java8-extension:" + TRUTH_VERS,
-    sha1 = "e5ef57a6d1ab57695d373754df1efdddffc8484c",
+    sha1 = "d85fbc1daf0510821f552f2aa71d9605e97aa438",
 )
 
 maven_jar(
     name = "truth-liteproto-extension",
     artifact = "com.google.truth.extensions:truth-liteproto-extension:" + TRUTH_VERS,
-    sha1 = "c624d921293426bac9e5c9780b01eaef914c1a22",
+    sha1 = "7a279c50a0f93da15533cef4993b45606cf67d72",
 )
 
 maven_jar(
     name = "truth-proto-extension",
     artifact = "com.google.truth.extensions:truth-proto-extension:" + TRUTH_VERS,
-    sha1 = "585a0cedb3dac53ad3349826f163b28e59000d39",
+    sha1 = "8c0c2ea61750f02d0d5ce9c653106b6a5dc82d12",
 )
 
 maven_jar(
@@ -1072,18 +1072,18 @@
     sha1 = "0f5a654e4675769c716e5b387830d19b501ca191",
 )
 
-TESTCONTAINERS_VERSION = "1.11.3"
+TESTCONTAINERS_VERSION = "1.11.4"
 
 maven_jar(
     name = "testcontainers",
     artifact = "org.testcontainers:testcontainers:" + TESTCONTAINERS_VERSION,
-    sha1 = "154b69dd976416734b2fc809fb86e173ad9aa25b",
+    sha1 = "b0c70b1a3608f43deafba7649b344a422a442585",
 )
 
 maven_jar(
     name = "testcontainers-elasticsearch",
     artifact = "org.testcontainers:elasticsearch:" + TESTCONTAINERS_VERSION,
-    sha1 = "90713b61f5748d8894c31a20f955bd7f81ac2ece",
+    sha1 = "faab09a8876b8dbb326cbc10bbaa5ea86f5f5299",
 )
 
 maven_jar(
diff --git a/java/com/google/gerrit/common/data/testing/GroupReferenceSubject.java b/java/com/google/gerrit/common/data/testing/GroupReferenceSubject.java
index b65f64b..8ac0de1 100644
--- a/java/com/google/gerrit/common/data/testing/GroupReferenceSubject.java
+++ b/java/com/google/gerrit/common/data/testing/GroupReferenceSubject.java
@@ -21,6 +21,7 @@
 import com.google.common.truth.StringSubject;
 import com.google.common.truth.Subject;
 import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
 
 public class GroupReferenceSubject extends Subject {
 
@@ -39,7 +40,7 @@
     this.group = group;
   }
 
-  public ComparableSubject groupUuid() {
+  public ComparableSubject<AccountGroup.UUID> groupUuid() {
     isNotNull();
     return check("getUUID()").that(group.getUUID());
   }
diff --git a/java/com/google/gerrit/extensions/common/GerritInfo.java b/java/com/google/gerrit/extensions/common/GerritInfo.java
index 4746273..5c462d9 100644
--- a/java/com/google/gerrit/extensions/common/GerritInfo.java
+++ b/java/com/google/gerrit/extensions/common/GerritInfo.java
@@ -21,6 +21,5 @@
   public String docUrl;
   public Boolean editGpgKeys;
   public String reportBugUrl;
-  public String reportBugText;
   public String primaryWeblinkName;
 }
diff --git a/java/com/google/gerrit/extensions/common/testing/DiffInfoSubject.java b/java/com/google/gerrit/extensions/common/testing/DiffInfoSubject.java
index c94dc27..8853a30 100644
--- a/java/com/google/gerrit/extensions/common/testing/DiffInfoSubject.java
+++ b/java/com/google/gerrit/extensions/common/testing/DiffInfoSubject.java
@@ -21,6 +21,7 @@
 import com.google.common.truth.ComparableSubject;
 import com.google.common.truth.FailureMetadata;
 import com.google.common.truth.Subject;
+import com.google.gerrit.extensions.common.ChangeType;
 import com.google.gerrit.extensions.common.DiffInfo;
 import com.google.gerrit.extensions.common.DiffInfo.ContentEntry;
 import com.google.gerrit.truth.ListSubject;
@@ -45,7 +46,7 @@
         .thatCustom(diffInfo.content, ContentEntrySubject.contentEntries());
   }
 
-  public ComparableSubject changeType() {
+  public ComparableSubject<ChangeType> changeType() {
     isNotNull();
     return check("changeType").that(diffInfo.changeType);
   }
diff --git a/java/com/google/gerrit/extensions/common/testing/FileInfoSubject.java b/java/com/google/gerrit/extensions/common/testing/FileInfoSubject.java
index 35e67a6..d011d5d 100644
--- a/java/com/google/gerrit/extensions/common/testing/FileInfoSubject.java
+++ b/java/com/google/gerrit/extensions/common/testing/FileInfoSubject.java
@@ -45,7 +45,7 @@
     return check("linesDeleted").that(fileInfo.linesDeleted);
   }
 
-  public ComparableSubject status() {
+  public ComparableSubject<Character> status() {
     isNotNull();
     return check("status").that(fileInfo.status);
   }
diff --git a/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java b/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java
index 5564642..d827d5d 100644
--- a/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java
+++ b/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java
@@ -23,6 +23,7 @@
 import com.google.common.truth.StringSubject;
 import com.google.common.truth.Subject;
 import com.google.gerrit.extensions.common.GitPerson;
+import java.sql.Timestamp;
 import java.util.Date;
 import org.eclipse.jgit.lib.PersonIdent;
 
@@ -53,7 +54,7 @@
     return check("email").that(gitPerson.email);
   }
 
-  public ComparableSubject date() {
+  public ComparableSubject<Timestamp> date() {
     isNotNull();
     return check("date").that(gitPerson.date);
   }
diff --git a/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java b/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java
index 79bd005..a2f6002 100644
--- a/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java
+++ b/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java
@@ -22,7 +22,10 @@
 import com.google.common.truth.IterableSubject;
 import com.google.common.truth.StringSubject;
 import com.google.common.truth.Subject;
+import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.server.group.InternalGroup;
+import java.sql.Timestamp;
+import org.eclipse.jgit.lib.ObjectId;
 
 public class InternalGroupSubject extends Subject {
 
@@ -41,12 +44,12 @@
     this.group = group;
   }
 
-  public ComparableSubject groupUuid() {
+  public ComparableSubject<AccountGroup.UUID> groupUuid() {
     isNotNull();
     return check("getGroupUUID()").that(group.getGroupUUID());
   }
 
-  public ComparableSubject nameKey() {
+  public ComparableSubject<AccountGroup.NameKey> nameKey() {
     isNotNull();
     return check("getNameKey()").that(group.getNameKey());
   }
@@ -66,7 +69,7 @@
     return check("getDescription()").that(group.getDescription());
   }
 
-  public ComparableSubject ownerGroupUuid() {
+  public ComparableSubject<AccountGroup.UUID> ownerGroupUuid() {
     isNotNull();
     return check("getOwnerGroupUUID()").that(group.getOwnerGroupUUID());
   }
@@ -76,7 +79,7 @@
     return check("isVisibleToAll()").that(group.isVisibleToAll());
   }
 
-  public ComparableSubject createdOn() {
+  public ComparableSubject<Timestamp> createdOn() {
     isNotNull();
     return check("getCreatedOn()").that(group.getCreatedOn());
   }
@@ -91,7 +94,7 @@
     return check("getSubgroups()").that(group.getSubgroups());
   }
 
-  public ComparableSubject refState() {
+  public ComparableSubject<ObjectId> refState() {
     isNotNull();
     return check("getRefState()").that(group.getRefState());
   }
diff --git a/java/com/google/gerrit/server/restapi/config/GetServerInfo.java b/java/com/google/gerrit/server/restapi/config/GetServerInfo.java
index 43bfa81..2493cd9 100644
--- a/java/com/google/gerrit/server/restapi/config/GetServerInfo.java
+++ b/java/com/google/gerrit/server/restapi/config/GetServerInfo.java
@@ -293,7 +293,6 @@
     info.allProjects = allProjectsName.get();
     info.allUsers = allUsersName.get();
     info.reportBugUrl = config.getString("gerrit", null, "reportBugUrl");
-    info.reportBugText = config.getString("gerrit", null, "reportBugText");
     info.docUrl = getDocUrl();
     info.docSearch = docSearcher.isAvailable();
     info.editGpgKeys =
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java b/javatests/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
index 14521cc..4a74018 100644
--- a/javatests/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
@@ -70,7 +70,6 @@
   // gerrit
   @GerritConfig(name = "gerrit.allProjects", value = "Root")
   @GerritConfig(name = "gerrit.allUsers", value = "Users")
-  @GerritConfig(name = "gerrit.reportBugText", value = "REPORT BUG")
   @GerritConfig(name = "gerrit.reportBugUrl", value = "https://example.com/report")
 
   // suggest
@@ -112,7 +111,6 @@
     assertThat(i.gerrit.allProjects).isEqualTo("Root");
     assertThat(i.gerrit.allUsers).isEqualTo("Users");
     assertThat(i.gerrit.reportBugUrl).isEqualTo("https://example.com/report");
-    assertThat(i.gerrit.reportBugText).isEqualTo("REPORT BUG");
 
     // plugin
     assertThat(i.plugin.jsResourcePaths).isEmpty();
@@ -179,7 +177,6 @@
     assertThat(i.gerrit.allProjects).isEqualTo(AllProjectsNameProvider.DEFAULT);
     assertThat(i.gerrit.allUsers).isEqualTo(AllUsersNameProvider.DEFAULT);
     assertThat(i.gerrit.reportBugUrl).isNull();
-    assertThat(i.gerrit.reportBugText).isNull();
 
     // plugin
     assertThat(i.plugin.jsResourcePaths).isEmpty();
diff --git a/plugins/codemirror-editor b/plugins/codemirror-editor
index 2d3f265..56ebd4f 160000
--- a/plugins/codemirror-editor
+++ b/plugins/codemirror-editor
@@ -1 +1 @@
-Subproject commit 2d3f265ab1797d4179cbd6855c937989175d5ce5
+Subproject commit 56ebd4f7a2bf27f89aa11245ff77f7eefcf4a7d6
diff --git a/plugins/replication b/plugins/replication
index c449ba1..0cc0fc1 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit c449ba153358150927cb8d88e77f2b3d60d63ecc
+Subproject commit 0cc0fc15906cce7d66e633bb1f57a9f6f374166b
diff --git a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html
index 071beda..08131ab 100644
--- a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html
+++ b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html
@@ -43,33 +43,34 @@
       <tr id="loading" class$="loadingMsg [[computeLoadingClass(_loading)]]">
         <td>Loading...</td>
       </tr>
-      <template is="dom-repeat" items="[[_auditLog]]"
-          class$="[[computeLoadingClass(_loading)]]">
-        <tr class="table">
-          <td class="date">
-            <gr-date-formatter
-                has-tooltip
-                date-str="[[item.date]]">
-            </gr-date-formatter>
-          </td>
-          <td class="type">[[itemType(item.type)]]</td>
-          <td class="member">
-            <template is="dom-if" if="[[_isGroupEvent(item.type)]]">
-              <a href$="[[_computeGroupUrl(item.member)]]">
-                [[_getNameForGroup(item.member)]]
-              </a>
-            </template>
-            <template is="dom-if" if="[[!_isGroupEvent(item.type)]]">
-              <gr-account-link account="[[item.member]]"></gr-account-link>
-              [[_getIdForUser(item.member)]]
-            </template>
-          </td>
-          <td class="by-user">
-            <gr-account-link account="[[item.user]]"></gr-account-link>
-            [[_getIdForUser(item.user)]]
-          </td>
-        </tr>
-      </template>
+      <tbody class$="[[computeLoadingClass(_loading)]]">
+        <template is="dom-repeat" items="[[_auditLog]]">
+          <tr class="table">
+            <td class="date">
+              <gr-date-formatter
+                  has-tooltip
+                  date-str="[[item.date]]">
+              </gr-date-formatter>
+            </td>
+            <td class="type">[[itemType(item.type)]]</td>
+            <td class="member">
+              <template is="dom-if" if="[[_isGroupEvent(item.type)]]">
+                <a href$="[[_computeGroupUrl(item.member)]]">
+                  [[_getNameForGroup(item.member)]]
+                </a>
+              </template>
+              <template is="dom-if" if="[[!_isGroupEvent(item.type)]]">
+                <gr-account-link account="[[item.member]]"></gr-account-link>
+                [[_getIdForUser(item.member)]]
+              </template>
+            </td>
+            <td class="by-user">
+              <gr-account-link account="[[item.user]]"></gr-account-link>
+              [[_getIdForUser(item.user)]]
+            </td>
+          </tr>
+        </template>
+      </tbody>
     </table>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.html b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.html
index 1c02b3c..e284201 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.html
+++ b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.html
@@ -128,9 +128,8 @@
                       bind-value="{{_revisedRef}}"
                       class="editItem">
                     <input
-                        is=iron-input
-                        bind-value="{{_revisedRef}}"
-                        class="editItem">
+                        is="iron-input"
+                        bind-value="{{_revisedRef}}">
                   </iron-input>
                   <gr-button
                       link
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.js b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
index b1c7fd8..c944d12 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.js
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
@@ -1116,11 +1116,16 @@
     },
 
     _handleProjectsOldRoute(data) {
+      let params = '';
       if (data.params[1]) {
-        this._redirect('/admin/repos/' + encodeURIComponent(data.params[1]));
-      } else {
-        this._redirect('/admin/repos');
+        params = encodeURIComponent(data.params[1]);
+        if (data.params[1].includes(',')) {
+          params =
+              encodeURIComponent(data.params[1]).replace('%2C', ',');
+        }
       }
+
+      this._redirect(`/admin/repos/${params}`);
     },
 
     _handleRepoCommandsRoute(data) {
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
index 90d65137..27016e8 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
@@ -1108,6 +1108,28 @@
       });
 
       suite('repo routes', () => {
+        test('_handleProjectsOldRoute', () => {
+          const data = {params: {}};
+          element._handleProjectsOldRoute(data);
+          assert.isTrue(redirectStub.calledOnce);
+          assert.equal(redirectStub.lastCall.args[0], '/admin/repos/');
+        });
+
+        test('_handleProjectsOldRoute test', () => {
+          const data = {params: {1: 'test'}};
+          element._handleProjectsOldRoute(data);
+          assert.isTrue(redirectStub.calledOnce);
+          assert.equal(redirectStub.lastCall.args[0], '/admin/repos/test');
+        });
+
+        test('_handleProjectsOldRoute test,branches', () => {
+          const data = {params: {1: 'test,branches'}};
+          element._handleProjectsOldRoute(data);
+          assert.isTrue(redirectStub.calledOnce);
+          assert.equal(
+              redirectStub.lastCall.args[0], '/admin/repos/test,branches');
+        });
+
         test('_handleRepoRoute', () => {
           const data = {params: {0: 4321}};
           assertDataToParams(data, '_handleRepoRoute', {
diff --git a/polygerrit-ui/app/elements/gr-app-element.html b/polygerrit-ui/app/elements/gr-app-element.html
index af4d799..20f5996 100644
--- a/polygerrit-ui/app/elements/gr-app-element.html
+++ b/polygerrit-ui/app/elements/gr-app-element.html
@@ -72,10 +72,6 @@
         padding: 0 var(--default-horizontal-margin);
         border-bottom: 1px solid var(--border-color);
       }
-      gr-main-header.shadow {
-        /* Make it obvious for shadow dom testing */
-        border-bottom: 1px solid pink;
-      }
       footer {
         background-color: var(--footer-background-color);
         border-top: 1px solid var(--border-color);
@@ -125,7 +121,6 @@
       <gr-main-header
           id="mainHeader"
           search-query="{{params.query}}"
-          class$="[[_computeShadowClass(_isShadowDom)]]"
           on-mobile-search="_mobileSearchToggle">
       </gr-main-header>
     </gr-fixed-panel>
@@ -191,7 +186,7 @@
         <div class="errorMoreInfo">[[_lastError.moreInfo]]</div>
       </div>
     </main>
-    <footer r="contentinfo" class$="[[_computeShadowClass(_isShadowDom)]]">
+    <footer r="contentinfo">
       <div>
         Powered by <a href="https://www.gerritcodereview.com/" rel="noopener"
         target="_blank">Gerrit Code Review</a>
diff --git a/polygerrit-ui/app/elements/gr-app-element.js b/polygerrit-ui/app/elements/gr-app-element.js
index 3f41e5b..af69af8 100644
--- a/polygerrit-ui/app/elements/gr-app-element.js
+++ b/polygerrit-ui/app/elements/gr-app-element.js
@@ -73,7 +73,6 @@
       _lastError: Object,
       _lastSearchPage: String,
       _path: String,
-      _isShadowDom: Boolean,
       _pluginScreenName: {
         type: String,
         computed: '_computePluginScreenName(params)',
@@ -123,7 +122,6 @@
 
     ready() {
       this.$.reporting.appStarted(document.visibilityState === 'hidden');
-      this._isShadowDom = Polymer.Settings.useShadow;
       this.$.router.start();
 
       this.$.restAPI.getAccount().then(account => {
@@ -403,10 +401,6 @@
       this.$.registrationOverlay.close();
     },
 
-    _computeShadowClass(isShadowDom) {
-      return isShadowDom ? 'shadow' : '';
-    },
-
     _goToOpenedChanges() {
       Gerrit.Nav.navigateToStatusSearch('open');
     },