int commit_interleaver::translate_parents()

in src/commit_interleaver.h [241:305]


int commit_interleaver::translate_parents(const commit_source &source,
                                          const commit_type &base,
                                          std::vector<sha1_ref> &new_parents,
                                          std::vector<int> &parent_revs,
                                          sha1_ref parent_override,
                                          int override_p,
                                          int &new_srev) {
  new_srev = 0;
  int max_urev = 0;
  auto process_future = [&](sha1_ref p) {
    auto *bc_index = source.worker->boundary_index_map.lookup(*p);
    if (!bc_index)
      return;

    auto &bc = source.worker->futures[bc_index->index];
    assert(bc.commit == p);
    if (bc.was_noted)
      return;

    cache.note_tree_raw(p, bc.rawtree);
    bc.was_noted = true;
  };
  auto add_parent = [&](sha1_ref p) {
    assert(!p->is_zeros());

    // Deal with this parent.
    if (base.has_boundary_parents)
      process_future(p);

    new_parents.push_back(p);
    int srev = 0;
    cache.compute_rev(p, /*is_split=*/!source.is_repeat, srev);
    parent_revs.push_back(srev);
    update_revs(new_srev, max_urev, srev);
  };

  // Wait for the worker to dig up information on boundary parents.
  if (base.has_boundary_parents)
    while (int(source.worker->last_ready_future) < base.last_boundary_parent)
      if (bool(source.worker->has_error))
        return 1;

  if (parent_override && override_p == -1) {
    assert(!base.num_parents);
    add_parent(parent_override);
    return 0;
  }

  for (int i = 0; i < base.num_parents; ++i) {
    assert(!base.parents[i]->is_zeros());

    // Override the first parent.
    if (i == override_p) {
      add_parent(parent_override);
      continue;
    }

    sha1_ref mono;
    if (cache.compute_mono(base.parents[i], mono))
      return error("parent " + base.parents[i]->to_string() + " of " +
                   base.commit->to_string() + " not translated");
    add_parent(mono);
  }
  return 0;
}