Merge branch 'stable-2.15' into stable-2.16
* stable-2.15: StarredChangesUtil: Fix NPE when ref to be deleted doesn't exist StarredChangesUtil: Throw LockFailureException on LOCK_FAILURE Add test for creating a change on a non-existing base change Rebase: Do not fail with 500 ISE if non-existing change is given as base Fix detecting changes of parent trees when computing change kind for merge commit Change-Id: I8ec9c55d86c3b425e0bce289f4c92cd5b6adbc80
This commit is contained in:
@@ -40,6 +40,7 @@ import com.google.gerrit.server.change.ChangeResource;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gerrit.server.git.LockFailureException;
|
||||
import com.google.gerrit.server.index.change.ChangeField;
|
||||
import com.google.gerrit.server.index.change.ChangeIndexer;
|
||||
import com.google.gerrit.server.logging.TraceContext;
|
||||
@@ -248,15 +249,21 @@ public class StarredChangesUtil {
|
||||
for (Account.Id accountId : byChangeFromIndex(changeId).keySet()) {
|
||||
String refName = RefNames.refsStarredChanges(changeId, accountId);
|
||||
Ref ref = repo.getRefDatabase().getRef(refName);
|
||||
batchUpdate.addCommand(new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), refName));
|
||||
if (ref != null) {
|
||||
batchUpdate.addCommand(new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), refName));
|
||||
}
|
||||
}
|
||||
batchUpdate.execute(rw, NullProgressMonitor.INSTANCE);
|
||||
for (ReceiveCommand command : batchUpdate.getCommands()) {
|
||||
if (command.getResult() != ReceiveCommand.Result.OK) {
|
||||
throw new IOException(
|
||||
String message =
|
||||
String.format(
|
||||
"Unstar change %d failed, ref %s could not be deleted: %s",
|
||||
changeId.get(), command.getRefName(), command.getResult()));
|
||||
changeId.get(), command.getRefName(), command.getResult());
|
||||
if (command.getResult() == ReceiveCommand.Result.LOCK_FAILURE) {
|
||||
throw new LockFailureException(message, batchUpdate);
|
||||
}
|
||||
throw new IOException(message);
|
||||
}
|
||||
}
|
||||
indexer.index(dbProvider.get(), project, changeId);
|
||||
|
@@ -214,13 +214,13 @@ public class ChangeKindCacheImpl implements ChangeKindCache {
|
||||
rw.parseBody(next);
|
||||
|
||||
if (!next.getFullMessage().equals(prior.getFullMessage())) {
|
||||
if (isSameDeltaAndTree(prior, next)) {
|
||||
if (isSameDeltaAndTree(rw, prior, next)) {
|
||||
return ChangeKind.NO_CODE_CHANGE;
|
||||
}
|
||||
return ChangeKind.REWORK;
|
||||
}
|
||||
|
||||
if (isSameDeltaAndTree(prior, next)) {
|
||||
if (isSameDeltaAndTree(rw, prior, next)) {
|
||||
return ChangeKind.NO_CHANGE;
|
||||
}
|
||||
|
||||
@@ -284,7 +284,8 @@ public class ChangeKindCacheImpl implements ChangeKindCache {
|
||||
return FluentIterable.from(Arrays.asList(parents)).skip(1).toSet();
|
||||
}
|
||||
|
||||
private static boolean isSameDeltaAndTree(RevCommit prior, RevCommit next) {
|
||||
private static boolean isSameDeltaAndTree(RevWalk rw, RevCommit prior, RevCommit next)
|
||||
throws IOException {
|
||||
if (!Objects.equals(next.getTree(), prior.getTree())) {
|
||||
return false;
|
||||
}
|
||||
@@ -298,6 +299,10 @@ public class ChangeKindCacheImpl implements ChangeKindCache {
|
||||
// Make sure that the prior/next delta is the same - not just the tree.
|
||||
// This is done by making sure that the parent trees are equal.
|
||||
for (int i = 0; i < prior.getParentCount(); i++) {
|
||||
// Parse parent commits so that their trees are available.
|
||||
rw.parseCommit(prior.getParent(i));
|
||||
rw.parseCommit(next.getParent(i));
|
||||
|
||||
if (!Objects.equals(next.getParent(i).getTree(), prior.getParent(i).getTree())) {
|
||||
return false;
|
||||
}
|
||||
|
@@ -24,6 +24,7 @@ import com.google.gerrit.extensions.restapi.AuthException;
|
||||
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
||||
import com.google.gerrit.extensions.restapi.RestApiException;
|
||||
import com.google.gerrit.extensions.restapi.RestModifyView;
|
||||
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
|
||||
import com.google.gerrit.extensions.webui.UiAction;
|
||||
import com.google.gerrit.reviewdb.client.Branch;
|
||||
import com.google.gerrit.reviewdb.client.Change;
|
||||
@@ -159,10 +160,17 @@ public class Rebase extends RetryingRestModifyView<RevisionResource, RebaseInput
|
||||
return destRef.getObjectId();
|
||||
}
|
||||
|
||||
Base base = rebaseUtil.parseBase(rsrc, str);
|
||||
if (base == null) {
|
||||
throw new ResourceConflictException("base revision is missing: " + str);
|
||||
Base base;
|
||||
try {
|
||||
base = rebaseUtil.parseBase(rsrc, str);
|
||||
if (base == null) {
|
||||
throw new ResourceConflictException("base revision is missing: " + str);
|
||||
}
|
||||
} catch (NoSuchChangeException e) {
|
||||
throw new UnprocessableEntityException(
|
||||
String.format("Base change not found: %s", input.base));
|
||||
}
|
||||
|
||||
PatchSet.Id baseId = base.patchSet().getId();
|
||||
if (change.getId().equals(baseId.getParentKey())) {
|
||||
throw new ResourceConflictException("cannot rebase change onto itself");
|
||||
|
Reference in New Issue
Block a user