Merge branch 'stable-3.1' into stable-3.2
* stable-3.1: PolyGerrit: Remove duplicate key from language map e2e-tests: add RestoreChange scenario Documentation: dev-bazel: Fix indent level PolyGerrit: Highlight tex files e2e-tests: add AbandonChange scenario Stop SPAMming Gerrit logs with 'Logging context is not empty' Update git submodules Update git submodules Update git submodules GitRepositoryManager should be responsible to enable/disable the GC e2e-tests: Fix regex to adapt to JSON_COMPACT Change-Id: I20d16ee00010b96c60b7724ac46a303400dbc0fd
This commit is contained in:
		@@ -258,7 +258,7 @@ refreshed and missing dependency JARs can be downloaded by running
 | 
			
		||||
with BUILD Files` button of link:https://ij.bazel.build[Bazel plugin,role=external,window=_blank].
 | 
			
		||||
 | 
			
		||||
[[documentation]]
 | 
			
		||||
=== Documentation
 | 
			
		||||
== Documentation
 | 
			
		||||
 | 
			
		||||
To build only the documentation for testing or static hosting:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "url": "HTTP_SCHEME://HOSTNAME:HTTP_PORT/a/changes/",
 | 
			
		||||
    "number": "NUMBER"
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "url": "HTTP_SCHEME://HOSTNAME:HTTP_PORT/a/changes/",
 | 
			
		||||
    "number": "NUMBER"
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
@@ -0,0 +1,71 @@
 | 
			
		||||
// Copyright (C) 2021 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.scenarios
 | 
			
		||||
 | 
			
		||||
import io.gatling.core.Predef.{atOnceUsers, _}
 | 
			
		||||
import io.gatling.core.feeder.FeederBuilder
 | 
			
		||||
import io.gatling.core.structure.ScenarioBuilder
 | 
			
		||||
import io.gatling.http.Predef.http
 | 
			
		||||
 | 
			
		||||
import scala.collection.mutable
 | 
			
		||||
import scala.concurrent.duration.DurationInt
 | 
			
		||||
 | 
			
		||||
class AbandonChange extends GerritSimulation {
 | 
			
		||||
  private val data: FeederBuilder = jsonFile(resource).convert(keys).circular
 | 
			
		||||
  private val projectName = className
 | 
			
		||||
  private var numbersCopy: mutable.Queue[Int] = mutable.Queue[Int]()
 | 
			
		||||
  private var createChange: Option[CreateChange] = Some(new CreateChange(projectName))
 | 
			
		||||
 | 
			
		||||
  override def relativeRuntimeWeight = 10
 | 
			
		||||
 | 
			
		||||
  def this(createChange: CreateChange) {
 | 
			
		||||
    this()
 | 
			
		||||
    this.createChange = Some(createChange)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  val test: ScenarioBuilder = scenario(uniqueName)
 | 
			
		||||
      .feed(data)
 | 
			
		||||
      .exec(session => {
 | 
			
		||||
        if (createChange.nonEmpty) {
 | 
			
		||||
          if (numbersCopy.isEmpty) {
 | 
			
		||||
            numbersCopy = createChange.get.numbers.clone()
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        session.set("number", numbersCopy.dequeue())
 | 
			
		||||
      })
 | 
			
		||||
      .exec(http(uniqueName).post("${url}${number}/abandon"))
 | 
			
		||||
 | 
			
		||||
  private val createProject = new CreateProject(projectName)
 | 
			
		||||
  private val deleteProject = new DeleteProject(projectName)
 | 
			
		||||
 | 
			
		||||
  setUp(
 | 
			
		||||
    createProject.test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(createProject) seconds),
 | 
			
		||||
      atOnceUsers(single)
 | 
			
		||||
    ),
 | 
			
		||||
    createChange.get.test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(createChange.get) seconds),
 | 
			
		||||
      atOnceUsers(numberOfUsers)
 | 
			
		||||
    ),
 | 
			
		||||
    test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(this) seconds),
 | 
			
		||||
      atOnceUsers(numberOfUsers)
 | 
			
		||||
    ),
 | 
			
		||||
    deleteProject.test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(deleteProject) seconds),
 | 
			
		||||
      atOnceUsers(single)
 | 
			
		||||
    ),
 | 
			
		||||
  ).protocols(httpProtocol)
 | 
			
		||||
}
 | 
			
		||||
@@ -37,7 +37,7 @@ class CheckProjectsCacheFlushEntries extends CacheFlushSimulation {
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      .exec(http(uniqueName).get("${url}")
 | 
			
		||||
          .check(regex("\"" + memKey + "\": (\\d+)")
 | 
			
		||||
          .check(regex("\"" + memKey + "\":(\\d+)")
 | 
			
		||||
              .is(session => session(entriesKey).as[String])))
 | 
			
		||||
 | 
			
		||||
  setUp(
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ class GetMasterBranchRevision extends ProjectSimulation {
 | 
			
		||||
  private val data: FeederBuilder = jsonFile(resource).convert(keys).queue
 | 
			
		||||
  var revision: Option[String] = None
 | 
			
		||||
  val revisionKey = "revision"
 | 
			
		||||
  val revisionPattern: String = "\"" + revisionKey + "\": \"(.+)\""
 | 
			
		||||
  val revisionPattern: String = "\"" + revisionKey + "\":\"(.+)\""
 | 
			
		||||
 | 
			
		||||
  val test: ScenarioBuilder = scenario(uniqueName)
 | 
			
		||||
      .feed(data)
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ class GetProjectsCacheEntries extends CacheFlushSimulation {
 | 
			
		||||
  val test: ScenarioBuilder = scenario(uniqueName)
 | 
			
		||||
      .feed(data)
 | 
			
		||||
      .exec(http(uniqueName).get("${url}")
 | 
			
		||||
          .check(regex("\"" + memKey + "\": (\\d+)").saveAs(entriesKey)))
 | 
			
		||||
          .check(regex("\"" + memKey + "\":(\\d+)").saveAs(entriesKey)))
 | 
			
		||||
      .exec(session => {
 | 
			
		||||
        if (consumer.nonEmpty) {
 | 
			
		||||
          consumer.get.entriesBeforeFlush(session(entriesKey).as[Int])
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,74 @@
 | 
			
		||||
// Copyright (C) 2021 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
package com.google.gerrit.scenarios
 | 
			
		||||
 | 
			
		||||
import io.gatling.core.Predef.{atOnceUsers, _}
 | 
			
		||||
import io.gatling.core.feeder.FeederBuilder
 | 
			
		||||
import io.gatling.core.structure.ScenarioBuilder
 | 
			
		||||
import io.gatling.http.Predef.http
 | 
			
		||||
 | 
			
		||||
import scala.collection.mutable
 | 
			
		||||
import scala.concurrent.duration.DurationInt
 | 
			
		||||
 | 
			
		||||
class RestoreChange extends GerritSimulation {
 | 
			
		||||
  private val data: FeederBuilder = jsonFile(resource).convert(keys).circular
 | 
			
		||||
  private val projectName = className
 | 
			
		||||
  private var numbersCopy: mutable.Queue[Int] = mutable.Queue[Int]()
 | 
			
		||||
 | 
			
		||||
  override def relativeRuntimeWeight = 10
 | 
			
		||||
 | 
			
		||||
  private val test: ScenarioBuilder = scenario(uniqueName)
 | 
			
		||||
      .feed(data)
 | 
			
		||||
      .exec(session => {
 | 
			
		||||
        if (numbersCopy.isEmpty) {
 | 
			
		||||
          numbersCopy = createChange.numbers.clone()
 | 
			
		||||
        }
 | 
			
		||||
        session.set("number", numbersCopy.dequeue())
 | 
			
		||||
      }
 | 
			
		||||
      ).exec(http(uniqueName).post("${url}${number}/restore"))
 | 
			
		||||
 | 
			
		||||
  private val createProject = new CreateProject(projectName)
 | 
			
		||||
  private val createChange = new CreateChange(projectName)
 | 
			
		||||
  private val abandonChange = new AbandonChange(createChange)
 | 
			
		||||
  private val deleteChange = new DeleteChange(createChange)
 | 
			
		||||
  private val deleteProject = new DeleteProject(projectName)
 | 
			
		||||
 | 
			
		||||
  setUp(
 | 
			
		||||
    createProject.test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(createProject) seconds),
 | 
			
		||||
      atOnceUsers(single)
 | 
			
		||||
    ),
 | 
			
		||||
    createChange.test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(createChange) seconds),
 | 
			
		||||
      atOnceUsers(numberOfUsers)
 | 
			
		||||
    ),
 | 
			
		||||
    abandonChange.test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(abandonChange) seconds),
 | 
			
		||||
      atOnceUsers(numberOfUsers)
 | 
			
		||||
    ),
 | 
			
		||||
    test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(this) seconds),
 | 
			
		||||
      atOnceUsers(numberOfUsers)
 | 
			
		||||
    ),
 | 
			
		||||
    deleteChange.test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(deleteChange) seconds),
 | 
			
		||||
      atOnceUsers(numberOfUsers)
 | 
			
		||||
    ),
 | 
			
		||||
    deleteProject.test.inject(
 | 
			
		||||
      nothingFor(stepWaitTime(deleteProject) seconds),
 | 
			
		||||
      atOnceUsers(single)
 | 
			
		||||
    ),
 | 
			
		||||
  ).protocols(httpProtocol)
 | 
			
		||||
}
 | 
			
		||||
@@ -57,4 +57,13 @@ public interface GitRepositoryManager {
 | 
			
		||||
 | 
			
		||||
  /** @return set of all known projects, sorted by natural NameKey order. */
 | 
			
		||||
  SortedSet<Project.NameKey> list();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Check if garbage collection can be performed by the repository manager.
 | 
			
		||||
   *
 | 
			
		||||
   * @return true if repository can perform garbage collection.
 | 
			
		||||
   */
 | 
			
		||||
  default Boolean canPerformGC() {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -199,6 +199,11 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public Boolean canPerformGC() {
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private boolean isUnreasonableName(Project.NameKey nameKey) {
 | 
			
		||||
    final String name = nameKey.get();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -81,10 +81,7 @@ public class LoggingContext extends com.google.common.flogger.backend.system.Log
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public boolean isEmpty() {
 | 
			
		||||
    return tags.get() == null
 | 
			
		||||
        && forceLogging.get() == null
 | 
			
		||||
        && performanceLogging.get() == null
 | 
			
		||||
        && performanceLogRecords.get() == null;
 | 
			
		||||
    return tags.get() == null && forceLogging.get() == null && performanceLogging.get() == null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void clear() {
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,6 @@ import com.google.gerrit.extensions.webui.UiAction;
 | 
			
		||||
import com.google.gerrit.server.config.UrlFormatter;
 | 
			
		||||
import com.google.gerrit.server.git.GarbageCollection;
 | 
			
		||||
import com.google.gerrit.server.git.GitRepositoryManager;
 | 
			
		||||
import com.google.gerrit.server.git.LocalDiskRepositoryManager;
 | 
			
		||||
import com.google.gerrit.server.git.WorkQueue;
 | 
			
		||||
import com.google.gerrit.server.ioutil.HexFormat;
 | 
			
		||||
import com.google.gerrit.server.project.ProjectResource;
 | 
			
		||||
@@ -67,7 +66,7 @@ public class GarbageCollect
 | 
			
		||||
      DynamicItem<UrlFormatter> urlFormatter) {
 | 
			
		||||
    this.workQueue = workQueue;
 | 
			
		||||
    this.urlFormatter = urlFormatter;
 | 
			
		||||
    this.canGC = repoManager instanceof LocalDiskRepositoryManager;
 | 
			
		||||
    this.canGC = repoManager.canPerformGC();
 | 
			
		||||
    this.garbageCollectionFactory = garbageCollectionFactory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,54 @@
 | 
			
		||||
// Copyright (C) 2021 The Android Open Source Project
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
// http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
package com.google.gerrit.server.git;
 | 
			
		||||
 | 
			
		||||
import static com.google.common.truth.Truth.assertThat;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.entities.Project.NameKey;
 | 
			
		||||
import java.util.SortedSet;
 | 
			
		||||
import org.eclipse.jgit.lib.Repository;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
public class GitRepositoryManagerTest {
 | 
			
		||||
 | 
			
		||||
  private GitRepositoryManager objectUnderTest;
 | 
			
		||||
 | 
			
		||||
  @Before
 | 
			
		||||
  public void setUp() throws Exception {
 | 
			
		||||
    objectUnderTest = new TestGitRepositoryManager();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void shouldReturnFalseWhenDefaultCanPerformGC() {
 | 
			
		||||
    assertThat(objectUnderTest.canPerformGC()).isFalse();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private static class TestGitRepositoryManager implements GitRepositoryManager {
 | 
			
		||||
    @Override
 | 
			
		||||
    public Repository openRepository(NameKey name) {
 | 
			
		||||
      throw new UnsupportedOperationException("Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Repository createRepository(NameKey name) {
 | 
			
		||||
      throw new UnsupportedOperationException("Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public SortedSet<NameKey> list() {
 | 
			
		||||
      throw new UnsupportedOperationException("Not implemented");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -252,6 +252,11 @@ public class LocalDiskRepositoryManagerTest {
 | 
			
		||||
        () -> newRepoManager.createRepository(Project.nameKey("A")));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testRepositoryCanPerformGC() throws Exception {
 | 
			
		||||
    assertThat(repoManager.canPerformGC()).isTrue();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private void createSymLink(Project.NameKey project, String link) throws IOException {
 | 
			
		||||
    Path base = repoManager.getBasePath(project);
 | 
			
		||||
    Path projectDir = base.resolve(project.get() + ".git");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										596
									
								
								lib/highlightjs/highlight.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										596
									
								
								lib/highlightjs/highlight.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user