# # patch "commands.cc" # from [7bf613f88b2dfc594f3d8509395e5f59fc2921f2] # to [dc6cd9b5a53cf64cf281fd564f0d818a1076c4be] # # patch "merge.cc" # from [12f6e60553fa38edc3ed1adc0741e2c4286b3f8e] # to [3745b24e475a700475414f335ce3015f5c845893] # # patch "roster.cc" # from [47b7f10128451b5bccc5611487f90e804454a479] # to [12bf8a61f931883e89a9e016aff358e4af219607] # # patch "roster.hh" # from [6fb90c1b03e5a501aa9235f4f774488c3a7e1728] # to [5e27376e3d341c426930fb6eb71860145a59b18c] # ======================================================================== --- commands.cc 7bf613f88b2dfc594f3d8509395e5f59fc2921f2 +++ commands.cc dc6cd9b5a53cf64cf281fd564f0d818a1076c4be @@ -2796,11 +2796,12 @@ *old_roster, working_roster); calculate_ident(r_working, r_working_id); - make_roster_for_revision(r_working, r_working_id, - working_roster, working_mm, app); - I(r_working.edges.size() == 1); r_old_id = edge_old_revision(r_working.edges.begin()); + make_roster_for_base_plus_cset(r_old_id, + edge_changes(r_working.edges.begin()), + r_working_id, + working_roster, working_mm, app); N(!null_id(r_old_id), F("this working directory is a new project; cannot update")); ======================================================================== --- merge.cc 12f6e60553fa38edc3ed1adc0741e2c4286b3f8e +++ merge.cc 3745b24e475a700475414f335ce3015f5c845893 @@ -143,6 +143,14 @@ roster_merge_result result; +// { +// data tmp; +// write_roster_and_marking(left_roster, left_marking_map, tmp); +// P(F("merge left roster: [[[\n%s\n]]]\n") % tmp); +// write_roster_and_marking(right_roster, right_marking_map, tmp); +// P(F("merge right roster: [[[\n%s\n]]]\n") % tmp); +// } + roster_merge(left_roster, left_marking_map, left_uncommon_ancestors, right_roster, right_marking_map, right_uncommon_ancestors, result); ======================================================================== --- roster.cc 47b7f10128451b5bccc5611487f90e804454a479 +++ roster.cc 12bf8a61f931883e89a9e016aff358e4af219607 @@ -826,7 +826,10 @@ for (full_attr_map_t::const_iterator i = n->attrs.begin(); i != n->attrs.end(); ++i) I(i->second.first || i->second.second().empty()); if (n != root_dir) - I(downcast_to_dir_t(get_node(n->parent))->get_child(n->name) == n); + { + I(!null_node(n->parent)); + I(downcast_to_dir_t(get_node(n->parent))->get_child(n->name) == n); + } } @@ -1501,6 +1504,19 @@ } void +make_roster_for_base_plus_cset(revision_id const & base, cset const & cs, + revision_id const & new_rid, + roster_t & result, marking_map & marking, + app_state & app) +{ + roster_t parent_r; + app.db.get_roster(base, result, marking); + temp_node_id_source nis; + editable_roster_for_nonmerge er(result, nis, new_rid, marking); + cs.apply_to(er); +} + +void make_roster_for_revision(revision_set const & rev, revision_id const & rid, roster_t & result, marking_map & marking, app_state & app) { @@ -1522,6 +1538,7 @@ } else I(false); + result.check_sane_against(marking); } ======================================================================== --- roster.hh 6fb90c1b03e5a501aa9235f4f774488c3a7e1728 +++ roster.hh 5e27376e3d341c426930fb6eb71860145a59b18c @@ -217,6 +217,8 @@ void parse_from(basic_io::parser & pa, marking_map & mm); + dir_t const & root() { return root_dir; } + private: void do_deep_copy_from(roster_t const & other); void check_finite_depth() const; @@ -290,6 +292,14 @@ extract_roster_path_set(roster_t const & ros, path_set & paths); +void +make_roster_for_base_plus_cset(revision_id const & base, + cset const & cs, + revision_id const & new_rid, + roster_t & result, + marking_map & marking, + app_state & app); + void make_roster_for_revision(revision_set const & rev, revision_id const & rid,