Search in sources :

Example 16 with UpdateException

use of com.google.gerrit.server.update.UpdateException in project gerrit by GerritCodeReview.

the class ConsistencyChecker method deletePatchSets.

private void deletePatchSets(List<DeletePatchSetFromDbOp> ops) {
    try (BatchUpdate bu = newBatchUpdate()) {
        bu.setRepository(repo, rw, oi);
        for (DeletePatchSetFromDbOp op : ops) {
            checkArgument(op.psId.changeId().equals(notes.getChangeId()));
            bu.addOp(notes.getChangeId(), op);
        }
        bu.addOp(notes.getChangeId(), new UpdateCurrentPatchSetOp(ops));
        bu.execute();
    } catch (NoPatchSetsWouldRemainException e) {
        for (DeletePatchSetFromDbOp op : ops) {
            op.p.status = Status.FIX_FAILED;
            op.p.outcome = e.getMessage();
        }
    } catch (UpdateException | RestApiException e) {
        String msg = "Error deleting patch set";
        logger.atWarning().withCause(e).log("%s of change %s", msg, ops.get(0).psId.changeId());
        for (DeletePatchSetFromDbOp op : ops) {
            // Overwrite existing statuses that were set before the transaction was
            // rolled back.
            op.p.status = Status.FIX_FAILED;
            op.p.outcome = msg;
        }
    }
}
Also used : UpdateException(com.google.gerrit.server.update.UpdateException) RestApiException(com.google.gerrit.extensions.restapi.RestApiException) BatchUpdate(com.google.gerrit.server.update.BatchUpdate)

Example 17 with UpdateException

use of com.google.gerrit.server.update.UpdateException in project gerrit by GerritCodeReview.

the class ConsistencyChecker method fixMerged.

private void fixMerged(ProblemInfo p) {
    try (BatchUpdate bu = newBatchUpdate()) {
        bu.setRepository(repo, rw, oi);
        bu.addOp(notes.getChangeId(), new FixMergedOp(p));
        bu.execute();
    } catch (UpdateException | RestApiException e) {
        logger.atWarning().withCause(e).log("Error marking %s as merged", notes.getChangeId());
        p.status = Status.FIX_FAILED;
        p.outcome = "Error updating status to merged";
    }
}
Also used : UpdateException(com.google.gerrit.server.update.UpdateException) RestApiException(com.google.gerrit.extensions.restapi.RestApiException) BatchUpdate(com.google.gerrit.server.update.BatchUpdate)

Example 18 with UpdateException

use of com.google.gerrit.server.update.UpdateException in project gerrit by GerritCodeReview.

the class ConsistencyChecker method insertMergedPatchSet.

