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;
}