# # # patch "roster.cc" # from [a669689fe53c7f4bbe048fbdea18f547bb6e99b6] # to [acf1a7c274f42c9c2fc950b4a8478302d7057d76] # # patch "roster.hh" # from [e7edf72c5072ee37d3616544fee37b94a73283cb] # to [36f74b7c6e863434716bf7b8707be09b11364bef] # # patch "work.cc" # from [cebcdd33eb19bf15b3b2781d7362b7f8e8c4d752] # to [6dc2f9122f0173070675dde7447b9429a2c6ceed] # ============================================================ --- roster.cc a669689fe53c7f4bbe048fbdea18f547bb6e99b6 +++ roster.cc acf1a7c274f42c9c2fc950b4a8478302d7057d76 @@ -1864,9 +1864,10 @@ namespace { // WARNING: this function is not tested directly (no unit tests). Do not // put real logic in it. void - make_roster_for_merge(revision_t const & rev, revision_id const & new_rid, + make_roster_for_merge(revision_t const & rev, parent_map const & parents, + revision_id const & new_rid, roster_t & new_roster, marking_map & new_markings, - database & db, node_id_source & nis) + node_id_source & nis) { edge_map::const_iterator i = rev.edges.begin(); revision_id const & left_rid = edge_old_revision(i); @@ -1877,8 +1878,8 @@ namespace { I(!null_id(left_rid) && !null_id(right_rid)); cached_roster left_cached, right_cached; - db.get_roster(left_rid, left_cached); - db.get_roster(right_rid, right_cached); + left_cached = safe_get(parents, left_rid); + right_cached = safe_get(parents, right_rid); set left_uncommon_ancestors, right_uncommon_ancestors; db.get_uncommon_ancestors(left_rid, right_rid, @@ -1914,13 +1915,15 @@ namespace { // put real logic in it. void make_roster_for_nonmerge(revision_t const & rev, + parent_map const & parents, revision_id const & new_rid, roster_t & new_roster, marking_map & new_markings, database & db, node_id_source & nis) { revision_id const & parent_rid = edge_old_revision(rev.edges.begin()); cset const & parent_cs = edge_changes(rev.edges.begin()); - db.get_roster(parent_rid, new_roster, new_markings); + new_roster = *safe_get(parents, parent_rid).first; + new_markings = *safe_get(parents, parent_rid).second; make_roster_for_nonmerge(parent_cs, new_rid, new_roster, new_markings, nis); } } @@ -1971,18 +1974,25 @@ void // WARNING: this function is not tested directly (no unit tests). Do not put // real logic in it. void -make_roster_for_revision(revision_t const & rev, revision_id const & new_rid, +make_roster_for_revision(revision_t const & rev, parent_map const & parents, + revision_id const & new_rid, roster_t & new_roster, marking_map & new_markings, - database & db, node_id_source & nis) + node_id_source & nis) { MM(rev); MM(new_rid); MM(new_roster); MM(new_markings); + // Make sure rev and parents match up + I(rev.edges.size() == parents.size()); + for (edge_map::const_iterator i = rev.edges.begin(); i != rev.edges.end(); ++i) + I(parents.find(edge_old_revision(i)) != parents.end()); if (rev.edges.size() == 1) - make_roster_for_nonmerge(rev, new_rid, new_roster, new_markings, db, nis); + make_roster_for_nonmerge(rev, parents, + new_rid, new_roster, new_markings, nis); else if (rev.edges.size() == 2) - make_roster_for_merge(rev, new_rid, new_roster, new_markings, db, nis); + make_roster_for_merge(rev, parents, + new_rid, new_roster, new_markings, nis); else I(false); @@ -1999,7 +2009,11 @@ make_roster_for_revision(revision_t cons app_state & app) { true_node_id_source nis(app); - make_roster_for_revision(rev, new_rid, new_roster, new_markings, app.db, nis); + parent_map parents; + app.db.get_parent_map(rev, parents); + make_roster_for_revision(rev, parents, new_rid, + new_roster, new_markings, + nis); } ============================================================ --- roster.hh e7edf72c5072ee37d3616544fee37b94a73283cb +++ roster.hh 36f74b7c6e863434716bf7b8707be09b11364bef @@ -471,13 +471,14 @@ make_roster_for_revision(revision_t cons app_state & app); // This is for revisions that are not necessarily going to be written to the -// db; you can specify your own node_id_source. +// db; you can specify your own node_id_source. Note that it also requires +// you give the parent_map -- it will not fetch things from the db. void make_roster_for_revision(revision_t const & rev, + parent_map const & parents, revision_id const & rid, roster_t & result, marking_map & marking, - database & db, node_id_source & nis); void ============================================================ --- work.cc cebcdd33eb19bf15b3b2781d7362b7f8e8c4d752 +++ work.cc 6dc2f9122f0173070675dde7447b9429a2c6ceed @@ -169,19 +169,14 @@ workspace::get_current_roster_shape(pare get_work_rev(rev); revision_id new_rid(fake_id()); - // If there is just one parent, it might be the null ID, which - // make_roster_for_revision does not handle correctly. - if (rev.edges.size() == 1 && null_id(edge_old_revision(rev.edges.begin()))) - { - I(ros.all_nodes().size() == 0); - editable_roster_base er(ros, nis); - edge_changes(rev.edges.begin()).apply_to(er); - } - else - { - marking_map dummy; - make_roster_for_revision(rev, new_rid, ros, dummy, db, nis); - } + parent_map parents; + db.get_parent_map(rev, parents); + + // FIXME: marking this roster is a big waste -- for merge rosters, for + // instance, it requires an extra bunch of disk activity to fetch uncommon + // ancestors, for no reason! + marking_map dummy; + make_roster_for_revision(rev, parents, new_rid, ros, dummy, nis); } // user log file