in java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerSubmitRule.java [72:155]
public Optional<SubmitRecord> evaluate(ChangeData changeData) {
try {
requireNonNull(changeData, "changeData");
if (changeData.change().isClosed()) {
return Optional.empty();
}
try (Timer0.Context ctx = codeOwnerMetrics.runCodeOwnerSubmitRule.start()) {
codeOwnerMetrics.countCodeOwnerSubmitRuleRuns.increment();
logger.atFine().log(
"run code owner submit rule (project = %s, change = %d)",
changeData.project().get(), changeData.getId().get());
if (codeOwnersPluginConfiguration
.getProjectConfig(changeData.project())
.isDisabled(changeData.change().getDest().branch())) {
logger.atFine().log(
"code owners functionality is disabled for branch %s", changeData.change().getDest());
return Optional.empty();
}
return Optional.of(getSubmitRecord(changeData.notes()));
}
} catch (Exception e) {
// Whether the exception should be treated as RULE_ERROR.
// RULE_ERROR must only be returned if the exception is caused by user misconfiguration (e.g.
// an invalid OWNERS file), but not for internal server errors.
boolean isRuleError = false;
String cause = e.getClass().getSimpleName();
String errorMessage = "Failed to evaluate code owner statuses";
if (changeData != null) {
errorMessage +=
String.format(
" for patch set %d of change %d",
changeData.currentPatchSet().id().get(), changeData.change().getId().get());
}
Optional<InvalidPathException> invalidPathException =
CodeOwnersExceptionHook.getInvalidPathException(e);
Optional<InvalidPluginConfigurationException> invalidPluginConfigurationException =
CodeOwnersExceptionHook.getInvalidPluginConfigurationCause(e);
Optional<InvalidCodeOwnerConfigException> invalidCodeOwnerConfigException =
CodeOwners.getInvalidCodeOwnerConfigCause(e);
if (invalidPathException.isPresent()) {
isRuleError = true;
cause = "invalid_path";
errorMessage += String.format(" (cause: %s)", invalidPathException.get().getMessage());
} else if (invalidPluginConfigurationException.isPresent()) {
isRuleError = true;
cause = "invalid_plugin_configuration";
errorMessage +=
String.format(" (cause: %s)", invalidPluginConfigurationException.get().getMessage());
} else if (invalidCodeOwnerConfigException.isPresent()) {
isRuleError = true;
codeOwnerMetrics.countInvalidCodeOwnerConfigFiles.increment(
invalidCodeOwnerConfigException.get().getProjectName().get(),
invalidCodeOwnerConfigException.get().getRef(),
invalidCodeOwnerConfigException.get().getCodeOwnerConfigFilePath());
cause = "invalid_code_owner_config_file";
errorMessage +=
String.format(" (cause: %s)", invalidCodeOwnerConfigException.get().getMessage());
Optional<String> invalidCodeOwnerConfigInfoUrl =
codeOwnersPluginConfiguration
.getProjectConfig(invalidCodeOwnerConfigException.get().getProjectName())
.getInvalidCodeOwnerConfigInfoUrl();
if (invalidCodeOwnerConfigInfoUrl.isPresent()) {
errorMessage +=
String.format(".\nFor help check %s", invalidCodeOwnerConfigInfoUrl.get());
}
}
errorMessage += ".";
if (isRuleError) {
codeOwnerMetrics.countCodeOwnerSubmitRuleErrors.increment(cause);
logger.atWarning().log("%s", errorMessage);
return Optional.of(ruleError(errorMessage));
}
throw new CodeOwnersInternalServerErrorException(errorMessage, e);
}
}