From 54429e9066a3bdad39b53c34e765984fb149a092 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Wed, 5 Apr 2017 09:44:22 +0900 Subject: [PATCH 1/2] Set version to 2.12.8 Change-Id: I7fc4b13c70012d6e3aee8afa94772a079b4bd115 --- Documentation/dev-plugins.txt | 2 +- VERSION | 2 +- gerrit-acceptance-framework/pom.xml | 2 +- gerrit-extension-api/pom.xml | 2 +- gerrit-plugin-api/pom.xml | 2 +- gerrit-plugin-archetype/pom.xml | 2 +- gerrit-plugin-gwt-archetype/pom.xml | 2 +- gerrit-plugin-gwtui/pom.xml | 2 +- gerrit-plugin-js-archetype/pom.xml | 2 +- gerrit-war/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt index d21a9888b9..8b56937724 100644 --- a/Documentation/dev-plugins.txt +++ b/Documentation/dev-plugins.txt @@ -36,7 +36,7 @@ plugin project. ---- mvn archetype:generate -DarchetypeGroupId=com.google.gerrit \ -DarchetypeArtifactId=gerrit-plugin-archetype \ - -DarchetypeVersion=2.12.7 \ + -DarchetypeVersion=2.12.8 \ -DgroupId=com.googlesource.gerrit.plugins.testplugin \ -DartifactId=testplugin ---- diff --git a/VERSION b/VERSION index 2db91d3564..1b0baa6954 100644 --- a/VERSION +++ b/VERSION @@ -2,4 +2,4 @@ # Used by :api_install and :api_deploy targets # when talking to the destination repository. # -GERRIT_VERSION = '2.12.7' +GERRIT_VERSION = '2.12.8' diff --git a/gerrit-acceptance-framework/pom.xml b/gerrit-acceptance-framework/pom.xml index b9712e9f34..f8a6856374 100644 --- a/gerrit-acceptance-framework/pom.xml +++ b/gerrit-acceptance-framework/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.google.gerrit gerrit-acceptance-framework - 2.12.7 + 2.12.8 jar Gerrit Code Review - Acceptance Test Framework API for Gerrit Plugins diff --git a/gerrit-extension-api/pom.xml b/gerrit-extension-api/pom.xml index c50cb4f903..8b54e2bdb5 100644 --- a/gerrit-extension-api/pom.xml +++ b/gerrit-extension-api/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.google.gerrit gerrit-extension-api - 2.12.7 + 2.12.8 jar Gerrit Code Review - Extension API API for Gerrit Extensions diff --git a/gerrit-plugin-api/pom.xml b/gerrit-plugin-api/pom.xml index 8dda64ab57..527bf583ec 100644 --- a/gerrit-plugin-api/pom.xml +++ b/gerrit-plugin-api/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.google.gerrit gerrit-plugin-api - 2.12.7 + 2.12.8 jar Gerrit Code Review - Plugin API API for Gerrit Plugins diff --git a/gerrit-plugin-archetype/pom.xml b/gerrit-plugin-archetype/pom.xml index 4e8add64a8..399a3fdb4a 100644 --- a/gerrit-plugin-archetype/pom.xml +++ b/gerrit-plugin-archetype/pom.xml @@ -20,7 +20,7 @@ limitations under the License. com.google.gerrit gerrit-plugin-archetype - 2.12.7 + 2.12.8 Gerrit Code Review - Plugin Archetype Maven Archetype for Gerrit Plugins https://www.gerritcodereview.com/ diff --git a/gerrit-plugin-gwt-archetype/pom.xml b/gerrit-plugin-gwt-archetype/pom.xml index d7dfc7d290..ef94e951b8 100644 --- a/gerrit-plugin-gwt-archetype/pom.xml +++ b/gerrit-plugin-gwt-archetype/pom.xml @@ -20,7 +20,7 @@ limitations under the License. com.google.gerrit gerrit-plugin-gwt-archetype - 2.12.7 + 2.12.8 Gerrit Code Review - Web UI GWT Plugin Archetype Maven Archetype for Gerrit Web UI GWT Plugins https://www.gerritcodereview.com/ diff --git a/gerrit-plugin-gwtui/pom.xml b/gerrit-plugin-gwtui/pom.xml index 875a6c8abe..c4e27656d3 100644 --- a/gerrit-plugin-gwtui/pom.xml +++ b/gerrit-plugin-gwtui/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.google.gerrit gerrit-plugin-gwtui - 2.12.7 + 2.12.8 jar Gerrit Code Review - Plugin GWT UI Common Classes for Gerrit GWT UI Plugins diff --git a/gerrit-plugin-js-archetype/pom.xml b/gerrit-plugin-js-archetype/pom.xml index 1292430bb7..da05bb7112 100644 --- a/gerrit-plugin-js-archetype/pom.xml +++ b/gerrit-plugin-js-archetype/pom.xml @@ -20,7 +20,7 @@ limitations under the License. com.google.gerrit gerrit-plugin-js-archetype - 2.12.7 + 2.12.8 Gerrit Code Review - Web UI JavaScript Plugin Archetype Maven Archetype for Gerrit Web UI JavaScript Plugins https://www.gerritcodereview.com/ diff --git a/gerrit-war/pom.xml b/gerrit-war/pom.xml index 9182023d81..cc352e9b51 100644 --- a/gerrit-war/pom.xml +++ b/gerrit-war/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.google.gerrit gerrit-war - 2.12.7 + 2.12.8 war Gerrit Code Review - WAR Gerrit WAR From bc24c17195028ad20efea74c8bda3e3a50ce0839 Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Fri, 24 Jun 2016 12:04:56 -0400 Subject: [PATCH 2/2] MergeUtil: Use InMemoryInserter for dry runs As in Ifd9d768d, making flush a no-op is not sufficient to ensure nothing gets written to the repo. Bug: Issue 6965 Change-Id: If08e8184b484a0e7ba41fd3e11130d6fb26ed6c6 --- .../server/change/ChangeKindCacheImpl.java | 10 +- .../gerrit/server/git/InMemoryInserter.java | 142 ++++++++++++++++++ .../gerrit/server/git/InsertedObject.java | 54 +++++++ .../google/gerrit/server/git/MergeUtil.java | 33 +--- 4 files changed, 208 insertions(+), 31 deletions(-) create mode 100644 gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java create mode 100644 gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java index f3d14555f3..389d53a366 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java @@ -27,6 +27,7 @@ import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.cache.CacheModule; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.gerrit.server.git.InMemoryInserter; import com.google.gerrit.server.git.MergeUtil; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; @@ -39,6 +40,7 @@ import com.google.inject.name.Named; import org.eclipse.jgit.errors.LargeObjectException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.merge.ThreeWayMerger; import org.eclipse.jgit.revwalk.RevCommit; @@ -217,10 +219,10 @@ public class ChangeKindCacheImpl implements ChangeKindCache { // A trivial rebase can be detected by looking for the next commit // having the same tree as would exist when the prior commit is // cherry-picked onto the next commit's new first parent. - ThreeWayMerger merger = MergeUtil.newThreeWayMerger( - repo, MergeUtil.createDryRunInserter(repo), key.strategyName); - merger.setBase(prior.getParent(0)); - try { + try (ObjectInserter ins = new InMemoryInserter(repo)) { + ThreeWayMerger merger = + MergeUtil.newThreeWayMerger(repo, ins, key.strategyName); + merger.setBase(prior.getParent(0)); if (merger.merge(next.getParent(0), prior) && merger.getResultTreeId().equals(next.getTree())) { return ChangeKind.TRIVIAL_REBASE; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java new file mode 100644 index 0000000000..4c7f6376d8 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java @@ -0,0 +1,142 @@ +// Copyright (C) 2016 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.base.Preconditions.checkNotNull; + +import com.google.common.collect.ImmutableList; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import org.eclipse.jgit.errors.IncorrectObjectTypeException; +import org.eclipse.jgit.lib.AbbreviatedObjectId; +import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.ObjectLoader; +import org.eclipse.jgit.lib.ObjectReader; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.transport.PackParser; + +public class InMemoryInserter extends ObjectInserter { + private final ObjectReader reader; + private final Map inserted = new LinkedHashMap<>(); + private final boolean closeReader; + + public InMemoryInserter(ObjectReader reader) { + this.reader = checkNotNull(reader); + closeReader = false; + } + + public InMemoryInserter(Repository repo) { + this.reader = repo.newObjectReader(); + closeReader = true; + } + + @Override + public ObjectId insert(int type, long length, InputStream in) throws IOException { + return insert(InsertedObject.create(type, in)); + } + + @Override + public ObjectId insert(int type, byte[] data) { + return insert(type, data, 0, data.length); + } + + @Override + public ObjectId insert(int type, byte[] data, int off, int len) { + return insert(InsertedObject.create(type, data, off, len)); + } + + public ObjectId insert(InsertedObject obj) { + inserted.put(obj.id(), obj); + return obj.id(); + } + + @Override + public PackParser newPackParser(InputStream in) { + throw new UnsupportedOperationException(); + } + + @Override + public ObjectReader newReader() { + return new Reader(); + } + + @Override + public void flush() { + // Do nothing; objects are not written to the repo. + } + + @Override + public void close() { + if (closeReader) { + reader.close(); + } + } + + public ImmutableList getInsertedObjects() { + return ImmutableList.copyOf(inserted.values()); + } + + public void clear() { + inserted.clear(); + } + + private class Reader extends ObjectReader { + @Override + public ObjectReader newReader() { + return new Reader(); + } + + @Override + public Collection resolve(AbbreviatedObjectId id) throws IOException { + Set result = new HashSet<>(); + for (ObjectId insId : inserted.keySet()) { + if (id.prefixCompare(insId) == 0) { + result.add(insId); + } + } + result.addAll(reader.resolve(id)); + return result; + } + + @Override + public ObjectLoader open(AnyObjectId objectId, int typeHint) throws IOException { + InsertedObject obj = inserted.get(objectId); + if (obj == null) { + return reader.open(objectId, typeHint); + } + if (typeHint != OBJ_ANY && obj.type() != typeHint) { + throw new IncorrectObjectTypeException(objectId.copy(), typeHint); + } + return obj.newLoader(); + } + + @Override + public Set getShallowCommits() throws IOException { + return reader.getShallowCommits(); + } + + @Override + public void close() { + // Do nothing; this class owns no open resources. + } + } +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java new file mode 100644 index 0000000000..8a766af905 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java @@ -0,0 +1,54 @@ +// Copyright (C) 2016 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 com.google.auto.value.AutoValue; +import com.google.protobuf.ByteString; +import java.io.IOException; +import java.io.InputStream; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.ObjectLoader; + +@AutoValue +public abstract class InsertedObject { + static InsertedObject create(int type, InputStream in) throws IOException { + return create(type, ByteString.readFrom(in)); + } + + static InsertedObject create(int type, ByteString bs) { + ObjectId id; + try (ObjectInserter.Formatter fmt = new ObjectInserter.Formatter()) { + id = fmt.idFor(type, bs.size(), bs.newInput()); + } catch (IOException e) { + throw new IllegalStateException(e); + } + return new AutoValue_InsertedObject(id, type, bs); + } + + static InsertedObject create(int type, byte[] src, int off, int len) { + return create(type, ByteString.copyFrom(src, off, len)); + } + + public abstract ObjectId id(); + + public abstract int type(); + + public abstract ByteString data(); + + ObjectLoader newLoader() { + return new ObjectLoader.SmallObject(type(), data().toByteArray()); + } +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java index 2025e99b93..13476ef1a8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java @@ -66,13 +66,12 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevFlag; import org.eclipse.jgit.revwalk.RevSort; import org.eclipse.jgit.revwalk.RevWalk; -import org.eclipse.jgit.transport.PackParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.io.InputStream; import java.io.UnsupportedEncodingException; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -353,9 +352,9 @@ public class MergeUtil { return false; } - ThreeWayMerger m = newThreeWayMerger(repo, createDryRunInserter(repo)); - try { - return m.merge(new AnyObjectId[] {mergeTip, toMerge}); + try (ObjectInserter ins = new InMemoryInserter(repo)) { + return newThreeWayMerger(repo, ins) + .merge(new AnyObjectId[] {mergeTip, toMerge}); } catch (LargeObjectException e) { log.warn("Cannot merge due to LargeObjectException: " + toMerge.name()); return false; @@ -401,8 +400,8 @@ public class MergeUtil { // taking the delta relative to that one parent and redoing // that on the current merge tip. // - try { - ThreeWayMerger m = newThreeWayMerger(repo, createDryRunInserter(repo)); + try (ObjectInserter ins = new InMemoryInserter(repo)) { + ThreeWayMerger m = newThreeWayMerger(repo, ins); m.setBase(toMerge.getParent(0)); return m.merge(mergeTip, toMerge); } catch (IOException e) { @@ -429,26 +428,6 @@ public class MergeUtil { } } - public static ObjectInserter createDryRunInserter(Repository db) { - final ObjectInserter delegate = db.newObjectInserter(); - return new ObjectInserter.Filter() { - @Override - protected ObjectInserter delegate() { - return delegate; - } - - @Override - public PackParser newPackParser(InputStream in) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public void flush() throws IOException { - // Do nothing. - } - }; - } - public CodeReviewCommit mergeOneCommit(PersonIdent author, PersonIdent committer, Repository repo, CodeReviewRevWalk rw, ObjectInserter inserter, RevFlag canMergeFlag, Branch.NameKey destBranch,