Merge "ChangeRebuilderImpl: Handle createdOn > lastUpdatedOn" into stable-2.15
diff --git a/WORKSPACE b/WORKSPACE
index 918f6f5..0b203d9 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -909,14 +909,14 @@
 
 maven_jar(
     name = "asciidoctor",
-    artifact = "org.asciidoctor:asciidoctorj:1.5.4.1",
-    sha1 = "f7ddfb2bbed2f8da3f9ad0d1a5514f04b4274a5a",
+    artifact = "org.asciidoctor:asciidoctorj:1.5.6",
+    sha1 = "bb757d4b8b0f8438ce2ed781f6688cc6c01d9237",
 )
 
 maven_jar(
     name = "jruby",
-    artifact = "org.jruby:jruby-complete:9.1.5.0",
-    sha1 = "00d0003e99da3c4d830b12c099691ce910c84e39",
+    artifact = "org.jruby:jruby-complete:9.1.13.0",
+    sha1 = "8903bf42272062e87a7cbc1d98919e0729a9939f",
 )
 
 # When upgrading Elasticsearch, make sure it's compatible with Lucene
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
index a5b381a..689c5b7 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
@@ -244,7 +244,8 @@
         "Update git submodules\n\n"
             + "* Update "
             + name("subscribed-to-project")
-            + " from branch 'master'");
+            + " from branch 'master'\n  to "
+            + subHEAD.getName());
 
     // The next commit should generate only its commit message,
     // omitting previous commit logs
@@ -256,7 +257,8 @@
         "Update git submodules\n\n"
             + "* Update "
             + name("subscribed-to-project")
-            + " from branch 'master'"
+            + " from branch 'master'\n  to "
+            + subHEAD.getName()
             + "\n  - "
             + subCommitMsg.getShortMessage());
   }
@@ -280,7 +282,8 @@
         "Update git submodules\n\n"
             + "* Update "
             + name("subscribed-to-project")
-            + " from branch 'master'");
+            + " from branch 'master'\n  to "
+            + subHEAD.getName());
 
     // The next commit should generate only its commit message,
     // omitting previous commit logs
@@ -292,7 +295,8 @@
         "Update git submodules\n\n"
             + "* Update "
             + name("subscribed-to-project")
-            + " from branch 'master'"
+            + " from branch 'master'\n  to "
+            + subHEAD.getName()
             + "\n  - "
             + subCommitMsg.getFullMessage().replace("\n", "\n    "));
   }
@@ -510,7 +514,7 @@
 
   @Test
   @GerritConfig(name = "submodule.verboseSuperprojectUpdate", value = "SUBJECT_ONLY")
-  @GerritConfig(name = "submodule.maxCombinedCommitMessageSize", value = "175")
+  @GerritConfig(name = "submodule.maxCombinedCommitMessageSize", value = "220")
   public void submoduleSubjectCommitMessageSizeLimit() throws Exception {
     assume().that(isSubmitWholeTopicEnabled()).isFalse();
     testSubmoduleSubjectCommitMessageAndExpectTruncation();
@@ -535,7 +539,7 @@
         superRepo,
         "master",
         String.format(
-            "Update git submodules\n\n* Update %s from branch 'master'\n  - %s\n\n[...]",
-            name("subscribed-to-project"), subCommitMsg.getShortMessage()));
+            "Update git submodules\n\n* Update %s from branch 'master'\n  to %s\n  - %s\n\n[...]",
+            name("subscribed-to-project"), subHEAD.getName(), subCommitMsg.getShortMessage()));
   }
 }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
index 919136e..5885ab5 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
@@ -118,7 +118,8 @@
     return name.endsWith("_log")
         || name.endsWith(".log")
         || name.endsWith(".run")
-        || name.endsWith(".pid");
+        || name.endsWith(".pid")
+        || name.endsWith(".json");
   }
 
   private boolean isCompressed(Path entry) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java
