# # # add_file "tests/resolve_conflicts_read_all/directory-loop_left" # content [2d2abdefc0339b3c87c2110639f3e69f84cf529a] # # add_file "tests/resolve_conflicts_read_all/directory-loop_right" # content [a2b216e38557f77ae33ba23fa8da75550a9a861a] # # add_file "tests/resolve_conflicts_read_all/duplicate-add-rename_left" # content [cefdc6b97b53c9efabb2c34c179df6866d8c8e69] # # add_file "tests/resolve_conflicts_read_all/duplicate-add-rename_right" # content [cefdc6b97b53c9efabb2c34c179df6866d8c8e69] # # add_file "tests/resolve_conflicts_read_all/duplicate-adds_left" # content [cefdc6b97b53c9efabb2c34c179df6866d8c8e69] # # add_file "tests/resolve_conflicts_read_all/duplicate-adds_right" # content [cefdc6b97b53c9efabb2c34c179df6866d8c8e69] # # add_file "tests/resolve_conflicts_read_all/duplicate-renames_left" # content [6b6d553038f3987c0aa41eaa849c0426451d3328] # # add_file "tests/resolve_conflicts_read_all/duplicate-renames_right" # content [6b6d553038f3987c0aa41eaa849c0426451d3328] # # add_file "tests/resolve_conflicts_read_all/multiple-names_left" # content [3d16a9489ff3d933f62c81f78320cdf87eb4dc51] # # add_file "tests/resolve_conflicts_read_all/multiple-names_right" # content [cf828f37eb3f250ddb790830d13d23f8ee0a9c28] # # add_file "tests/resolve_conflicts_read_all/orphaned-add_left" # content [a068d1a4c11421001558744eaeb80b2e7f8ce681] # # add_file "tests/resolve_conflicts_read_all/orphaned-add_right" # content [b9474d3cac17c784aa281da05e298484761450a5] # # add_file "tests/resolve_conflicts_read_all/orphaned-rename_left" # content [194f30324d2357dde21f3c3d35be062cad06b886] # # add_file "tests/resolve_conflicts_read_all/orphaned-rename_right" # content [2f23f8d495759525ba537e8b75f9f1d17b794042] # # patch "roster_merge.cc" # from [65e827163cf31ec89f77c73353baa5da43eacd1e] # to [118a09324229a6e5aeeaadf599909d9ce6ed6d4d] # # patch "tests/resolve_conflicts_read_all/__driver__.lua" # from [69803956634d281a23535588d085287b58753a4b] # to [6650db7ab1605dba9e988ac97579537499dcb428] # ============================================================ --- tests/resolve_conflicts_read_all/directory-loop_left 2d2abdefc0339b3c87c2110639f3e69f84cf529a +++ tests/resolve_conflicts_read_all/directory-loop_left 2d2abdefc0339b3c87c2110639f3e69f84cf529a @@ -0,0 +1,4 @@ +mtn: warning: 1 conflict with no supported resolutions. +mtn: conflict: directory loop created +mtn: 'bar' renamed to 'foo/bar' on the right +mtn: 'foo' renamed to 'bar/foo' on the left ============================================================ --- tests/resolve_conflicts_read_all/directory-loop_right a2b216e38557f77ae33ba23fa8da75550a9a861a +++ tests/resolve_conflicts_read_all/directory-loop_right a2b216e38557f77ae33ba23fa8da75550a9a861a @@ -0,0 +1,4 @@ +mtn: warning: 1 conflict with no supported resolutions. +mtn: conflict: directory loop created +mtn: 'foo' renamed to 'bar/foo' on the right +mtn: 'bar' renamed to 'foo/bar' on the left ============================================================ --- tests/resolve_conflicts_read_all/duplicate-add-rename_left cefdc6b97b53c9efabb2c34c179df6866d8c8e69 +++ tests/resolve_conflicts_read_all/duplicate-add-rename_left cefdc6b97b53c9efabb2c34c179df6866d8c8e69 @@ -0,0 +1 @@ +mtn: duplicate_name bar ============================================================ --- tests/resolve_conflicts_read_all/duplicate-add-rename_right cefdc6b97b53c9efabb2c34c179df6866d8c8e69 +++ tests/resolve_conflicts_read_all/duplicate-add-rename_right cefdc6b97b53c9efabb2c34c179df6866d8c8e69 @@ -0,0 +1 @@ +mtn: duplicate_name bar ============================================================ --- tests/resolve_conflicts_read_all/duplicate-adds_left cefdc6b97b53c9efabb2c34c179df6866d8c8e69 +++ tests/resolve_conflicts_read_all/duplicate-adds_left cefdc6b97b53c9efabb2c34c179df6866d8c8e69 @@ -0,0 +1 @@ +mtn: duplicate_name bar ============================================================ --- tests/resolve_conflicts_read_all/duplicate-adds_right cefdc6b97b53c9efabb2c34c179df6866d8c8e69 +++ tests/resolve_conflicts_read_all/duplicate-adds_right cefdc6b97b53c9efabb2c34c179df6866d8c8e69 @@ -0,0 +1 @@ +mtn: duplicate_name bar ============================================================ --- tests/resolve_conflicts_read_all/duplicate-renames_left 6b6d553038f3987c0aa41eaa849c0426451d3328 +++ tests/resolve_conflicts_read_all/duplicate-renames_left 6b6d553038f3987c0aa41eaa849c0426451d3328 @@ -0,0 +1 @@ +mtn: duplicate_name abc ============================================================ --- tests/resolve_conflicts_read_all/duplicate-renames_right 6b6d553038f3987c0aa41eaa849c0426451d3328 +++ tests/resolve_conflicts_read_all/duplicate-renames_right 6b6d553038f3987c0aa41eaa849c0426451d3328 @@ -0,0 +1 @@ +mtn: duplicate_name abc ============================================================ --- tests/resolve_conflicts_read_all/multiple-names_left 3d16a9489ff3d933f62c81f78320cdf87eb4dc51 +++ tests/resolve_conflicts_read_all/multiple-names_left 3d16a9489ff3d933f62c81f78320cdf87eb4dc51 @@ -0,0 +1,4 @@ +mtn: warning: 1 conflict with no supported resolutions. +mtn: conflict: multiple names for file 'foo' from revision 560b97068441495b17d8924f6122a1c47213a08b +mtn: renamed to 'bar' on the left +mtn: renamed to 'baz' on the right ============================================================ --- tests/resolve_conflicts_read_all/multiple-names_right cf828f37eb3f250ddb790830d13d23f8ee0a9c28 +++ tests/resolve_conflicts_read_all/multiple-names_right cf828f37eb3f250ddb790830d13d23f8ee0a9c28 @@ -0,0 +1,4 @@ +mtn: warning: 1 conflict with no supported resolutions. +mtn: conflict: multiple names for file 'foo' from revision 560b97068441495b17d8924f6122a1c47213a08b +mtn: renamed to 'baz' on the left +mtn: renamed to 'bar' on the right ============================================================ --- tests/resolve_conflicts_read_all/orphaned-add_left a068d1a4c11421001558744eaeb80b2e7f8ce681 +++ tests/resolve_conflicts_read_all/orphaned-add_left a068d1a4c11421001558744eaeb80b2e7f8ce681 @@ -0,0 +1,4 @@ +mtn: warning: 1 conflict with no supported resolutions. +mtn: conflict: orphaned file 'foo/bar' from revision efb0fbbaad55564248c9aa2d7b8154d7aa02031a +mtn: parent directory 'foo' was deleted on the right +mtn: file 'foo/baz' was added on the left ============================================================ --- tests/resolve_conflicts_read_all/orphaned-add_right b9474d3cac17c784aa281da05e298484761450a5 +++ tests/resolve_conflicts_read_all/orphaned-add_right b9474d3cac17c784aa281da05e298484761450a5 @@ -0,0 +1,4 @@ +mtn: warning: 1 conflict with no supported resolutions. +mtn: conflict: orphaned file 'foo/bar' from revision efb0fbbaad55564248c9aa2d7b8154d7aa02031a +mtn: parent directory 'foo' was deleted on the left +mtn: file 'foo/baz' was added on the right ============================================================ --- tests/resolve_conflicts_read_all/orphaned-rename_left 194f30324d2357dde21f3c3d35be062cad06b886 +++ tests/resolve_conflicts_read_all/orphaned-rename_left 194f30324d2357dde21f3c3d35be062cad06b886 @@ -0,0 +1,4 @@ +mtn: warning: 1 conflict with no supported resolutions. +mtn: conflict: orphaned file 'bar' from revision b5f52dbc0dc530adffbdd140a7de5b129cf74f29 +mtn: parent directory 'foo' was deleted on the right +mtn: file 'foo/baz' was renamed from 'bar' on the left ============================================================ --- tests/resolve_conflicts_read_all/orphaned-rename_right 2f23f8d495759525ba537e8b75f9f1d17b794042 +++ tests/resolve_conflicts_read_all/orphaned-rename_right 2f23f8d495759525ba537e8b75f9f1d17b794042 @@ -0,0 +1,4 @@ +mtn: warning: 1 conflict with no supported resolutions. +mtn: conflict: orphaned file 'bar' from revision b5f52dbc0dc530adffbdd140a7de5b129cf74f29 +mtn: parent directory 'foo' was deleted on the left +mtn: file 'foo/baz' was renamed from 'bar' on the right ============================================================ --- roster_merge.cc 65e827163cf31ec89f77c73353baa5da43eacd1e +++ roster_merge.cc 118a09324229a6e5aeeaadf599909d9ce6ed6d4d @@ -464,7 +464,7 @@ read_added_rename_conflict_right(basic_i } else if (tmp == "renamed directory") { - pars.esym(syms::ancestor_name); pars.str(tmp); + pars.esym(syms::ancestor_name); pars.str(); pars.esym(syms::right_name); pars.str(tmp); get_nid_name_pair(roster, tmp, right_nid, right_name); } @@ -1761,8 +1761,30 @@ read_directory_loop_conflict(basic_io::p // syms::directory_loop has been read - I(false); + if (pars.symp(syms::left_type)) + { + read_added_rename_conflict_left(pars, left_roster, conflict.nid, conflict.parent_name); + } + if (pars.symp(syms::right_type)) + { + read_added_rename_conflict_right(pars, right_roster, conflict.nid, conflict.parent_name); + } + if (pars.symp(syms::left_type)) + { + pars.sym(); + pars.str(); // "renamed directory" + pars.esym(syms::ancestor_name); pars.str(); + pars.esym(syms::left_name); pars.str(); + } + if (pars.symp(syms::right_type)) + { + pars.sym(); + pars.str(); // "renamed directory" + pars.esym(syms::ancestor_name); pars.str(); + pars.esym(syms::right_name); pars.str(); + } + } // read_directory_loop_conflict static void @@ -1797,14 +1819,14 @@ read_orphaned_node_conflict(basic_io::pa { pars.sym(); pars.str(); // "deleted directory | file" pars.esym(syms::ancestor_name); pars.str(); - read_added_rename_conflict_right (pars, right_roster, conflict.nid, conflict.parent_name); + read_added_rename_conflict_right(pars, right_roster, conflict.nid, conflict.parent_name); } else { pars.esym(syms::right_type); pars.str(); // "deleted directory | file" pars.esym(syms::ancestor_name); pars.str(); - read_added_rename_conflict_left (pars, left_roster, conflict.nid, conflict.parent_name); + read_added_rename_conflict_left(pars, left_roster, conflict.nid, conflict.parent_name); } } // read_orphaned_node_conflict @@ -1829,28 +1851,47 @@ read_orphaned_node_conflicts(basic_io::p } } // read_orphaned_node_conflicts + static void -read_duplicate_name_conflict(basic_io::parser & pars, - duplicate_name_conflict & conflict, +read_multiple_name_conflict(basic_io::parser & pars, + multiple_name_conflict & conflict, + roster_t const & left_roster, + roster_t const & right_roster) +{ + read_added_rename_conflict_left(pars, left_roster, conflict.nid, conflict.left); + read_added_rename_conflict_right(pars, right_roster, conflict.nid, conflict.right); +} // read_multiple_name_conflict + +static void +read_multiple_name_conflicts(basic_io::parser & pars, + std::vector & conflicts, roster_t const & left_roster, roster_t const & right_roster) { - string tmp; - string left_name, right_name; + while (pars.tok.in.lookahead != EOF && pars.symp(syms::multiple_names)) + { + multiple_name_conflict conflict(the_null_node); - // we don't care what type of file/dir these are; the right type will get - // written back out. - pars.esym(syms::left_type); pars.str(); - pars.esym (syms::left_name); pars.str(left_name); - pars.esym(syms::left_file_id); pars.hex(); + pars.sym(); - pars.esym(syms::right_type); pars.str(); - pars.esym (syms::right_name); pars.str(right_name); - pars.esym(syms::right_file_id); pars.hex(); + read_multiple_name_conflict(pars, conflict, left_roster, right_roster); - conflict.left_nid = left_roster.get_node (file_path_internal (left_name))->self; - conflict.right_nid = right_roster.get_node (file_path_internal (right_name))->self; + conflicts.push_back(conflict); + if (pars.tok.in.lookahead != EOF) + pars.esym (syms::conflict); + } +} // read_multiple_name_conflicts + +static void +read_duplicate_name_conflict(basic_io::parser & pars, + duplicate_name_conflict & conflict, + roster_t const & left_roster, + roster_t const & right_roster) +{ + read_added_rename_conflict_left(pars, left_roster, conflict.left_nid, conflict.parent_name); + read_added_rename_conflict_right(pars, right_roster, conflict.right_nid, conflict.parent_name); + // check for a resolution while ((!pars.symp (syms::conflict)) && pars.tok.in.lookahead != EOF) { @@ -1918,7 +1959,6 @@ read_duplicate_name_conflicts(basic_io:: pars.esym (syms::conflict); } } // read_duplicate_name_conflicts - static void validate_duplicate_name_conflicts(basic_io::parser & pars, std::vector & conflicts, @@ -1955,6 +1995,109 @@ static void } // validate_duplicate_name_conflicts static void +read_attr_state_left(basic_io::parser & pars, + std::pair value) +{ + if (pars.symp(syms::left_attr_value)) + { + pars.sym(); + value.first = true; + pars.str(); + value.second = attr_value(pars.token); + } + else + { + pars.esym(syms::left_attr_state); + value.first = false; + } +} // read_attr_state_left + +static void +read_attr_state_right(basic_io::parser & pars, + std::pair value) +{ + string tmp; + + if (pars.symp(syms::right_attr_value)) + { + pars.sym(); + value.first = true; + pars.str(tmp); + value.second = attr_value(tmp); + } + else + { + pars.esym(syms::right_attr_state); + pars.str(tmp); + I(tmp == "dropped"); + value.first = false; + } +} // read_attr_state_right + +static void +read_attribute_conflict(basic_io::parser & pars, + attribute_conflict & conflict, + roster_t const & left_roster, + roster_t const & right_roster) +{ + string tmp; + + pars.esym(syms::node_type); + + pars.str(tmp); + + if (tmp == "file") + { + pars.esym(syms::attr_name); pars.str(tmp); + conflict.key = attr_key(tmp); + pars.esym(syms::ancestor_name); pars.str(); + pars.esym(syms::ancestor_file_id); pars.hex(); + pars.esym(syms::left_name); pars.str(tmp); + conflict.nid = left_roster.get_node(file_path_external(utf8(tmp)))->self; + pars.esym(syms::left_file_id); pars.hex(); + read_attr_state_left(pars, conflict.left); + pars.esym(syms::right_name); pars.str(); + pars.esym(syms::right_file_id); pars.hex(); + read_attr_state_right(pars, conflict.right); + } + else if (tmp == "directory") + { + pars.esym(syms::attr_name); pars.str(tmp); + conflict.key = attr_key(tmp); + pars.esym(syms::ancestor_name); pars.str(); + pars.esym(syms::left_name); pars.str(tmp); + conflict.nid = left_roster.get_node(file_path_external(utf8(tmp)))->self; + read_attr_state_left(pars, conflict.left); + pars.esym(syms::right_name); pars.str(); + read_attr_state_right(pars, conflict.right); + } + else + I(false); + +} // read_attribute_conflict + +static void +read_attribute_conflicts(basic_io::parser & pars, + std::vector & conflicts, + roster_t const & left_roster, + roster_t const & right_roster) +{ + while (pars.tok.in.lookahead != EOF && pars.symp(syms::attribute)) + { + attribute_conflict conflict(the_null_node); + + pars.sym(); + + read_attribute_conflict(pars, conflict, left_roster, right_roster); + + conflicts.push_back(conflict); + + if (pars.tok.in.lookahead != EOF) + pars.esym (syms::conflict); + } +} // read_attribute_conflicts + +static void read_file_content_conflict(basic_io::parser & pars, file_content_conflict & conflict, roster_t const & left_roster, @@ -2088,11 +2231,11 @@ read_conflict_file_core(basic_io::parser // don't know how to resolve, so we can report them. read_missing_root_conflicts(pars, result.missing_root_conflict, left_roster, right_roster); read_invalid_name_conflicts(pars, result.invalid_name_conflicts, left_roster, right_roster); -// read_directory_loop_conflicts(pars, result.directory_loop_conflicts, left_roster, right_roster); + read_directory_loop_conflicts(pars, result.directory_loop_conflicts, left_roster, right_roster); read_orphaned_node_conflicts(pars, result.orphaned_node_conflicts, left_roster, right_roster); -// read_multiple_name_conflicts(pars, result.multiple_name_conflicts, left_roster, right_roster); + read_multiple_name_conflicts(pars, result.multiple_name_conflicts, left_roster, right_roster); read_duplicate_name_conflicts(pars, result.duplicate_name_conflicts, left_roster, right_roster); -// read_attribute_conflicts(pars, result.attribute_conflicts, left_roster, right_roster); + read_attribute_conflicts(pars, result.attribute_conflicts, left_roster, right_roster); read_file_content_conflicts(pars, result.file_content_conflicts, left_roster, right_roster); } @@ -2167,7 +2310,13 @@ roster_merge_result::write_conflict_file output.write(pr.buf.data(), pr.buf.size()); } + report_missing_root_conflicts(*left_roster, *right_roster, adaptor, true, output); + report_invalid_name_conflicts(*left_roster, *right_roster, adaptor, true, output); + report_directory_loop_conflicts(*left_roster, *right_roster, adaptor, true, output); + report_orphaned_node_conflicts(*left_roster, *right_roster, adaptor, true, output); + report_multiple_name_conflicts(*left_roster, *right_roster, adaptor, true, output); report_duplicate_name_conflicts(*left_roster, *right_roster, adaptor, true, output); + report_attribute_conflicts(*left_roster, *right_roster, adaptor, true, output); report_file_content_conflicts(lua, *left_roster, *right_roster, adaptor, true, output); data dat(output.str()); ============================================================ --- tests/resolve_conflicts_read_all/__driver__.lua 69803956634d281a23535588d085287b58753a4b +++ tests/resolve_conflicts_read_all/__driver__.lua 6650db7ab1605dba9e988ac97579537499dcb428 @@ -113,9 +113,7 @@ check_conflicts(branch) check_conflicts(branch) -commit(branch .. "-propagate") - -- orphaned add branch = "orphaned-add" @@ -198,7 +196,6 @@ check(mtn("mv", "xxx", "bar"), 0, false, commit(branch) check(mtn("mv", "xxx", "bar"), 0, false, false) ---addfile("bar", "duplicate add bar1") commit(branch) first = base_revision() @@ -206,34 +203,9 @@ addfile("bar", branch .. "-bar2") addfile("bar", branch .. "-bar2") -message = "conflict: duplicate name" +check_conflicts(branch) -check(mtn("update"), 1, false, true) -check(qgrep(message, "stderr")) -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message, "stderr")) - - -- duplicate name conflict (renames) branch = "duplicate-renames" @@ -253,34 +225,9 @@ check(mtn("mv", "bar", "abc"), 0, false, check(mtn("mv", "bar", "abc"), 0, false, false) -message = "conflict: duplicate name" +check_conflicts(branch) -check(mtn("update"), 1, false, true) -check(qgrep(message, "stderr")) -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message, "stderr")) - - -- duplicate name conflict (add-rename) branch = "duplicate-add-rename" @@ -299,35 +246,9 @@ addfile("bar", branch .. "-bar") addfile("bar", branch .. "-bar") -message = "conflict: duplicate name" +check_conflicts(branch) -check(mtn("update"), 1, false, true) -check(qgrep(message, "stderr")) -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message, "stderr")) - - - -- attribute conflict on attached node branch = "attribute-attached" @@ -349,35 +270,9 @@ check(mtn("attr", "drop", "foo", "attr2" check(mtn("attr", "set", "foo", "attr1", "valueZ"), 0, false, false) check(mtn("attr", "drop", "foo", "attr2"), 0, false, false) -message = "conflict: multiple values for attribute" +check_conflicts(branch) -check(mtn("update"), 1, false, true) -check(qgrep(message, "stderr")) -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message, "stderr")) - - - -- attribute conflict on detached node branch = "attribute-detached" @@ -401,35 +296,9 @@ check(mtn("mv", "foo", "baz"), 0, false, check(mtn("attr", "drop", "foo", "attr2"), 0, false, false) check(mtn("mv", "foo", "baz"), 0, false, false) -message = "conflict: multiple values for attribute" +check_conflicts(branch) -check(mtn("update"), 1, false, true) -check(qgrep(message, "stderr")) -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message, "stderr")) - - - -- content conflict on attached node branch = "content-attached" @@ -453,36 +322,9 @@ writefile("baz", branch .. "-baz\naaa\nb writefile("bar", branch .. "-bar\none\ntwo\nthree\nfour") writefile("baz", branch .. "-baz\naaa\nbbb\nCCC") -message = "conflict: content conflict on file 'foo'" +check_conflicts(branch) -check(mtn("update"), 1, false, true) -check(qgrep(message, "stderr")) -check(not qgrep("conflict: content conflict on file 'bar'", "stderr")) -check(not qgrep("conflict: content conflict on file 'baz'", "stderr")) -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message, "stderr")) - - -- content conflict on detached node branch = "content-detached" @@ -503,39 +345,9 @@ check(mtn("mv", "foo", "baz"), 0, false, writefile("foo", "foo second revision") check(mtn("mv", "foo", "baz"), 0, false, false) -message = "conflict: content conflict on file" +check_conflicts(branch) -check(mtn("update"), 1, false, true) -check(qgrep(message, "stderr")) -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message, "stderr")) - - - --- complex_structural_conflicts cases from roster_merge.cc unit tests - - - -- multiple name plus duplicate name branch = "multiple-name-plus-duplicate-name" @@ -558,46 +370,9 @@ addfile("aaa", branch .. "-aaa") check(mtn("mv", "foo", "bbb"), 0, false, false) addfile("aaa", branch .. "-aaa") -message1 = "conflict: multiple names" -message2 = "conflict: duplicate name" +check_conflicts(branch) --- this doesn't result in a duplicate name conflict because the multiple name --- conflict prevents foo from being attached in the result roster -check(mtn("update"), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - - - -- multiple name plus orphan branch = "multiple-name-plus-orphan" @@ -621,46 +396,9 @@ check(mtn("rm", "a"), 0, false, false) check(mtn("mv", "foo", "b"), 0, false, false) check(mtn("rm", "a"), 0, false, false) -message1 = "conflict: multiple names" -message2 = "conflict: orphaned" +check_conflicts(branch) --- this doesn't result in a directory loop conflict because the multiple name --- conflict prevents foo from being attached in the result roster -check(mtn("update"), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - - - -- multiple name plus directory loop branch = "multiple-name-plus-directory-loop" @@ -686,47 +424,9 @@ check(mtn("mv", "a", "b/foo"), 0, false, check(mtn("mv", "foo", "b"), 0, false, false) check(mtn("mv", "a", "b/foo"), 0, false, false) -message1 = "conflict: multiple names" -message2 = "conflict: directory loop" +check_conflicts(branch) --- this doesn't result in a directory loop conflict because the multiple name --- conflict prevents foo from being attached in the result roster -check(mtn("update"), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -commit(branch .. "-propagate") -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - -check(mtn("merge_into_workspace", first), 1, false, true) -check(qgrep(message1, "stderr")) -check(not qgrep(message2, "stderr")) - - - - -- duplicate name plus multiple name plus missing root -- the old root directory is pivoted out to aaa on one side and bbb on the other @@ -763,51 +463,9 @@ check(indir(dir2, mtn("pivot_root", "bar check(mtn("co", "--revision", base, "--branch", branch, dir2), 0, false, false) check(indir(dir2, mtn("pivot_root", "bar", "bbb")), 0, true, true) -message1 = "conflict: missing root directory" -message2 = "conflict: duplicate name" -message3 = "conflict: multiple names" +check_conflicts(branch) -check(indir(dir2, mtn("update")), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) -check(qgrep(message3, "stderr")) -check(indir(dir2, mtn("commit", "--message", "commit", "--branch", branch .. "-propagate")), 0, false, false) -second = indir(dir2, {base_revision})[1]() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) -check(qgrep(message3, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) -check(qgrep(message3, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) -check(qgrep(message3, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) -check(qgrep(message3, "stderr")) - -check(indir(dir2, mtn("pluck", "--revision", base, "--revision", first)), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) -check(qgrep(message3, "stderr")) - -check(indir(dir2, mtn("merge_into_workspace", first)), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) -check(qgrep(message3, "stderr")) - - - -- unrelated projects branch = "unrelated-projects" @@ -824,38 +482,6 @@ addfile("foo", branch .. "-foo second") addfile("foo", branch .. "-foo second") -message1 = "conflict: missing root directory" -message2 = "conflict: duplicate name" +check_conflicts(branch) --- check(mtn("update"), 1, false, true) --- check(qgrep(message1, "stderr")) --- check(qgrep(message2, "stderr")) - -check(mtn("commit", "--message", "commit", "--branch", branch .. "-propagate"), 0, false, false) - -second = base_revision() - -check(mtn("propagate", branch , branch .. "-propagate"), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) -check(mtn("cert", second, "branch", branch)) - -check(mtn("show_conflicts", first, second), 0, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) - -check(mtn("explicit_merge", first, second, branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) - -check(mtn("merge", "--branch", branch), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) - -check(mtn("pluck", "--revision", base, "--revision", first), 1, false, true) -check(qgrep(message1, "stderr")) -check(qgrep(message2, "stderr")) - --- check(mtn("merge_into_workspace", first), 1, false, true) --- check(qgrep(message1, "stderr")) --- check(qgrep(message2, "stderr")) +-- end of file