# # # add_dir "tests/simple_resurrect" # # add_file "tests/simple_resurrect/__driver__.lua" # content [7d819084f0187405f3b0ca8374e4dbcbd27c5e30] # # patch "NEWS" # from [8bfc034c5266e8c70d8e129dfeda1ce418dc6ea4] # to [1bb5eaffc932dfe5d56fb87b82fde4439871c6fe] # # patch "cmd_merging.cc" # from [c00d7dd2a1dd4dda7da812ae6216b6ee391238b9] # to [ca3132221356158cd15c4f208d1b389928e71fa6] # # patch "merge.cc" # from [9059000487b5a7e6e6390175c376b45ca4f251f0] # to [a010be170441f41e6bdd6f743d2e77e7d7b97670] # # patch "merge.hh" # from [f3613e195ad378f7666d003b959b322abbce97d0] # to [640dcf1677440193e12668cf4b5bd3826817820f] # # patch "options_list.hh" # from [78fbe7c5728513ee672b75d6dcefbc2f508ba915] # to [30be465d09211a018d160c4af5120e785a49e913] # # patch "roster.cc" # from [932a1eaa645faae04e0523ac971c997bcdeacb4f] # to [2b49989b43d8603f03a0e8cbde5bcdbbc478720b] # # patch "roster_merge.cc" # from [9e78641df3839d48c1eb481e46ec3dde525d3308] # to [3d039a2d7df3ebb612df3e2398542f311ac48c22] # # patch "roster_merge.hh" # from [48d9aa743811732826e3f855a5759c1d61416984] # to [1634e78ba574824534512f111da1970d3a099a9d] # ============================================================ --- tests/simple_resurrect/__driver__.lua 7d819084f0187405f3b0ca8374e4dbcbd27c5e30 +++ tests/simple_resurrect/__driver__.lua 7d819084f0187405f3b0ca8374e4dbcbd27c5e30 @@ -0,0 +1,22 @@ +mtn_setup() + +writefile("testfile", "foo blah") + +check(mtn("add", "testfile"), 0, false, false) +commit() +base = base_revision() + +writefile("testfile", "bar blah") +commit() +left = base_revision() + +revert_to(base) + +check(mtn("drop", "testfile"), 0, false, false) +commit() + +check(mtn("merge", "--livelivelive"), 0, false, false) + +check(mtn("update"), 0, false, false) + +check(exists("testfile")) ============================================================ --- NEWS 8bfc034c5266e8c70d8e129dfeda1ce418dc6ea4 +++ NEWS 1bb5eaffc932dfe5d56fb87b82fde4439871c6fe @@ -11,6 +11,9 @@ - mtn automate inventory will show the birth revision for any file that has been committed. + - Add a "--livelivelive" option that causes merges to have files live + rather than die if there is any conflict. + Bugs fixed - If the options --db or --keydir were previously specified for a ============================================================ --- cmd_merging.cc c00d7dd2a1dd4dda7da812ae6216b6ee391238b9 +++ cmd_merging.cc ca3132221356158cd15c4f208d1b389928e71fa6 @@ -48,7 +48,8 @@ three_way_merge(revision_id const & ance revision_id const & right_rid, roster_t const & right_roster, roster_merge_result & result, marking_map & left_markings, - marking_map & right_markings) + marking_map & right_markings, + bool uselivelivelivemerge) { MM(ancestor_roster); MM(left_roster); @@ -83,7 +84,8 @@ three_way_merge(revision_id const & ance P(F("[right] %s") % right_rid); // And do the merge - roster_merge(left_roster, left_markings, left_uncommon_ancestors, + roster_merge(uselivelivelivemerge, + left_roster, left_markings, left_uncommon_ancestors, right_roster, right_markings, right_uncommon_ancestors, result); } @@ -271,7 +273,8 @@ CMD(update, "update", "", CMD_REF(worksp three_way_merge(old_rid, *old_roster, working_rid, *working_roster, chosen_rid, chosen_roster, - result, left_markings, right_markings); + result, left_markings, right_markings, + app.opts.uselivelivelivemerge); roster_t & merged_roster = result.roster; @@ -355,7 +358,7 @@ merge_two(options & opts, lua_hooks & lu revision_id merged; transaction_guard guard(project.db); - interactive_merge_and_store(lua, project.db, left, right, merged); + interactive_merge_and_store(lua, project.db, left, right, merged, opts.uselivelivelivemerge); project.put_standard_certs_from_options(opts, lua, keys, merged, branch, utf8(log.str())); @@ -626,7 +629,8 @@ CMD(merge_into_dir, "merge_into_dir", "" } roster_merge_result result; - roster_merge(left_roster, + roster_merge(app.opts.uselivelivelivemerge, + left_roster, left_marking_map, left_uncommon_ancestors, right_roster, @@ -737,7 +741,8 @@ CMD(merge_into_workspace, "merge_into_wo roster_merge_result merge_result; MM(merge_result); - roster_merge(*left.first, *left.second, left_uncommon_ancestors, + roster_merge(app.opts.uselivelivelivemerge, + *left.first, *left.second, left_uncommon_ancestors, *right.first, *right.second, right_uncommon_ancestors, merge_result); @@ -848,7 +853,8 @@ show_conflicts_core (database & db, revi set l_uncommon_ancestors, r_uncommon_ancestors; db.get_uncommon_ancestors(l_id, r_id, l_uncommon_ancestors, r_uncommon_ancestors); roster_merge_result result; - roster_merge(*l_roster, l_marking, l_uncommon_ancestors, + roster_merge(false, // don't worry about uselivelivelivemerge here because it cannot affect conflicts... + *l_roster, l_marking, l_uncommon_ancestors, *r_roster, r_marking, r_uncommon_ancestors, result); @@ -1120,7 +1126,8 @@ CMD(pluck, "pluck", "", CMD_REF(workspac three_way_merge(from_rid, *from_roster, working_rid, *working_roster, to_rid, *to_roster, - result, left_markings, right_markings); + result, left_markings, right_markings, + app.opts.uselivelivelivemerge); roster_t & merged_roster = result.roster; ============================================================ --- merge.cc 9059000487b5a7e6e6390175c376b45ca4f251f0 +++ merge.cc a010be170441f41e6bdd6f743d2e77e7d7b97670 @@ -185,7 +185,8 @@ interactive_merge_and_store(lua_hooks & interactive_merge_and_store(lua_hooks & lua, database & db, revision_id const & left_rid, revision_id const & right_rid, - revision_id & merged_rid) + revision_id & merged_rid, + bool uselivelivelivemerge) { roster_t left_roster, right_roster; marking_map left_marking_map, right_marking_map; @@ -198,7 +199,8 @@ interactive_merge_and_store(lua_hooks & roster_merge_result result; - roster_merge(left_roster, left_marking_map, left_uncommon_ancestors, + roster_merge(uselivelivelivemerge, + left_roster, left_marking_map, left_uncommon_ancestors, right_roster, right_marking_map, right_uncommon_ancestors, result); ============================================================ --- merge.hh f3613e195ad378f7666d003b959b322abbce97d0 +++ merge.hh 640dcf1677440193e12668cf4b5bd3826817820f @@ -46,7 +46,8 @@ interactive_merge_and_store(lua_hooks & interactive_merge_and_store(lua_hooks & lua, database & db, revision_id const & left, revision_id const & right, - revision_id & merged); + revision_id & merged, + bool uselivelivelivemerge); void store_roster_merge_result(database & db, ============================================================ --- options_list.hh 78fbe7c5728513ee672b75d6dcefbc2f508ba915 +++ options_list.hh 30be465d09211a018d160c4af5120e785a49e913 @@ -329,6 +329,14 @@ OPTION(include, include, true, "include" } #endif +GOPT(uselivelivelivemerge, "livelivelive", bool, false, + gettext_noop("When merging, nodes dropped on one side of the merge live rather than die")) +#ifdef option_bodies +{ + uselivelivelivemerge = true; +} +#endif + GOPT(ignore_suspend_certs, "ignore-suspend-certs", bool, false, gettext_noop("do not ignore revisions marked as suspended")) #ifdef option_bodies ============================================================ --- roster.cc 932a1eaa645faae04e0523ac971c997bcdeacb4f +++ roster.cc 2b49989b43d8603f03a0e8cbde5bcdbbc478720b @@ -1672,8 +1672,9 @@ mark_merge_roster(roster_t const & left_ node_t const & right_node = rni->second; marking_t const & right_marking = safe_get(right_markings, n->self); // must be unborn on the left (as opposed to dead) - I(right_uncommon_ancestors.find(right_marking.birth_revision) - != right_uncommon_ancestors.end()); +#warning I just commented out this invariant as I think it no longer applies... + //I(right_uncommon_ancestors.find(right_marking.birth_revision) + // != right_uncommon_ancestors.end()); mark_unmerged_node(right_marking, right_node, new_rid, n, new_marking); } @@ -1682,8 +1683,9 @@ mark_merge_roster(roster_t const & left_ node_t const & left_node = lni->second; marking_t const & left_marking = safe_get(left_markings, n->self); // must be unborn on the right (as opposed to dead) - I(left_uncommon_ancestors.find(left_marking.birth_revision) - != left_uncommon_ancestors.end()); +#warning I just commented out this invariant as I think it no longer applies... + //I(left_uncommon_ancestors.find(left_marking.birth_revision) + // != left_uncommon_ancestors.end()); mark_unmerged_node(left_marking, left_node, new_rid, n, new_marking); } ============================================================ --- roster_merge.cc 9e78641df3839d48c1eb481e46ec3dde525d3308 +++ roster_merge.cc 3d039a2d7df3ebb612df3e2398542f311ac48c22 @@ -1428,10 +1428,11 @@ namespace marking_map const & markings, set const & uncommon_ancestors, roster_t const & parent_roster, - roster_t & new_roster) + roster_t & new_roster, + bool livelivelive) { revision_id const & birth = safe_get(markings, n->self).birth_revision; - if (uncommon_ancestors.find(birth) != uncommon_ancestors.end()) + if (livelivelive || uncommon_ancestors.find(birth) != uncommon_ancestors.end()) create_node_for(n, new_roster); else { @@ -1596,7 +1597,8 @@ void } // end anonymous namespace void -roster_merge(roster_t const & left_parent, +roster_merge(bool uselivelivelivemerge, + roster_t const & left_parent, marking_map const & left_markings, set const & left_uncommon_ancestors, roster_t const & right_parent, @@ -1628,13 +1630,13 @@ roster_merge(roster_t const & left_paren case parallel::in_left: insert_if_unborn(i.left_data(), left_markings, left_uncommon_ancestors, left_parent, - result.roster); + result.roster, uselivelivelivemerge); break; case parallel::in_right: insert_if_unborn(i.right_data(), right_markings, right_uncommon_ancestors, right_parent, - result.roster); + result.roster, uselivelivelivemerge); break; case parallel::in_both: @@ -1997,7 +1999,10 @@ test_a_scalar_merge_impl(scalar_val left string_to_set(left_uncommon_str, left_uncommon_ancestors); string_to_set(right_uncommon_str, right_uncommon_ancestors); - roster_merge(left_parent, left_markings, left_uncommon_ancestors, + #warning should change the uselivelivelivemerge hard coded to false to something that tests better... + + roster_merge(false, + left_parent, left_markings, left_uncommon_ancestors, right_parent, right_markings, right_uncommon_ancestors, result); @@ -2502,7 +2507,8 @@ UNIT_TEST(roster_merge, node_lifecycle) b_safe_dir_nid, b_safe_file_nid, nis); // do the merge roster_merge_result result; - roster_merge(a_roster, a_markings, a_uncommon, b_roster, b_markings, b_uncommon, result); +#warning should change the false on the next line to test better + roster_merge(false, a_roster, a_markings, a_uncommon, b_roster, b_markings, b_uncommon, result); I(result.is_clean()); // go ahead and check the roster_delta code too, while we're at it... test_roster_delta_on(a_roster, a_markings, b_roster, b_markings); @@ -2578,7 +2584,8 @@ UNIT_TEST(roster_merge, attr_lifecycle) roster_merge_result result; MM(result); - roster_merge(left_roster, left_markings, left_revs, +#warning should change the false on the next line to test better + roster_merge(false, left_roster, left_markings, left_revs, right_roster, right_markings, right_revs, result); // go ahead and check the roster_delta code too, while we're at it... @@ -2628,7 +2635,8 @@ struct structural_conflict_helper setup(); MM(result); - roster_merge(left_roster, left_markings, left_revs, +#warning should change the false on the next line to test better + roster_merge(false,left_roster, left_markings, left_revs, right_roster, right_markings, right_revs, result); // go ahead and check the roster_delta code too, while we're at it... ============================================================ --- roster_merge.hh 48d9aa743811732826e3f855a5759c1d61416984 +++ roster_merge.hh 1634e78ba574824534512f111da1970d3a099a9d @@ -203,7 +203,8 @@ void template <> void dump(roster_merge_result const & result, std::string & out); void -roster_merge(roster_t const & left_parent, +roster_merge(bool uselivelivelivemerge, + roster_t const & left_parent, marking_map const & left_markings, std::set const & left_uncommon_ancestors, roster_t const & right_parent,