private void insertMergedPatchSet(final RevCommit commit, @Nullable PatchSet.Id psIdToDelete, boolean reuseOldPsId) {
    ProblemInfo notFound = problem("No patch set found for merged commit " + commit.name());
    if (!user.get().isIdentifiedUser()) {
        notFound.status = Status.FIX_FAILED;
        notFound.outcome = "Must be called by an identified user to insert new patch set";
        return;
    }
    ProblemInfo insertPatchSetProblem;
    ProblemInfo deleteOldPatchSetProblem;
    if (psIdToDelete == null) {
        insertPatchSetProblem = problem(String.format("Expected merged commit %s has no associated patch set", commit.name()));
        deleteOldPatchSetProblem = null;
    } else {
        String msg = String.format("Expected merge commit %s corresponds to patch set %s," + " not the current patch set %s", commit.name(), psIdToDelete.get(), change().currentPatchSetId().get());
        // Maybe an identical problem, but different fix.
        deleteOldPatchSetProblem = reuseOldPsId ? null : problem(msg);
        insertPatchSetProblem = problem(msg);
    }
    List<ProblemInfo> currProblems = new ArrayList<>(3);
    currProblems.add(notFound);
    if (deleteOldPatchSetProblem != null) {
        currProblems.add(deleteOldPatchSetProblem);
    }
    currProblems.add(insertPatchSetProblem);
    try {
        PatchSet.Id psId = (psIdToDelete != null && reuseOldPsId) ? psIdToDelete : ChangeUtil.nextPatchSetId(repo, change().currentPatchSetId());
        PatchSetInserter inserter = patchSetInserterFactory.create(notes, psId, commit);
        try (BatchUpdate bu = newBatchUpdate()) {
            bu.setRepository(repo, rw, oi);
            if (psIdToDelete != null) {
                // Delete the given patch set ref. If reuseOldPsId is true,
                // PatchSetInserter will reinsert the same ref, making it a no-op.
                bu.addOp(notes.getChangeId(), new BatchUpdateOp() {

                    @Override
                    public void updateRepo(RepoContext ctx) throws IOException {
                        ctx.addRefUpdate(commit, ObjectId.zeroId(), psIdToDelete.toRefName());
                    }
                });
                if (!reuseOldPsId) {
                    bu.addOp(notes.getChangeId(), new DeletePatchSetFromDbOp(requireNonNull(deleteOldPatchSetProblem), psIdToDelete));
                }
            }
            bu.setNotify(NotifyResolver.Result.none());
            bu.addOp(notes.getChangeId(), inserter.setValidate(false).setFireRevisionCreated(false).setAllowClosed(true).setMessage("Patch set for merged commit inserted by consistency checker"));
            bu.addOp(notes.getChangeId(), new FixMergedOp(notFound));
            bu.execute();
        }
        notes = notesFactory.createChecked(inserter.getChange());
        insertPatchSetProblem.status = Status.FIXED;
        insertPatchSetProblem.outcome = "Inserted as patch set " + psId.get();
    } catch (StorageException | IOException | UpdateException | RestApiException e) {
        logger.atWarning().withCause(e).log("Error in consistency check of change %s", notes.getChangeId());
        for (ProblemInfo pi : currProblems) {
            pi.status = Status.FIX_FAILED;
            pi.outcome = "Error inserting merged patch set";
        }
        return;
    }
}
Also used : RepoContext(com.google.gerrit.server.update.RepoContext) ProblemInfo(com.google.gerrit.extensions.common.ProblemInfo) ArrayList(java.util.ArrayList) PatchSet(com.google.gerrit.entities.PatchSet) IOException(java.io.IOException) BatchUpdate(com.google.gerrit.server.update.BatchUpdate) UpdateException(com.google.gerrit.server.update.UpdateException) RestApiException(com.google.gerrit.extensions.restapi.RestApiException) StorageException(com.google.gerrit.exceptions.StorageException) BatchUpdateOp(com.google.gerrit.server.update.BatchUpdateOp)

Example 19 with UpdateException

use of com.google.gerrit.server.update.UpdateException in project gerrit by GerritCodeReview.

the class MailReceiver method dispatchMailProcessor.

protected void dispatchMailProcessor(List<MailMessage> messages, boolean async) {
    for (MailMessage m : messages) {
        if (async) {
            @SuppressWarnings("unused") Future<?> possiblyIgnoredError = workQueue.getDefaultQueue().submit(() -> {
                try {
                    mailProcessor.process(m);
                    requestDeletion(m.id());
                } catch (RestApiException | UpdateException e) {
                    logger.atSevere().withCause(e).log("Mail: Can't process message %s . Won't delete.", m.id());
                }
            });
        } else {
            // Synchronous processing is used only in tests.
            try {
                mailProcessor.process(m);
                requestDeletion(m.id());
            } catch (RestApiException | UpdateException e) {
                logger.atSevere().withCause(e).log("Mail: Can't process messages. Won't delete.");
            }
        }
    }
}
Also used : MailMessage(com.google.gerrit.mail.MailMessage) UpdateException(com.google.gerrit.server.update.UpdateException) RestApiException(com.google.gerrit.extensions.restapi.RestApiException)

Example 20 with UpdateException

use of com.google.gerrit.server.update.UpdateException in project gerrit by GerritCodeReview.

the class MailProcessor method persistComments.

