# # # patch "rcs_import.cc" # from [311d234465240f37657d3ff3ee08db511a1b9921] # to [f9e2697f0a58263d7abd4ede0b6f7325b40cbb38] # ============================================================ --- rcs_import.cc 311d234465240f37657d3ff3ee08db511a1b9921 +++ rcs_import.cc f9e2697f0a58263d7abd4ede0b6f7325b40cbb38 @@ -3783,8 +3783,8 @@ blob_consumer::merge_parents_for_artific if (wanted_rid == right_rid) { - I(right_roster.has_node(pth)); - + if (right_roster.has_node(pth)) + { node_t right_node(right_roster.get_node(pth)); I(is_file_t(right_node)); @@ -3810,6 +3810,9 @@ blob_consumer::merge_parents_for_artific L(FL(" using right revision for file '%s' at '%s'") % pth % right_fn->content); } + else + L(FL(" using right revision for file '%s', unchanged.") + % pth); } else { @@ -3826,6 +3829,18 @@ blob_consumer::merge_parents_for_artific L(FL(" using right revision for file '%s' at '%s'") % pth % right_fn->content); } + } + else + { + // The right node does not have that node, but we are asked to + // inherit from it, so should remove the node. + node_id nid = merged_roster.detach_node(pth); + merged_roster.drop_detached_node(nid); + + // FIXME: possibly delete empty directories here... + + L(FL(" using right revision for file '%s' (deleted)") % pth); + } } else if (wanted_rid == left_rid) { @@ -4031,31 +4046,31 @@ blob_consumer::create_artificial_revisio } I(event_parent_blobs.size() == 1); - cvs_blob & event_parent = cvs.blobs[*event_parent_blobs.begin()]; + revision_id & ev_parent_rid = + cvs.blobs[*event_parent_blobs.begin()].assigned_rid; - if (event_parent.assigned_rid != parent_rid) + if (ev_parent_rid != parent_rid) { roster_t e_ros; - if (!null_id(event_parent.assigned_rid)) + if (!null_id(ev_parent_rid)) { // event needs reverting patch - app.db.get_roster(event_parent.assigned_rid, e_ros); + app.db.get_roster(ev_parent_rid, e_ros); file_path pth = file_path_internal(cvs.path_interner.lookup((*i)->path)); - I(ros.has_node(pth)); - I(e_ros.has_node(pth)); + L(FL(" checking file '%s'") % pth); - node_t base_node(ros.get_node(pth)), - target_node(e_ros.get_node(pth)); + if (e_ros.has_node(pth) && ros.has_node(pth)) + { + node_t base_node(ros.get_node(pth)), + target_node(e_ros.get_node(pth)); + I(is_file_t(base_node)); + I(is_file_t(target_node)); + file_t base_fn(downcast_to_file_t(base_node)), + target_fn(downcast_to_file_t(target_node)); - I(is_file_t(base_node)); - I(is_file_t(target_node)); - - file_t base_fn(downcast_to_file_t(base_node)), - target_fn(downcast_to_file_t(target_node)); - // FIXME: renaming issue! I(base_node->self == target_node->self); @@ -4067,6 +4082,28 @@ blob_consumer::create_artificial_revisio make_pair(pth, make_pair(base_fn->content, target_fn->content))); changes++; } + } + else if (!e_ros.has_node(pth) && ros.has_node(pth)) + { + L(FL(" dropping file '%s'") % pth); + safe_insert(cs->nodes_deleted, pth); + changes++; + } + else if (e_ros.has_node(pth) && !ros.has_node(pth)) + { + node_t target_node(e_ros.get_node(pth)); + I(is_file_t(target_node)); + file_t target_fn(downcast_to_file_t(target_node)); + + // Hm.. that's going to create a newish node id, which + // might not be what we want. OTOH, we don't have + // resurrection, yet. + L(FL(" re-adding file '%s' at '%s'") + % pth % target_fn->content); + safe_insert(cs->files_added, + make_pair(pth, target_fn->content)); + changes++; + } } else {