message: WIP: make it recurs if activation fails
diff: @@ -710,7 +710,11 @@ fn activate_deps_loop<'a>(
  trace!("{}[{}]>{} {} candidates", parent.name(), cur, dep.name(), candidates.len());
  trace!("{}[{}]>{} {} prev activations", parent.name(), cur, dep.name(), cx.prev_active(&dep).len());
  +
  let mut remaining_candidates = RemainingCandidates::new(&candidates);
  + let mut successfully_activated = false;
  +
  + while !successfully_activated {
  let next = remaining_candidates.next(cx.prev_active(&dep), &cx.links);
  // Alright, for each candidate that's gotten this far, it meets the
  @@ -757,11 +761,12 @@ fn activate_deps_loop<'a>(
  // We have a candidate. Add an entry to the `backtrack_stack` so
  // we can try the next one if this one fails.
  if has_another {
  + // TODO: when to push this vs. activation error
  backtrack_stack.push(BacktrackFrame {
  cur,
  context_backup: Context::clone(&cx),
  deps_backup: <BinaryHeap<DepsFrame>>::clone(&remaining_deps),
  - remaining_candidates,
  + remaining_candidates: remaining_candidates.clone(),
  parent: Summary::clone(&parent),
  dep: Dependency::clone(&dep),
  features: Rc::clone(&features),
  @@ -774,12 +779,17 @@ fn activate_deps_loop<'a>(
  uses_default_features: dep.uses_default_features(),
  };
  trace!("{}[{}]>{} trying {}", parent.name(), cur, dep.name(), candidate.summary.version());
  - let res = activate(&mut cx, registry, Some(&parent), candidate, &method)?;
  - if let Some((frame, dur)) = res {
  + let res = activate(&mut cx, registry, Some(&parent), candidate, &method);
  + successfully_activated = res.is_ok();
  + // TODO: disable fast-backtracking
  + // TODO: save that disable status in backtrack frame
  + // TODO: integrate with error messages
  + if let Ok(Some((frame, dur))) = res {
  remaining_deps.push(frame);
  deps_time += dur;
  }
  }
  + }
  Ok(cx)
  }
  