private void persistComments(BatchUpdate.Factory buf, MailMessage message, MailMetadata metadata, Account.Id sender) throws UpdateException, RestApiException {
    try (ManualRequestContext ctx = oneOffRequestContext.openAs(sender)) {
        List<ChangeData> changeDataList = queryProvider.get().enforceVisibility(true).byLegacyChangeId(Change.id(metadata.changeNumber));
        if (changeDataList.isEmpty()) {
            sendRejectionEmail(message, InboundEmailError.CHANGE_NOT_FOUND);
            return;
        }
        if (changeDataList.size() != 1) {
            logger.atSevere().log("Message %s references unique change %s," + " but there are %d matching changes in the index." + " Will delete message.", message.id(), metadata.changeNumber, changeDataList.size());
            sendRejectionEmail(message, InboundEmailError.INTERNAL_EXCEPTION);
            return;
        }
        ChangeData cd = Iterables.getOnlyElement(changeDataList);
        if (existingMessageIds(cd).contains(message.id())) {
            logger.atInfo().log("Message %s was already processed. Will delete message.", message.id());
            return;
        }
        // Get all comments; filter and sort them to get the original list of
        // comments from the outbound email.
        // TODO(hiesel) Also filter by original comment author.
        Collection<HumanComment> comments = cd.publishedComments().stream().filter(c -> (c.writtenOn.getTime() / 1000) == (metadata.timestamp.getTime() / 1000)).sorted(CommentsUtil.COMMENT_ORDER).collect(toList());
        Project.NameKey project = cd.project();
        // If URL is not defined, we won't be able to parse line comments. We still attempt to get the
        // other ones.
        String changeUrl = urlFormatter.get().getChangeViewUrl(cd.project(), cd.getId()).orElse("http://gerrit.invalid/");
        List<MailComment> parsedComments;
        if (useHtmlParser(message)) {
            parsedComments = HtmlParser.parse(message, comments, changeUrl);
        } else {
            parsedComments = TextParser.parse(message, comments, changeUrl);
        }
        if (parsedComments.isEmpty()) {
            logger.atWarning().log("Could not parse any comments from %s. Will delete message.", message.id());
            sendRejectionEmail(message, InboundEmailError.PARSING_ERROR);
            return;
        }
        ImmutableList<CommentForValidation> parsedCommentsForValidation = parsedComments.stream().map(comment -> CommentForValidation.create(CommentForValidation.CommentSource.HUMAN, MAIL_COMMENT_TYPE_TO_VALIDATION_TYPE.get(comment.getType()), comment.getMessage(), comment.getMessage().length())).collect(ImmutableList.toImmutableList());
        CommentValidationContext commentValidationCtx = CommentValidationContext.create(cd.change().getChangeId(), cd.change().getProject().get(), cd.change().getDest().branch());
        ImmutableList<CommentValidationFailure> commentValidationFailures = PublishCommentUtil.findInvalidComments(commentValidationCtx, commentValidators, parsedCommentsForValidation);
        if (!commentValidationFailures.isEmpty()) {
            sendRejectionEmail(message, InboundEmailError.COMMENT_REJECTED);
            return;
        }
        Op o = new Op(PatchSet.id(cd.getId(), metadata.patchSet), parsedComments, message.id());
        BatchUpdate batchUpdate = buf.create(project, ctx.getUser(), TimeUtil.now());
        batchUpdate.addOp(cd.getId(), o);
        batchUpdate.execute();
    }
}
Also used : DynamicItem(com.google.gerrit.extensions.registration.DynamicItem) Inject(com.google.inject.Inject) HumanComment(com.google.gerrit.entities.HumanComment) UpdateException(com.google.gerrit.server.update.UpdateException) BatchUpdate(com.google.gerrit.server.update.BatchUpdate) Map(java.util.Map) RetryHelper(com.google.gerrit.server.update.RetryHelper) UrlFormatter(com.google.gerrit.server.config.UrlFormatter) Side(com.google.gerrit.extensions.client.Side) OneOffRequestContext(com.google.gerrit.server.util.OneOffRequestContext) ImmutableMap(com.google.common.collect.ImmutableMap) Collection(java.util.Collection) Account(com.google.gerrit.entities.Account) MailFilter(com.google.gerrit.server.mail.MailFilter) Set(java.util.Set) ApprovalsUtil(com.google.gerrit.server.approval.ApprovalsUtil) ChangeData(com.google.gerrit.server.query.change.ChangeData) List(java.util.List) HtmlParser(com.google.gerrit.mail.HtmlParser) Emails(com.google.gerrit.server.account.Emails) CommentAdded(com.google.gerrit.server.extensions.events.CommentAdded) PluginSetContext(com.google.gerrit.server.plugincontext.PluginSetContext) InternalChangeQuery(com.google.gerrit.server.query.change.InternalChangeQuery) Optional(java.util.Optional) MailMetadata(com.google.gerrit.mail.MailMetadata) BatchUpdateOp(com.google.gerrit.server.update.BatchUpdateOp) FluentLogger(com.google.common.flogger.FluentLogger) ChangeMessagesUtil(com.google.gerrit.server.ChangeMessagesUtil) Singleton(com.google.inject.Singleton) AccountCache(com.google.gerrit.server.account.AccountCache) Iterables(com.google.common.collect.Iterables) CommentValidationContext(com.google.gerrit.extensions.validators.CommentValidationContext) TextParser(com.google.gerrit.mail.TextParser) PublishCommentUtil(com.google.gerrit.server.PublishCommentUtil) UnprocessableEntityException(com.google.gerrit.extensions.restapi.UnprocessableEntityException) CommentsUtil(com.google.gerrit.server.CommentsUtil) CommentForValidation(com.google.gerrit.extensions.validators.CommentForValidation) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) PATCHSET_LEVEL(com.google.gerrit.entities.Patch.PATCHSET_LEVEL) Strings(com.google.common.base.Strings) MessageIdGenerator(com.google.gerrit.server.mail.send.MessageIdGenerator) ImmutableList(com.google.common.collect.ImmutableList) PostUpdateContext(com.google.gerrit.server.update.PostUpdateContext) Change(com.google.gerrit.entities.Change) PatchSet(com.google.gerrit.entities.PatchSet) RestApiException(com.google.gerrit.extensions.restapi.RestApiException) MailComment(com.google.gerrit.mail.MailComment) ChangeContext(com.google.gerrit.server.update.ChangeContext) Extension(com.google.gerrit.extensions.registration.Extension) InboundEmailError(com.google.gerrit.server.mail.send.InboundEmailRejectionSender.InboundEmailError) MailMessage(com.google.gerrit.mail.MailMessage) MailHeaderParser(com.google.gerrit.mail.MailHeaderParser) StorageException(com.google.gerrit.exceptions.StorageException) CommentValidationFailure(com.google.gerrit.extensions.validators.CommentValidationFailure) ChangeNotes(com.google.gerrit.server.notedb.ChangeNotes) IOException(java.io.IOException) ManualRequestContext(com.google.gerrit.server.util.ManualRequestContext) Collectors.toList(java.util.stream.Collectors.toList) Provider(com.google.inject.Provider) DynamicMap(com.google.gerrit.extensions.registration.DynamicMap) Project(com.google.gerrit.entities.Project) TimeUtil(com.google.gerrit.server.util.time.TimeUtil) CommentValidator(com.google.gerrit.extensions.validators.CommentValidator) AccountState(com.google.gerrit.server.account.AccountState) PatchSetUtil(com.google.gerrit.server.PatchSetUtil) EmailReviewComments(com.google.gerrit.server.change.EmailReviewComments) InboundEmailRejectionSender(com.google.gerrit.server.mail.send.InboundEmailRejectionSender) BatchUpdateOp(com.google.gerrit.server.update.BatchUpdateOp) MailComment(com.google.gerrit.mail.MailComment) CommentForValidation(com.google.gerrit.extensions.validators.CommentForValidation) CommentValidationContext(com.google.gerrit.extensions.validators.CommentValidationContext) ChangeData(com.google.gerrit.server.query.change.ChangeData) BatchUpdate(com.google.gerrit.server.update.BatchUpdate) Project(com.google.gerrit.entities.Project) CommentValidationFailure(com.google.gerrit.extensions.validators.CommentValidationFailure) ManualRequestContext(com.google.gerrit.server.util.ManualRequestContext) HumanComment(com.google.gerrit.entities.HumanComment)

