Optimize cherry pick operation by not re-reading change

Change-Id: If2c307b43788fe9c2efc008fee009334730c4506
This commit is contained in:
David Ostrovsky
2014-11-02 12:24:30 +01:00
committed by David Pursehouse
parent 6842df9ac6
commit 2c01edd5cb
2 changed files with 13 additions and 20 deletions

View File

@@ -24,7 +24,6 @@ import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.git.MergeException;
import com.google.gerrit.server.project.ChangeControl;
@@ -83,11 +82,11 @@ public class CherryPick implements RestModifyView<RevisionResource, CherryPickIn
+ input.destination);
}
final PatchSet.Id patchSetId = revision.getPatchSet().getId();
try {
Change.Id cherryPickedChangeId = cherryPickChange.cherryPick(
patchSetId, input.message,
input.destination, refControl);
Change.Id cherryPickedChangeId =
cherryPickChange.cherryPick(revision.getChange(),
revision.getPatchSet(), input.message, input.destination,
refControl);
return json.format(cherryPickedChangeId);
} catch (InvalidChangeOperationException e) {
throw new BadRequestException(e.getMessage());

View File

@@ -94,31 +94,25 @@ public class CherryPickChange {
this.mergeUtilFactory = mergeUtilFactory;
}
public Change.Id cherryPick(final PatchSet.Id patchSetId,
public Change.Id cherryPick(Change change, PatchSet patch,
final String message, final String destinationBranch,
final RefControl refControl) throws NoSuchChangeException,
OrmException, MissingObjectException,
IncorrectObjectTypeException, IOException,
InvalidChangeOperationException, MergeException {
final Change.Id changeId = patchSetId.getParentKey();
final PatchSet patch = db.get().patchSets().get(patchSetId);
if (patch == null) {
throw new NoSuchChangeException(changeId);
}
if (destinationBranch == null || destinationBranch.length() == 0) {
throw new InvalidChangeOperationException(
"Cherry Pick: Destination branch cannot be null or empty");
}
Change change = db.get().changes().get(changeId);
Project.NameKey project = change.getProject();
IdentifiedUser identifiedUser = (IdentifiedUser) currentUser.get();
final Repository git;
try {
git = gitManager.openRepository(project);
} catch (RepositoryNotFoundException e) {
throw new NoSuchChangeException(changeId, e);
throw new NoSuchChangeException(change.getId(), e);
}
try {
@@ -171,9 +165,8 @@ public class CherryPickChange {
List<Change> destChanges =
db.get().changes()
.byBranchKey(
new Branch.NameKey(db.get().changes().get(changeId).getProject(),
destRef.getName()), changeKey).toList();
.byBranchKey(new Branch.NameKey(project, destRef.getName()),
changeKey).toList();
if (destChanges.size() > 1) {
throw new InvalidChangeOperationException("Several changes with key "
@@ -182,13 +175,14 @@ public class CherryPickChange {
} else if (destChanges.size() == 1) {
// The change key exists on the destination branch. The cherry pick
// will be added as a new patch set.
return insertPatchSet(git, revWalk, destChanges.get(0), cherryPickCommit,
refControl, identifiedUser);
return insertPatchSet(git, revWalk, destChanges.get(0),
cherryPickCommit, refControl, identifiedUser);
} else {
// Change key not found on destination branch. We can create a new
// change.
return createNewChange(git, revWalk, changeKey, project, patchSetId, destRef,
cherryPickCommit, refControl, identifiedUser, change.getTopic());
return createNewChange(git, revWalk, changeKey, project,
patch.getId(), destRef, cherryPickCommit, refControl,
identifiedUser, change.getTopic());
}
} finally {
revWalk.release();