ReceiveCommits: split validateNewPatchSetCommit into multiple
functions Specialize the function for autoClose == false and autoClose==true. Change-Id: Icb5d6f71e8aaee256fdbe821823fcd909c6724da
This commit is contained in:
@@ -2417,7 +2417,7 @@ class ReceiveCommits {
|
|||||||
for (Iterator<ReplaceRequest> itr = replaceByChange.values().iterator(); itr.hasNext(); ) {
|
for (Iterator<ReplaceRequest> itr = replaceByChange.values().iterator(); itr.hasNext(); ) {
|
||||||
ReplaceRequest req = itr.next();
|
ReplaceRequest req = itr.next();
|
||||||
if (req.inputCommand.getResult() == NOT_ATTEMPTED) {
|
if (req.inputCommand.getResult() == NOT_ATTEMPTED) {
|
||||||
req.validateNewPatchSetCommit(false);
|
req.validateNewPatchSet();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (OrmException err) {
|
} catch (OrmException err) {
|
||||||
@@ -2507,14 +2507,44 @@ class ReceiveCommits {
|
|||||||
* <li>May reset {@code receivePack.getRevWalk()}; do not call in the middle of a walk.
|
* <li>May reset {@code receivePack.getRevWalk()}; do not call in the middle of a walk.
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* @param autoClose whether the caller intends to auto-close the change after adding a new patch
|
|
||||||
* set.
|
|
||||||
* @return whether the new commit is valid
|
* @return whether the new commit is valid
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* @throws OrmException
|
* @throws OrmException
|
||||||
* @throws PermissionBackendException
|
* @throws PermissionBackendException
|
||||||
*/
|
*/
|
||||||
boolean validateNewPatchSetCommit(boolean autoClose)
|
boolean validateNewPatchSet() throws IOException, OrmException, PermissionBackendException {
|
||||||
|
if (!validateNewPatchSetCommit()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sameTreeWarning(false);
|
||||||
|
|
||||||
|
if (magicBranch != null) {
|
||||||
|
validateMagicBranchWipStatusChange();
|
||||||
|
if (inputCommand.getResult() != NOT_ATTEMPTED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (magicBranch.edit || magicBranch.draft) {
|
||||||
|
return newEdit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newPatchSet();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean validateNewPatchSetForAutoClose()
|
||||||
|
throws IOException, OrmException, PermissionBackendException {
|
||||||
|
if (!validateNewPatchSetCommit()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sameTreeWarning(true);
|
||||||
|
newPatchSet();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Validates the new PS against permissions and notedb status. */
|
||||||
|
private boolean validateNewPatchSetCommit()
|
||||||
throws IOException, OrmException, PermissionBackendException {
|
throws IOException, OrmException, PermissionBackendException {
|
||||||
if (notes == null) {
|
if (notes == null) {
|
||||||
reject(inputCommand, "change " + ontoChange + " not found");
|
reject(inputCommand, "change " + ontoChange + " not found");
|
||||||
@@ -2529,7 +2559,6 @@ class ReceiveCommits {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RevCommit newCommit = receivePack.getRevWalk().parseCommit(newCommitId);
|
RevCommit newCommit = receivePack.getRevWalk().parseCommit(newCommitId);
|
||||||
RevCommit priorCommit = revisions.inverse().get(priorPatchSet);
|
|
||||||
|
|
||||||
// Not allowed to create a new patch set if the current patch set is locked.
|
// Not allowed to create a new patch set if the current patch set is locked.
|
||||||
if (psUtil.isPatchSetLocked(notes)) {
|
if (psUtil.isPatchSetLocked(notes)) {
|
||||||
@@ -2573,10 +2602,38 @@ class ReceiveCommits {
|
|||||||
receivePack.getRevWalk(), change.getDest(), inputCommand, newCommit, change)) {
|
receivePack.getRevWalk(), change.getDest(), inputCommand, newCommit, change)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
receivePack.getRevWalk().parseBody(priorCommit);
|
/** Validates whether the WIP change is allowed. Rejects inputCommand if not. */
|
||||||
|
private void validateMagicBranchWipStatusChange() throws PermissionBackendException {
|
||||||
|
Change change = notes.getChange();
|
||||||
|
if ((magicBranch.workInProgress || magicBranch.ready)
|
||||||
|
&& magicBranch.workInProgress != change.isWorkInProgress()
|
||||||
|
&& !user.getAccountId().equals(change.getOwner())) {
|
||||||
|
boolean hasWriteConfigPermission = false;
|
||||||
|
try {
|
||||||
|
permissions.check(ProjectPermission.WRITE_CONFIG);
|
||||||
|
hasWriteConfigPermission = true;
|
||||||
|
} catch (AuthException e) {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasWriteConfigPermission) {
|
||||||
|
try {
|
||||||
|
permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
|
||||||
|
} catch (AuthException e1) {
|
||||||
|
reject(inputCommand, ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** prints a warning if the new PS has the same tree as the previous commit. */
|
||||||
|
private void sameTreeWarning(boolean autoClose) throws IOException {
|
||||||
|
RevCommit newCommit = receivePack.getRevWalk().parseCommit(newCommitId);
|
||||||
|
RevCommit priorCommit = revisions.inverse().get(priorPatchSet);
|
||||||
|
|
||||||
// Warning if the tree was the same.
|
|
||||||
if (newCommit.getTree().equals(priorCommit.getTree())) {
|
if (newCommit.getTree().equals(priorCommit.getTree())) {
|
||||||
boolean messageEq =
|
boolean messageEq =
|
||||||
Objects.equals(newCommit.getFullMessage(), priorCommit.getFullMessage());
|
Objects.equals(newCommit.getFullMessage(), priorCommit.getFullMessage());
|
||||||
@@ -2606,37 +2663,12 @@ class ReceiveCommits {
|
|||||||
addMessage(msg.toString());
|
addMessage(msg.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (magicBranch != null
|
|
||||||
&& (magicBranch.workInProgress || magicBranch.ready)
|
|
||||||
&& magicBranch.workInProgress != change.isWorkInProgress()
|
|
||||||
&& !user.getAccountId().equals(change.getOwner())) {
|
|
||||||
boolean hasWriteConfigPermission = false;
|
|
||||||
try {
|
|
||||||
permissions.check(ProjectPermission.WRITE_CONFIG);
|
|
||||||
hasWriteConfigPermission = true;
|
|
||||||
} catch (AuthException e) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasWriteConfigPermission) {
|
|
||||||
try {
|
|
||||||
permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
|
|
||||||
} catch (AuthException e1) {
|
|
||||||
reject(inputCommand, ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (magicBranch != null && (magicBranch.edit || magicBranch.draft)) {
|
|
||||||
return newEdit();
|
|
||||||
}
|
|
||||||
|
|
||||||
newPatchSet();
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets cmd and prev to the ReceiveCommands for change edits. Returns false if there was a
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
private boolean newEdit() {
|
private boolean newEdit() {
|
||||||
psId = notes.getChange().currentPatchSetId();
|
psId = notes.getChange().currentPatchSetId();
|
||||||
Optional<ChangeEdit> edit = null;
|
Optional<ChangeEdit> edit = null;
|
||||||
@@ -2667,8 +2699,8 @@ class ReceiveCommits {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Creates a ReceiveCommand for a new edit. */
|
||||||
private void createEditCommand() {
|
private void createEditCommand() {
|
||||||
// create new edit
|
|
||||||
cmd =
|
cmd =
|
||||||
new ReceiveCommand(
|
new ReceiveCommand(
|
||||||
ObjectId.zeroId(),
|
ObjectId.zeroId(),
|
||||||
@@ -2676,6 +2708,7 @@ class ReceiveCommits {
|
|||||||
RefNames.refsEdit(user.getAccountId(), notes.getChangeId(), psId));
|
RefNames.refsEdit(user.getAccountId(), notes.getChangeId(), psId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Updates 'this' to add a new patchset. */
|
||||||
private void newPatchSet() throws IOException, OrmException {
|
private void newPatchSet() throws IOException, OrmException {
|
||||||
RevCommit newCommit = receivePack.getRevWalk().parseCommit(newCommitId);
|
RevCommit newCommit = receivePack.getRevWalk().parseCommit(newCommitId);
|
||||||
psId =
|
psId =
|
||||||
@@ -3065,7 +3098,7 @@ class ReceiveCommits {
|
|||||||
|
|
||||||
for (ReplaceRequest req : replaceAndClose) {
|
for (ReplaceRequest req : replaceAndClose) {
|
||||||
Change.Id id = req.notes.getChangeId();
|
Change.Id id = req.notes.getChangeId();
|
||||||
if (!req.validateNewPatchSetCommit(true)) {
|
if (!req.validateNewPatchSetForAutoClose()) {
|
||||||
logger.atFine().log("Not closing %s because validation failed", id);
|
logger.atFine().log("Not closing %s because validation failed", id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user