Aggregations

UpdateException (com.google.gerrit.server.update.UpdateException)26 RestApiException (com.google.gerrit.extensions.restapi.RestApiException)23 BatchUpdate (com.google.gerrit.server.update.BatchUpdate)22 IOException (java.io.IOException)20 BatchUpdateOp (com.google.gerrit.server.update.BatchUpdateOp)16 ResourceConflictException (com.google.gerrit.extensions.restapi.ResourceConflictException)13 ChangeContext (com.google.gerrit.server.update.ChangeContext)13 ChangeNotes (com.google.gerrit.server.notedb.ChangeNotes)12 StorageException (com.google.gerrit.exceptions.StorageException)11 PermissionBackendException (com.google.gerrit.server.permissions.PermissionBackendException)11 AuthException (com.google.gerrit.extensions.restapi.AuthException)10 ChangeData (com.google.gerrit.server.query.change.ChangeData)10 Inject (com.google.inject.Inject)10 Provider (com.google.inject.Provider)10 List (java.util.List)10 PatchSet (com.google.gerrit.entities.PatchSet)9 Singleton (com.google.inject.Singleton)9 ObjectId (org.eclipse.jgit.lib.ObjectId)9 Strings (com.google.common.base.Strings)8 Change (com.google.gerrit.entities.Change)8