summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPureRevert.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/change/GetPureRevert.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/change/GetPureRevert.java153
1 files changed, 0 insertions, 153 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPureRevert.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPureRevert.java
deleted file mode 100644
index 9270463d68..0000000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPureRevert.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright (C) 2017 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.change;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.common.PureRevertInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.diff.DiffEntry;
-import org.eclipse.jgit.diff.DiffFormatter;
-import org.eclipse.jgit.errors.InvalidObjectIdException;
-import org.eclipse.jgit.errors.MissingObjectException;
-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;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-public class GetPureRevert implements RestReadView<ChangeResource> {
- private final MergeUtil.Factory mergeUtilFactory;
- private final GitRepositoryManager repoManager;
- private final ProjectCache projectCache;
- private final ChangeNotes.Factory notesFactory;
- private final Provider<ReviewDb> dbProvider;
- private final PatchSetUtil psUtil;
-
- @Option(
- name = "--claimed-original",
- aliases = {"-o"},
- usage = "SHA1 (40 digit hex) of the original commit")
- @Nullable
- private String claimedOriginal;
-
- @Inject
- GetPureRevert(
- MergeUtil.Factory mergeUtilFactory,
- GitRepositoryManager repoManager,
- ProjectCache projectCache,
- ChangeNotes.Factory notesFactory,
- Provider<ReviewDb> dbProvider,
- PatchSetUtil psUtil) {
- this.mergeUtilFactory = mergeUtilFactory;
- this.repoManager = repoManager;
- this.projectCache = projectCache;
- this.notesFactory = notesFactory;
- this.dbProvider = dbProvider;
- this.psUtil = psUtil;
- }
-
- @Override
- public PureRevertInfo apply(ChangeResource rsrc)
- throws ResourceConflictException, IOException, BadRequestException, OrmException,
- AuthException {
- PatchSet currentPatchSet = psUtil.current(dbProvider.get(), rsrc.getNotes());
- if (currentPatchSet == null) {
- throw new ResourceConflictException("current revision is missing");
- }
- return getPureRevert(rsrc.getNotes());
- }
-
- public PureRevertInfo getPureRevert(ChangeNotes notes)
- throws OrmException, IOException, BadRequestException, ResourceConflictException {
- PatchSet currentPatchSet = psUtil.current(dbProvider.get(), notes);
- if (currentPatchSet == null) {
- throw new ResourceConflictException("current revision is missing");
- }
-
- if (claimedOriginal == null) {
- if (notes.getChange().getRevertOf() == null) {
- throw new BadRequestException("no ID was provided and change isn't a revert");
- }
- PatchSet ps =
- psUtil.current(
- dbProvider.get(),
- notesFactory.createChecked(
- dbProvider.get(), notes.getProjectName(), notes.getChange().getRevertOf()));
- claimedOriginal = ps.getRevision().get();
- }
-
- try (Repository repo = repoManager.openRepository(notes.getProjectName());
- ObjectInserter oi = repo.newObjectInserter();
- RevWalk rw = new RevWalk(repo)) {
- RevCommit claimedOriginalCommit;
- try {
- claimedOriginalCommit = rw.parseCommit(ObjectId.fromString(claimedOriginal));
- } catch (InvalidObjectIdException | MissingObjectException e) {
- throw new BadRequestException("invalid object ID");
- }
- if (claimedOriginalCommit.getParentCount() == 0) {
- throw new BadRequestException("can't check against initial commit");
- }
- RevCommit claimedRevertCommit =
- rw.parseCommit(ObjectId.fromString(currentPatchSet.getRevision().get()));
- if (claimedRevertCommit.getParentCount() == 0) {
- throw new BadRequestException("claimed revert has no parents");
- }
- // Rebase claimed revert onto claimed original
- ThreeWayMerger merger =
- mergeUtilFactory
- .create(projectCache.checkedGet(notes.getProjectName()))
- .newThreeWayMerger(oi, repo.getConfig());
- merger.setBase(claimedRevertCommit.getParent(0));
- boolean success = merger.merge(claimedRevertCommit, claimedOriginalCommit);
- if (!success || merger.getResultTreeId() == null) {
- // Merge conflict during rebase
- return new PureRevertInfo(false);
- }
-
- // Any differences between claimed original's parent and the rebase result indicate that the
- // claimedRevert is not a pure revert but made content changes
- try (DiffFormatter df = new DiffFormatter(new ByteArrayOutputStream())) {
- df.setRepository(repo);
- List<DiffEntry> entries =
- df.scan(claimedOriginalCommit.getParent(0), merger.getResultTreeId());
- return new PureRevertInfo(entries.isEmpty());
- }
- }
- }
-
- public GetPureRevert setClaimedOriginal(String claimedOriginal) {
- this.claimedOriginal = claimedOriginal;
- return this;
- }
-}