evaluate: handle evaluation errors, and posting errors while posting eval errors better

This commit is contained in:
Graham Christensen 2020-04-06 06:59:53 -04:00
parent 00478e9dee
commit a1e8dcc1e5
No known key found for this signature in database
GPG key ID: FE918C3A98C1030F

View file

@ -202,52 +202,47 @@ impl<'a, E: stats::SysEvents + 'static> OneEval<'a, E> {
}
fn worker_actions(&mut self) -> worker::Actions {
let eval_result = self.evaluate_job();
if let Ok(actions) = eval_result {
return actions;
}
let eval_result =
eval_result.expect_err("We have an OK, but just checked for an Ok before");
let eval_result = self.evaluate_job().map_err(|eval_error| match eval_error {
// Handle error cases which expect us to post statuses
// to github. Convert Eval Errors in to Result<_, CommitStatusWrite>
EvalWorkerError::EvalError(eval::Error::Fail(msg)) => {
self.update_status(msg, None, hubcaps::statuses::State::Failure)
}
EvalWorkerError::EvalError(eval::Error::FailWithGist(msg, filename, content)) => self
.update_status(
msg,
self.make_gist(&filename, Some("".to_owned()), content),
hubcaps::statuses::State::Failure,
),
EvalWorkerError::EvalError(eval::Error::CommitStatusWrite(e)) => Err(e),
EvalWorkerError::CommitStatusWrite(e) => Err(e),
});
match eval_result {
EvalWorkerError::CommitStatusWrite(e)
| EvalWorkerError::EvalError(eval::Error::CommitStatusWrite(e)) => {
if e.is_internal_error() {
error!(
"Internal error writing commit status: {:?}, marking internal error",
e
);
let issue_ref = self.repo.issue(self.job.pr.number);
update_labels(&issue_ref, &[String::from("ofborg-internal-error")], &[]);
} else {
error!(
"Ignorable error writing commit status: {:?}, marking internal error",
e
);
}
Ok(eval_actions) => eval_actions,
Err(Ok(())) => {
// There was an error during eval, but we successfully
// updated the PR.
self.actions().skip(&self.job)
}
EvalWorkerError::EvalError(eval::Error::Fail(msg)) => {
self.update_status(msg.clone(), None, hubcaps::statuses::State::Failure)
.unwrap_or_else(|e| {
panic!("Failed to set plain status: {}; e: {:?}", msg, e);
});
Err(Err(cswerr)) if !cswerr.is_internal_error() => {
error!("Ignorable error writing commit status: {:?}", cswerr);
self.actions().skip(&self.job)
}
EvalWorkerError::EvalError(eval::Error::FailWithGist(msg, filename, content)) => {
self.update_status(
msg.clone(),
self.make_gist(&filename, Some("".to_owned()), content.clone()),
hubcaps::statuses::State::Failure,
)
.unwrap_or_else(|e| {
panic!(
"Failed to set status with a gist: {}, {}, {}; e: {:?}",
msg, filename, content, e
);
});
Err(Err(cswerr)) => {
error!(
"Internal error writing commit status: {:?}, marking internal error",
cswerr
);
let issue_ref = self.repo.issue(self.job.pr.number);
update_labels(&issue_ref, &[String::from("ofborg-internal-error")], &[]);
self.actions().skip(&self.job)
}
}
self.actions().skip(&self.job)
}
fn evaluate_job(&mut self) -> Result<worker::Actions, EvalWorkerError> {