use of com.google.gerrit.server.submit.IntegrationConflictException in project gerrit by GerritCodeReview.
the class CherryPickChange method cherryPick.
/**
* This function can be called directly to cherry-pick a change (or commit if sourceChange is
* null) with a few other parameters that are especially useful for cherry-picking a commit that
* is the revert-of another change.
*
* @param sourceChange Change to cherry pick. Can be null, and then the function will only cherry
* pick a commit.
* @param project Project name
* @param sourceCommit Id of the commit to be cherry picked.
* @param input Input object for different configurations of cherry pick.
* @param dest Destination branch for the cherry pick.
* @param timestamp the current timestamp.
* @param revertedChange The id of the change that is reverted. This is used for the "revertOf"
* field to mark the created cherry pick change as "revertOf" the original change that was
* reverted.
* @param changeIdForNewChange The Change-Id that the new change of the cherry pick will have.
* @param idForNewChange The ID that the new change of the cherry pick will have. If provided and
* the cherry-pick doesn't result in creating a new change, then
* InvalidChangeOperationException is thrown.
* @return Result object that describes the cherry pick.
* @throws IOException Unable to open repository or read from the database.
* @throws InvalidChangeOperationException Parent or branch don't exist, or two changes with same
* key exist in the branch. Also thrown when idForNewChange is not null but cherry-pick only
* creates a new patchset rather than a new change.
* @throws UpdateException Problem updating the database using batchUpdateFactory.
* @throws RestApiException Error such as invalid SHA1
* @throws ConfigInvalidException Can't find account to notify.
* @throws NoSuchProjectException Can't find project state.
*/
public Result cherryPick(@Nullable Change sourceChange, Project.NameKey project, ObjectId sourceCommit, CherryPickInput input, BranchNameKey dest, Instant timestamp, @Nullable Change.Id revertedChange, @Nullable ObjectId changeIdForNewChange, @Nullable Change.Id idForNewChange, @Nullable Boolean workInProgress) throws IOException, InvalidChangeOperationException, UpdateException, RestApiException, ConfigInvalidException, NoSuchProjectException {
IdentifiedUser identifiedUser = user.get();
try (Repository git = gitManager.openRepository(project);
// before patch sets are updated.
ObjectInserter oi = git.newObjectInserter();
ObjectReader reader = oi.newReader();
CodeReviewRevWalk revWalk = CodeReviewCommit.newRevWalk(reader)) {
Ref destRef = git.getRefDatabase().exactRef(dest.branch());
if (destRef == null) {
throw new InvalidChangeOperationException(String.format("Branch %s does not exist.", dest.branch()));
}
RevCommit baseCommit = getBaseCommit(destRef, project.get(), revWalk, input.base);
CodeReviewCommit commitToCherryPick = revWalk.parseCommit(sourceCommit);
if (input.parent <= 0 || input.parent > commitToCherryPick.getParentCount()) {
throw new InvalidChangeOperationException(String.format("Cherry Pick: Parent %s does not exist. Please specify a parent in" + " range [1, %s].", input.parent, commitToCherryPick.getParentCount()));
}
// If the commit message is not set, the commit message of the source commit will be used.
String commitMessage = Strings.nullToEmpty(input.message);
commitMessage = commitMessage.isEmpty() ? commitToCherryPick.getFullMessage() : commitMessage;
String destChangeId = getDestinationChangeId(commitMessage, changeIdForNewChange);
ChangeData destChange = null;
if (destChangeId != null) {
// If "idForNewChange" is not null we must fail, since we are not expecting an already
// existing change.
destChange = getDestChangeWithVerification(destChangeId, dest, idForNewChange != null);
}
if (changeIdForNewChange != null) {
// If Change-Id was explicitly provided for the new change, override the value in commit
// message.
commitMessage = ChangeIdUtil.insertId(commitMessage, changeIdForNewChange, true);
} else if (destChangeId == null) {
// If commit message did not specify Change-Id, generate a new one and insert to the
// message.
commitMessage = ChangeIdUtil.insertId(commitMessage, CommitMessageUtil.generateChangeId(), true);
}
commitMessage = CommitMessageUtil.checkAndSanitizeCommitMessage(commitMessage);
CodeReviewCommit cherryPickCommit;
ProjectState projectState = projectCache.get(dest.project()).orElseThrow(noSuchProject(dest.project()));
PersonIdent committerIdent = identifiedUser.newCommitterIdent(timestamp, serverTimeZone);
try {
MergeUtil mergeUtil;
if (input.allowConflicts) {
// allowConflicts requires to use content merge
mergeUtil = mergeUtilFactory.create(projectState, true);
} else {
// use content merge only if it's configured on the project
mergeUtil = mergeUtilFactory.create(projectState);
}
cherryPickCommit = mergeUtil.createCherryPickFromCommit(oi, git.getConfig(), baseCommit, commitToCherryPick, committerIdent, commitMessage, revWalk, input.parent - 1, input.allowEmpty, input.allowConflicts);
oi.flush();
} catch (MergeIdenticalTreeException | MergeConflictException e) {
throw new IntegrationConflictException("Cherry pick failed: " + e.getMessage(), e);
}
try (BatchUpdate bu = batchUpdateFactory.create(project, identifiedUser, timestamp)) {
bu.setRepository(git, revWalk, oi);
bu.setNotify(resolveNotify(input));
Change.Id changeId;
String newTopic = null;
if (input.topic != null) {
newTopic = Strings.emptyToNull(input.topic.trim());
}
if (newTopic == null && sourceChange != null && !Strings.isNullOrEmpty(sourceChange.getTopic())) {
newTopic = sourceChange.getTopic() + "-" + dest.shortName();
}
if (destChange != null) {
// The change key exists on the destination branch. The cherry pick
// will be added as a new patch set.
changeId = insertPatchSet(bu, git, destChange.notes(), cherryPickCommit, sourceChange, newTopic, input, workInProgress);
} else {
// Change key not found on destination branch. We can create a new
// change.
changeId = createNewChange(bu, cherryPickCommit, dest.branch(), newTopic, project, sourceChange, sourceCommit, input, revertedChange, idForNewChange, workInProgress);
}
bu.execute();
return Result.create(changeId, cherryPickCommit.getFilesWithGitConflicts());
}
}
}
use of com.google.gerrit.server.submit.IntegrationConflictException in project gerrit by GerritCodeReview.
the class OnSubmitValidators method validate.
public void validate(Project.NameKey project, ObjectReader objectReader, ChainedReceiveCommands commands) throws IntegrationConflictException {
try (RevWalk rw = new RevWalk(objectReader)) {
Arguments args = new Arguments(project, rw, commands);
listeners.runEach(l -> l.preBranchUpdate(args), ValidationException.class);
} catch (ValidationException e) {
throw new IntegrationConflictException(e.getMessage(), e);
}
}
Aggregations