summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java612
1 files changed, 0 insertions, 612 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
deleted file mode 100644
index 82fa596d06..0000000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
+++ /dev/null
@@ -1,612 +0,0 @@
-// Copyright (C) 2014 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.edit;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MergeConflictException;
-import com.google.gerrit.extensions.restapi.RawInput;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.edit.tree.ChangeFileContentModification;
-import com.google.gerrit.server.edit.tree.DeleteFileModification;
-import com.google.gerrit.server.edit.tree.RenameFileModification;
-import com.google.gerrit.server.edit.tree.RestoreFileModification;
-import com.google.gerrit.server.edit.tree.TreeCreator;
-import com.google.gerrit.server.edit.tree.TreeModification;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.util.CommitMessageUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.List;
-import java.util.Optional;
-import java.util.TimeZone;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.MergeStrategy;
-import org.eclipse.jgit.merge.ThreeWayMerger;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/**
- * Utility functions to manipulate change edits.
- *
- * <p>This class contains methods to modify edit's content. For retrieving, publishing and deleting
- * edit see {@link ChangeEditUtil}.
- *
- * <p>
- */
-@Singleton
-public class ChangeEditModifier {
-
- private final TimeZone tz;
- private final ChangeIndexer indexer;
- private final Provider<ReviewDb> reviewDb;
- private final Provider<CurrentUser> currentUser;
- private final PermissionBackend permissionBackend;
- private final ChangeEditUtil changeEditUtil;
- private final PatchSetUtil patchSetUtil;
-
- @Inject
- ChangeEditModifier(
- @GerritPersonIdent PersonIdent gerritIdent,
- ChangeIndexer indexer,
- Provider<ReviewDb> reviewDb,
- Provider<CurrentUser> currentUser,
- PermissionBackend permissionBackend,
- ChangeEditUtil changeEditUtil,
- PatchSetUtil patchSetUtil) {
- this.indexer = indexer;
- this.reviewDb = reviewDb;
- this.currentUser = currentUser;
- this.permissionBackend = permissionBackend;
- this.tz = gerritIdent.getTimeZone();
- this.changeEditUtil = changeEditUtil;
- this.patchSetUtil = patchSetUtil;
- }
-
- /**
- * Creates a new change edit.
- *
- * @param repository the affected Git repository
- * @param notes the {@link ChangeNotes} of the change for which the change edit should be created
- * @throws AuthException if the user isn't authenticated or not allowed to use change edits
- * @throws InvalidChangeOperationException if a change edit already existed for the change
- * @throws PermissionBackendException
- */
- public void createEdit(Repository repository, ChangeNotes notes)
- throws AuthException, IOException, InvalidChangeOperationException, OrmException,
- PermissionBackendException {
- assertCanEdit(notes);
-
- Optional<ChangeEdit> changeEdit = lookupChangeEdit(notes);
- if (changeEdit.isPresent()) {
- throw new InvalidChangeOperationException(
- String.format("A change edit already exists for change %s", notes.getChangeId()));
- }
-
- PatchSet currentPatchSet = lookupCurrentPatchSet(notes);
- ObjectId patchSetCommitId = getPatchSetCommitId(currentPatchSet);
- createEdit(repository, notes, currentPatchSet, patchSetCommitId, TimeUtil.nowTs());
- }
-
- /**
- * Rebase change edit on latest patch set
- *
- * @param repository the affected Git repository
- * @param notes the {@link ChangeNotes} of the change whose change edit should be rebased
- * @throws AuthException if the user isn't authenticated or not allowed to use change edits
- * @throws InvalidChangeOperationException if a change edit doesn't exist for the specified
- * change, the change edit is already based on the latest patch set, or the change represents
- * the root commit
- * @throws MergeConflictException if rebase fails due to merge conflicts
- * @throws PermissionBackendException
- */
- public void rebaseEdit(Repository repository, ChangeNotes notes)
- throws AuthException, InvalidChangeOperationException, IOException, OrmException,
- MergeConflictException, PermissionBackendException {
- assertCanEdit(notes);
-
- Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
- if (!optionalChangeEdit.isPresent()) {
- throw new InvalidChangeOperationException(
- String.format("No change edit exists for change %s", notes.getChangeId()));
- }
- ChangeEdit changeEdit = optionalChangeEdit.get();
-
- PatchSet currentPatchSet = lookupCurrentPatchSet(notes);
- if (isBasedOn(changeEdit, currentPatchSet)) {
- throw new InvalidChangeOperationException(
- String.format(
- "Change edit for change %s is already based on latest patch set %s",
- notes.getChangeId(), currentPatchSet.getId()));
- }
-
- rebase(repository, changeEdit, currentPatchSet);
- }
-
- private void rebase(Repository repository, ChangeEdit changeEdit, PatchSet currentPatchSet)
- throws IOException, MergeConflictException, InvalidChangeOperationException, OrmException {
- RevCommit currentEditCommit = changeEdit.getEditCommit();
- if (currentEditCommit.getParentCount() == 0) {
- throw new InvalidChangeOperationException(
- "Rebase change edit against root commit not supported");
- }
-
- Change change = changeEdit.getChange();
- RevCommit basePatchSetCommit = lookupCommit(repository, currentPatchSet);
- RevTree basePatchSetTree = basePatchSetCommit.getTree();
-
- ObjectId newTreeId = merge(repository, changeEdit, basePatchSetTree);
- Timestamp nowTimestamp = TimeUtil.nowTs();
- String commitMessage = currentEditCommit.getFullMessage();
- ObjectId newEditCommitId =
- createCommit(repository, basePatchSetCommit, newTreeId, commitMessage, nowTimestamp);
-
- String newEditRefName = getEditRefName(change, currentPatchSet);
- updateReferenceWithNameChange(
- repository,
- changeEdit.getRefName(),
- currentEditCommit,
- newEditRefName,
- newEditCommitId,
- nowTimestamp);
- reindex(change);
- }
-
- /**
- * Modifies the commit message of a change edit. If the change edit doesn't exist, a new one will
- * be created based on the current patch set.
- *
- * @param repository the affected Git repository
- * @param notes the {@link ChangeNotes} of the change whose change edit's message should be
- * modified
- * @param newCommitMessage the new commit message
- * @throws AuthException if the user isn't authenticated or not allowed to use change edits
- * @throws UnchangedCommitMessageException if the commit message is the same as before
- * @throws PermissionBackendException
- * @throws BadRequestException if the commit message is malformed
- */
- public void modifyMessage(Repository repository, ChangeNotes notes, String newCommitMessage)
- throws AuthException, IOException, UnchangedCommitMessageException, OrmException,
- PermissionBackendException, BadRequestException {
- assertCanEdit(notes);
- newCommitMessage = CommitMessageUtil.checkAndSanitizeCommitMessage(newCommitMessage);
-
- Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
- PatchSet basePatchSet = getBasePatchSet(optionalChangeEdit, notes);
- RevCommit basePatchSetCommit = lookupCommit(repository, basePatchSet);
- RevCommit baseCommit =
- optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(basePatchSetCommit);
-
- String currentCommitMessage = baseCommit.getFullMessage();
- if (newCommitMessage.equals(currentCommitMessage)) {
- throw new UnchangedCommitMessageException();
- }
-
- RevTree baseTree = baseCommit.getTree();
- Timestamp nowTimestamp = TimeUtil.nowTs();
- ObjectId newEditCommit =
- createCommit(repository, basePatchSetCommit, baseTree, newCommitMessage, nowTimestamp);
-
- if (optionalChangeEdit.isPresent()) {
- updateEdit(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp);
- } else {
- createEdit(repository, notes, basePatchSet, newEditCommit, nowTimestamp);
- }
- }
-
- /**
- * Modifies the contents of a file of a change edit. If the change edit doesn't exist, a new one
- * will be created based on the current patch set.
- *
- * @param repository the affected Git repository
- * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
- * @param filePath the path of the file whose contents should be modified
- * @param newContent the new file content
- * @throws AuthException if the user isn't authenticated or not allowed to use change edits
- * @throws InvalidChangeOperationException if the file already had the specified content
- * @throws PermissionBackendException
- */
- public void modifyFile(
- Repository repository, ChangeNotes notes, String filePath, RawInput newContent)
- throws AuthException, InvalidChangeOperationException, IOException, OrmException,
- PermissionBackendException {
- modifyTree(repository, notes, new ChangeFileContentModification(filePath, newContent));
- }
-
- /**
- * Deletes a file from the Git tree of a change edit. If the change edit doesn't exist, a new one
- * will be created based on the current patch set.
- *
- * @param repository the affected Git repository
- * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
- * @param file path of the file which should be deleted
- * @throws AuthException if the user isn't authenticated or not allowed to use change edits
- * @throws InvalidChangeOperationException if the file does not exist
- * @throws PermissionBackendException
- */
- public void deleteFile(Repository repository, ChangeNotes notes, String file)
- throws AuthException, InvalidChangeOperationException, IOException, OrmException,
- PermissionBackendException {
- modifyTree(repository, notes, new DeleteFileModification(file));
- }
-
- /**
- * Renames a file of a change edit or moves it to another directory. If the change edit doesn't
- * exist, a new one will be created based on the current patch set.
- *
- * @param repository the affected Git repository
- * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
- * @param currentFilePath the current path/name of the file
- * @param newFilePath the desired path/name of the file
- * @throws AuthException if the user isn't authenticated or not allowed to use change edits
- * @throws InvalidChangeOperationException if the file was already renamed to the specified new
- * name
- * @throws PermissionBackendException
- */
- public void renameFile(
- Repository repository, ChangeNotes notes, String currentFilePath, String newFilePath)
- throws AuthException, InvalidChangeOperationException, IOException, OrmException,
- PermissionBackendException {
- modifyTree(repository, notes, new RenameFileModification(currentFilePath, newFilePath));
- }
-
- /**
- * Restores a file of a change edit to the state it was in before the patch set on which the
- * change edit is based. If the change edit doesn't exist, a new one will be created based on the
- * current patch set.
- *
- * @param repository the affected Git repository
- * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
- * @param file the path of the file which should be restored
- * @throws AuthException if the user isn't authenticated or not allowed to use change edits
- * @throws InvalidChangeOperationException if the file was already restored
- * @throws PermissionBackendException
- */
- public void restoreFile(Repository repository, ChangeNotes notes, String file)
- throws AuthException, InvalidChangeOperationException, IOException, OrmException,
- PermissionBackendException {
- modifyTree(repository, notes, new RestoreFileModification(file));
- }
-
- private void modifyTree(
- Repository repository, ChangeNotes notes, TreeModification treeModification)
- throws AuthException, IOException, OrmException, InvalidChangeOperationException,
- PermissionBackendException {
- assertCanEdit(notes);
-
- Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
- PatchSet basePatchSet = getBasePatchSet(optionalChangeEdit, notes);
- RevCommit basePatchSetCommit = lookupCommit(repository, basePatchSet);
- RevCommit baseCommit =
- optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(basePatchSetCommit);
-
- ObjectId newTreeId = createNewTree(repository, baseCommit, ImmutableList.of(treeModification));
-
- String commitMessage = baseCommit.getFullMessage();
- Timestamp nowTimestamp = TimeUtil.nowTs();
- ObjectId newEditCommit =
- createCommit(repository, basePatchSetCommit, newTreeId, commitMessage, nowTimestamp);
-
- if (optionalChangeEdit.isPresent()) {
- updateEdit(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp);
- } else {
- createEdit(repository, notes, basePatchSet, newEditCommit, nowTimestamp);
- }
- }
-
- /**
- * Applies the indicated modifications to the specified patch set. If a change edit exists and is
- * based on the same patch set, the modified patch set tree is merged with the change edit. If the
- * change edit doesn't exist, a new one will be created.
- *
- * @param repository the affected Git repository
- * @param notes the {@link ChangeNotes} of the change to which the patch set belongs
- * @param patchSet the {@code PatchSet} which should be modified
- * @param treeModifications the modifications which should be applied
- * @return the resulting {@code ChangeEdit}
- * @throws AuthException if the user isn't authenticated or not allowed to use change edits
- * @throws InvalidChangeOperationException if the existing change edit is based on another patch
- * set or no change edit exists but the specified patch set isn't the current one
- * @throws MergeConflictException if the modified patch set tree can't be merged with an existing
- * change edit
- */
- public ChangeEdit combineWithModifiedPatchSetTree(
- Repository repository,
- ChangeNotes notes,
- PatchSet patchSet,
- List<TreeModification> treeModifications)
- throws AuthException, IOException, InvalidChangeOperationException, MergeConflictException,
- OrmException, PermissionBackendException {
- assertCanEdit(notes);
-
- Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
- ensureAllowedPatchSet(notes, optionalChangeEdit, patchSet);
-
- RevCommit patchSetCommit = lookupCommit(repository, patchSet);
- ObjectId newTreeId = createNewTree(repository, patchSetCommit, treeModifications);
-
- if (optionalChangeEdit.isPresent()) {
- ChangeEdit changeEdit = optionalChangeEdit.get();
- newTreeId = merge(repository, changeEdit, newTreeId);
- if (ObjectId.equals(newTreeId, changeEdit.getEditCommit().getTree())) {
- // Modifications are already contained in the change edit.
- return changeEdit;
- }
- }
-
- String commitMessage =
- optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(patchSetCommit).getFullMessage();
- Timestamp nowTimestamp = TimeUtil.nowTs();
- ObjectId newEditCommit =
- createCommit(repository, patchSetCommit, newTreeId, commitMessage, nowTimestamp);
-
- if (optionalChangeEdit.isPresent()) {
- return updateEdit(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp);
- }
- return createEdit(repository, notes, patchSet, newEditCommit, nowTimestamp);
- }
-
- private void assertCanEdit(ChangeNotes notes) throws AuthException, PermissionBackendException {
- if (!currentUser.get().isIdentifiedUser()) {
- throw new AuthException("Authentication required");
- }
- try {
- permissionBackend
- .user(currentUser)
- .database(reviewDb)
- .change(notes)
- .check(ChangePermission.ADD_PATCH_SET);
- } catch (AuthException denied) {
- throw new AuthException("edit not permitted", denied);
- }
- }
-
- private static void ensureAllowedPatchSet(
- ChangeNotes notes, Optional<ChangeEdit> optionalChangeEdit, PatchSet patchSet)
- throws InvalidChangeOperationException {
- if (optionalChangeEdit.isPresent()) {
- ChangeEdit changeEdit = optionalChangeEdit.get();
- if (!isBasedOn(changeEdit, patchSet)) {
- throw new InvalidChangeOperationException(
- String.format(
- "Only the patch set %s on which the existing change edit is based may be modified "
- + "(specified patch set: %s)",
- changeEdit.getBasePatchSet().getId(), patchSet.getId()));
- }
- } else {
- PatchSet.Id patchSetId = patchSet.getId();
- PatchSet.Id currentPatchSetId = notes.getChange().currentPatchSetId();
- if (!patchSetId.equals(currentPatchSetId)) {
- throw new InvalidChangeOperationException(
- String.format(
- "A change edit may only be created for the current patch set %s (and not for %s)",
- currentPatchSetId, patchSetId));
- }
- }
- }
-
- private Optional<ChangeEdit> lookupChangeEdit(ChangeNotes notes)
- throws AuthException, IOException {
- return changeEditUtil.byChange(notes);
- }
-
- private PatchSet getBasePatchSet(Optional<ChangeEdit> optionalChangeEdit, ChangeNotes notes)
- throws OrmException {
- Optional<PatchSet> editBasePatchSet = optionalChangeEdit.map(ChangeEdit::getBasePatchSet);
- return editBasePatchSet.isPresent() ? editBasePatchSet.get() : lookupCurrentPatchSet(notes);
- }
-
- private PatchSet lookupCurrentPatchSet(ChangeNotes notes) throws OrmException {
- return patchSetUtil.current(reviewDb.get(), notes);
- }
-
- private static boolean isBasedOn(ChangeEdit changeEdit, PatchSet patchSet) {
- PatchSet editBasePatchSet = changeEdit.getBasePatchSet();
- return editBasePatchSet.getId().equals(patchSet.getId());
- }
-
- private static RevCommit lookupCommit(Repository repository, PatchSet patchSet)
- throws IOException {
- ObjectId patchSetCommitId = getPatchSetCommitId(patchSet);
- return lookupCommit(repository, patchSetCommitId);
- }
-
- private static RevCommit lookupCommit(Repository repository, ObjectId commitId)
- throws IOException {
- try (RevWalk revWalk = new RevWalk(repository)) {
- return revWalk.parseCommit(commitId);
- }
- }
-
- private static ObjectId createNewTree(
- Repository repository, RevCommit baseCommit, List<TreeModification> treeModifications)
- throws IOException, InvalidChangeOperationException {
- TreeCreator treeCreator = new TreeCreator(baseCommit);
- treeCreator.addTreeModifications(treeModifications);
- ObjectId newTreeId = treeCreator.createNewTreeAndGetId(repository);
-
- if (ObjectId.equals(newTreeId, baseCommit.getTree())) {
- throw new InvalidChangeOperationException("no changes were made");
- }
- return newTreeId;
- }
-
- private static ObjectId merge(Repository repository, ChangeEdit changeEdit, ObjectId newTreeId)
- throws IOException, MergeConflictException {
- PatchSet basePatchSet = changeEdit.getBasePatchSet();
- ObjectId basePatchSetCommitId = getPatchSetCommitId(basePatchSet);
- ObjectId editCommitId = changeEdit.getEditCommit();
-
- ThreeWayMerger threeWayMerger = MergeStrategy.RESOLVE.newMerger(repository, true);
- threeWayMerger.setBase(basePatchSetCommitId);
- boolean successful = threeWayMerger.merge(newTreeId, editCommitId);
-
- if (!successful) {
- throw new MergeConflictException(
- "The existing change edit could not be merged with another tree.");
- }
- return threeWayMerger.getResultTreeId();
- }
-
- private ObjectId createCommit(
- Repository repository,
- RevCommit basePatchSetCommit,
- ObjectId tree,
- String commitMessage,
- Timestamp timestamp)
- throws IOException {
- try (ObjectInserter objectInserter = repository.newObjectInserter()) {
- CommitBuilder builder = new CommitBuilder();
- builder.setTreeId(tree);
- builder.setParentIds(basePatchSetCommit.getParents());
- builder.setAuthor(basePatchSetCommit.getAuthorIdent());
- builder.setCommitter(getCommitterIdent(timestamp));
- builder.setMessage(commitMessage);
- ObjectId newCommitId = objectInserter.insert(builder);
- objectInserter.flush();
- return newCommitId;
- }
- }
-
- private PersonIdent getCommitterIdent(Timestamp commitTimestamp) {
- IdentifiedUser user = currentUser.get().asIdentifiedUser();
- return user.newCommitterIdent(commitTimestamp, tz);
- }
-
- private static ObjectId getPatchSetCommitId(PatchSet patchSet) {
- return ObjectId.fromString(patchSet.getRevision().get());
- }
-
- private ChangeEdit createEdit(
- Repository repository,
- ChangeNotes notes,
- PatchSet basePatchSet,
- ObjectId newEditCommitId,
- Timestamp timestamp)
- throws IOException, OrmException {
- Change change = notes.getChange();
- String editRefName = getEditRefName(change, basePatchSet);
- updateReference(repository, editRefName, ObjectId.zeroId(), newEditCommitId, timestamp);
- reindex(change);
-
- RevCommit newEditCommit = lookupCommit(repository, newEditCommitId);
- return new ChangeEdit(change, editRefName, newEditCommit, basePatchSet);
- }
-
- private String getEditRefName(Change change, PatchSet basePatchSet) {
- IdentifiedUser me = currentUser.get().asIdentifiedUser();
- return RefNames.refsEdit(me.getAccountId(), change.getId(), basePatchSet.getId());
- }
-
- private ChangeEdit updateEdit(
- Repository repository, ChangeEdit changeEdit, ObjectId newEditCommitId, Timestamp timestamp)
- throws IOException, OrmException {
- String editRefName = changeEdit.getRefName();
- RevCommit currentEditCommit = changeEdit.getEditCommit();
- updateReference(repository, editRefName, currentEditCommit, newEditCommitId, timestamp);
- reindex(changeEdit.getChange());
-
- RevCommit newEditCommit = lookupCommit(repository, newEditCommitId);
- return new ChangeEdit(
- changeEdit.getChange(), editRefName, newEditCommit, changeEdit.getBasePatchSet());
- }
-
- private void updateReference(
- Repository repository,
- String refName,
- ObjectId currentObjectId,
- ObjectId targetObjectId,
- Timestamp timestamp)
- throws IOException {
- RefUpdate ru = repository.updateRef(refName);
- ru.setExpectedOldObjectId(currentObjectId);
- ru.setNewObjectId(targetObjectId);
- ru.setRefLogIdent(getRefLogIdent(timestamp));
- ru.setRefLogMessage("inline edit (amend)", false);
- ru.setForceUpdate(true);
- try (RevWalk revWalk = new RevWalk(repository)) {
- RefUpdate.Result res = ru.update(revWalk);
- if (res != RefUpdate.Result.NEW && res != RefUpdate.Result.FORCED) {
- throw new IOException(
- "cannot update "
- + ru.getName()
- + " in "
- + repository.getDirectory()
- + ": "
- + ru.getResult());
- }
- }
- }
-
- private void updateReferenceWithNameChange(
- Repository repository,
- String currentRefName,
- ObjectId currentObjectId,
- String newRefName,
- ObjectId targetObjectId,
- Timestamp timestamp)
- throws IOException {
- BatchRefUpdate batchRefUpdate = repository.getRefDatabase().newBatchUpdate();
- batchRefUpdate.addCommand(new ReceiveCommand(ObjectId.zeroId(), targetObjectId, newRefName));
- batchRefUpdate.addCommand(
- new ReceiveCommand(currentObjectId, ObjectId.zeroId(), currentRefName));
- batchRefUpdate.setRefLogMessage("rebase edit", false);
- batchRefUpdate.setRefLogIdent(getRefLogIdent(timestamp));
- try (RevWalk revWalk = new RevWalk(repository)) {
- batchRefUpdate.execute(revWalk, NullProgressMonitor.INSTANCE);
- }
- for (ReceiveCommand cmd : batchRefUpdate.getCommands()) {
- if (cmd.getResult() != ReceiveCommand.Result.OK) {
- throw new IOException("failed: " + cmd);
- }
- }
- }
-
- private PersonIdent getRefLogIdent(Timestamp timestamp) {
- IdentifiedUser user = currentUser.get().asIdentifiedUser();
- return user.newRefLogIdent(timestamp, tz);
- }
-
- private void reindex(Change change) throws IOException, OrmException {
- indexer.index(reviewDb.get(), change);
- }
-}