Merge "Honor date format from preference when display dates" into stable-3.1
diff --git a/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/CloneUsingBothProtocols.scala b/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/CloneUsingBothProtocols.scala
index 9e2aca0..c5a7cba 100644
--- a/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/CloneUsingBothProtocols.scala
+++ b/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/CloneUsingBothProtocols.scala
@@ -14,29 +14,12 @@
 
 package com.google.gerrit.scenarios
 
-import java.io._
-
-import com.github.barbasa.gatling.git.protocol.GitProtocol
-import com.github.barbasa.gatling.git.request.builder.GitRequestBuilder
-import com.github.barbasa.gatling.git.{GatlingGitConfiguration, GitRequestSession}
 import io.gatling.core.Predef._
-import io.gatling.core.feeder.FileBasedFeederBuilder
 import io.gatling.core.structure.ScenarioBuilder
-import org.apache.commons.io.FileUtils
-import org.eclipse.jgit.hooks._
 
 import scala.concurrent.duration._
 
-class CloneUsingBothProtocols extends Simulation {
-
-  implicit val conf: GatlingGitConfiguration = GatlingGitConfiguration()
-  implicit val postMessageHook: Option[String] = Some(s"hooks/${CommitMsgHook.NAME}")
-
-  private val name: String = this.getClass.getSimpleName
-  private val file = s"data/$name.json"
-  private val data: FileBasedFeederBuilder[Any]#F = jsonFile(file).circular
-  private val request = new GitRequestBuilder(GitRequestSession("${cmd}", "${url}"))
-  private val protocol: GitProtocol = GitProtocol()
+class CloneUsingBothProtocols extends GitSimulation {
 
   private val test: ScenarioBuilder = scenario(name)
       .feed(data)
@@ -46,16 +29,4 @@
     test.inject(
       constantUsersPerSec(1) during (2 seconds)
     )).protocols(protocol)
-
-  after {
-    Thread.sleep(5000)
-    val path = conf.tmpBasePath
-    try {
-      FileUtils.deleteDirectory(new File(path))
-    } catch {
-      case e: IOException =>
-        System.err.println("Unable to delete temporary directory " + path)
-        e.printStackTrace()
-    }
-  }
 }
diff --git a/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/GitSimulation.scala b/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/GitSimulation.scala
new file mode 100644
index 0000000..4d5130f
--- /dev/null
+++ b/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/GitSimulation.scala
@@ -0,0 +1,48 @@
+// Copyright (C) 2020 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.
+
+package com.google.gerrit.scenarios
+
+import java.io.{File, IOException}
+
+import com.github.barbasa.gatling.git.protocol.GitProtocol
+import com.github.barbasa.gatling.git.request.builder.GitRequestBuilder
+import com.github.barbasa.gatling.git.{GatlingGitConfiguration, GitRequestSession}
+import io.gatling.core.Predef._
+import io.gatling.core.feeder.FileBasedFeederBuilder
+import org.apache.commons.io.FileUtils
+import org.eclipse.jgit.hooks.CommitMsgHook
+
+class GitSimulation extends Simulation {
+
+  implicit val conf: GatlingGitConfiguration = GatlingGitConfiguration()
+  implicit val postMessageHook: Option[String] = Some(s"hooks/${CommitMsgHook.NAME}")
+
+  protected val name: String = this.getClass.getSimpleName
+  protected val data: FileBasedFeederBuilder[Any]#F = jsonFile(s"data/$name.json").circular
+  protected val request = new GitRequestBuilder(GitRequestSession("${cmd}", "${url}"))
+  protected val protocol: GitProtocol = GitProtocol()
+
+  after {
+    Thread.sleep(5000)
+    val path = conf.tmpBasePath
+    try {
+      FileUtils.deleteDirectory(new File(path))
+    } catch {
+      case e: IOException =>
+        System.err.println("Unable to delete temporary directory " + path)
+        e.printStackTrace()
+    }
+  }
+}
diff --git a/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/ReplayRecordsFromFeeder.scala b/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/ReplayRecordsFromFeeder.scala
index 5a3bb99..82342be 100644
--- a/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/ReplayRecordsFromFeeder.scala
+++ b/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/ReplayRecordsFromFeeder.scala
@@ -14,29 +14,12 @@
 
 package com.google.gerrit.scenarios
 
-import java.io._
-
-import com.github.barbasa.gatling.git.protocol.GitProtocol
-import com.github.barbasa.gatling.git.request.builder.GitRequestBuilder
-import com.github.barbasa.gatling.git.{GatlingGitConfiguration, GitRequestSession}
 import io.gatling.core.Predef._
-import io.gatling.core.feeder.FileBasedFeederBuilder
 import io.gatling.core.structure.ScenarioBuilder
-import org.apache.commons.io.FileUtils
-import org.eclipse.jgit.hooks._
 
 import scala.concurrent.duration._
 
-class ReplayRecordsFromFeeder extends Simulation {
-
-  implicit val conf: GatlingGitConfiguration = GatlingGitConfiguration()
-  implicit val postMessageHook: Option[String] = Some(s"hooks/${CommitMsgHook.NAME}")
-
-  private val name: String = this.getClass.getSimpleName
-  private val file = s"data/$name.json"
-  private val data: FileBasedFeederBuilder[Any]#F = jsonFile(file).circular
-  private val request = new GitRequestBuilder(GitRequestSession("${cmd}", "${url}"))
-  private val protocol: GitProtocol = GitProtocol()
+class ReplayRecordsFromFeeder extends GitSimulation {
 
   private val test: ScenarioBuilder = scenario(name)
       .repeat(10000) {
@@ -53,16 +36,4 @@
       constantUsersPerSec(20) during (15 seconds) randomized
     )).protocols(protocol)
       .maxDuration(60 seconds)
-
-  after {
-    Thread.sleep(5000)
-    val path = conf.tmpBasePath
-    try {
-      FileUtils.deleteDirectory(new File(path))
-    } catch {
-      case e: IOException =>
-        System.err.println("Unable to delete temporary directory " + path)
-        e.printStackTrace()
-    }
-  }
 }
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js
index be4c497..2ac5ee8 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js
@@ -18,7 +18,7 @@
   'use strict';
 
   const LookupQueryPatterns = {
-    CHANGE_ID: /^\s*i?[0-9a-f]{8,40}\s*$/i,
+    CHANGE_ID: /^\s*i?[0-9a-f]{7,40}\s*$/i,
     CHANGE_NUM: /^\s*[1-9][0-9]*\s*$/g,
   };