index eb61d3c..3d258c3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java
@@ -75,7 +75,7 @@
   @Override
   public Description getDescription(ChangeResource rsrc) {
     return new Description()
-        .setLabel("Ready")
+        .setLabel("Start Review")
         .setTitle("Set Ready For Review")
         .setVisible(
             rsrc.isUserOwner()
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
index 08d04ec..ea93f96 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
@@ -30,6 +30,7 @@
 /** Runnable to enable scheduling gc to run periodically */
 public class GarbageCollectionRunner implements Runnable {
   private static final Logger gcLog = LoggerFactory.getLogger(GarbageCollection.LOG_NAME);
+  private static final Logger log = LoggerFactory.getLogger(GarbageCollectionRunner.class);
 
   static class Lifecycle implements LifecycleListener {
     private final WorkQueue queue;
@@ -49,9 +50,9 @@
       long interval = scheduleConfig.getInterval();
       long delay = scheduleConfig.getInitialDelay();
       if (delay == MISSING_CONFIG && interval == MISSING_CONFIG) {
-        gcLog.info("Ignoring missing gc schedule configuration");
+        log.info("Ignoring missing gc schedule configuration");
       } else if (delay < 0 || interval <= 0) {
-        gcLog.warn(String.format("Ignoring invalid gc schedule configuration: %s", scheduleConfig));
+        log.warn(String.format("Ignoring invalid gc schedule configuration: %s", scheduleConfig));
       } else {
         @SuppressWarnings("unused")
         Future<?> possiblyIgnoredError =
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
index 8ec62aa..3eb0040 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
@@ -559,6 +559,7 @@
     msgbuf.append(" from branch '");
     msgbuf.append(s.getSubmodule().getShortName());
     msgbuf.append("'");
+    msgbuf.append("\n  to " + newCommit.getName());
 
     // newly created submodule gitlink, do not append whole history
     if (oldCommit == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_109.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_109.java
index 5e77c12..c5a6015 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_109.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_109.java
@@ -29,7 +29,7 @@
   @Override
   protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
     try (StatementExecutor e = newExecutor(db)) {
-      e.execute("UPDATE changes SET status = 'n' WHERE status = 's'");
+      e.execute("UPDATE changes SET status = 'n', created_on = created_on WHERE status = 's'");
     }
   }
 }
diff --git a/lib/js/npm.bzl b/lib/js/npm.bzl
new file mode 100644
index 0000000..0fd575d
--- /dev/null
+++ b/lib/js/npm.bzl
@@ -0,0 +1,11 @@
+NPM_VERSIONS = {
+    "bower": "1.8.2",
+    "crisper": "2.0.2",
+    "vulcanize": "1.14.8",
+}
+
+NPM_SHA1S = {
+    "bower": "adf53529c8d4af02ef24fb8d5341c1419d33e2f7",
+    "crisper": "7183c58cea33632fb036c91cefd1b43e390d22a2",
+    "vulcanize": "679107f251c19ab7539529b1e3fdd40829e6fc63",
+}
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
index d31d74e..5f88565 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
@@ -127,7 +127,6 @@
         .title,
         .value {
           display: table-cell;
-          vertical-align: middle;
         }
         .title {
           padding-right: .5em;
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.html b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
index 845bdaf..e04eeb7 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.html
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
@@ -126,13 +126,13 @@
         top: 10px;
       }
       .replyContainer {
-        padding: .5em 0 1em;
+        padding: .5em 0 0 0;
       }
       .positiveVote {
-        box-shadow: inset 0 4.4em #d4ffd4;
+        box-shadow: inset 0 3.8em #d4ffd4;
       }
       .negativeVote {
-        box-shadow: inset 0 4.4em #ffd4d4;
+        box-shadow: inset 0 3.8em #ffd4d4;
       }
       gr-account-label {
         --gr-account-label-text-style: {
@@ -156,9 +156,13 @@
           <div class="content">
             <div class="message hideOnOpen">[[message.message]]</div>
             <gr-formatted-text
+                no-trailing-margin
                 class="message hideOnCollapsed"
                 content="[[message.message]]"
                 config="[[_commentLinks]]"></gr-formatted-text>
+            <div class="replyContainer" hidden$="[[!showReplyButton]]" hidden>
+              <gr-button link small on-tap="_handleReplyTap">Reply</gr-button>
+            </div>
             <gr-comment-list
                 comments="[[comments]]"
                 change-num="[[changeNum]]"
@@ -196,9 +200,6 @@
           </a>
         </template>
       </div>
-      <div class="replyContainer" hidden$="[[!showReplyButton]]" hidden>
-        <gr-button small on-tap="_handleReplyTap">Reply</gr-button>
-      </div>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.js b/polygerrit-ui/app/elements/change/gr-message/gr-message.js
index 5c49c1c..d907f3b 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.js
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.js
@@ -131,7 +131,8 @@
     },
 
     _computeShowReplyButton(message, loggedIn) {
-      return !!message.message && loggedIn;
+      return !!message.message && loggedIn &&
+          !this._computeIsAutomated(message);
     },
 
     _computeExpanded(expanded) {
@@ -163,7 +164,7 @@
 
     _computeIsAutomated(message) {
       return !!(message.reviewer ||
-          message.type === 'REVIEWER_UPDATE' ||
+          this._computeIsReviewerUpdate(message) ||
           (message.tag && message.tag.startsWith('autogenerated')));
     },
 
diff --git a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.html b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.html
index 28a9e0e..1ef5a0c 100644
--- a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.html
+++ b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.html
@@ -28,7 +28,7 @@
       ul,
       blockquote,
       gr-linked-text.pre {
-        margin: 0 0 1.4em 0;
+        margin: 0 0 .8em 0;
       }
       p,
       ul,
diff --git a/polygerrit-ui/app/styles/gr-change-list-styles.html b/polygerrit-ui/app/styles/gr-change-list-styles.html
index c479c1a..e082aab 100644
--- a/polygerrit-ui/app/styles/gr-change-list-styles.html
+++ b/polygerrit-ui/app/styles/gr-change-list-styles.html
@@ -80,7 +80,8 @@
         .project,
         .branch,
         .updated,
-        .label {
+        .label,
+        .assignee {
           display: none;
         }
         .star {
diff --git a/tools/bzl/asciidoc.bzl b/tools/bzl/asciidoc.bzl
index 28c8012..ea6e9df 100644
--- a/tools/bzl/asciidoc.bzl
+++ b/tools/bzl/asciidoc.bzl
@@ -47,6 +47,7 @@
     inputs = [ctx.file._exe, ctx.file.src],
     outputs = [ctx.outputs.out],
     command = cmd,
+    use_default_shell_env = True,
     progress_message = "Replacing macros in %s" % ctx.file.src.short_path,
   )
 
diff --git a/tools/bzl/js.bzl b/tools/bzl/js.bzl
index 77ac71b..d5d2193 100644
--- a/tools/bzl/js.bzl
+++ b/tools/bzl/js.bzl
@@ -2,17 +2,7 @@
 
 GERRIT = "GERRIT:"
 
-NPM_VERSIONS = {
-    "bower": "1.8.2",
-    "crisper": "2.0.2",
-    "vulcanize": "1.14.8",
-}
-
-NPM_SHA1S = {
-    "bower": "adf53529c8d4af02ef24fb8d5341c1419d33e2f7",
-    "crisper": "7183c58cea33632fb036c91cefd1b43e390d22a2",
-    "vulcanize": "679107f251c19ab7539529b1e3fdd40829e6fc63",
-}
+load("//lib/js:npm.bzl", "NPM_VERSIONS", "NPM_SHA1S")
 
 def _npm_tarball(name):
   return "%s@%s.npm_binary.tgz" % (name, NPM_VERSIONS[name])