# # # patch "automate.cc" # from [ef2ff038b98144c19686fc37f49222a4c5e9152e] # to [030a79236cf0806d7487779badd6573eda088c94] # # patch "cmd_merging.cc" # from [fb2f2037a464226d7e99feb91ea119b6f90c76b2] # to [9816ce8c4366109fa56ecc47ebfa6fb9c661524b] # # patch "merge.cc" # from [3085e923fba02976219da4889f0a71892a91ca74] # to [a9e8c3a5f704d0fc64e8c28e23c4a3ea376cb322] # # patch "merge.hh" # from [f3613e195ad378f7666d003b959b322abbce97d0] # to [f2aebbc268773f136c78e287ce22207d5fd0bc64] # # patch "roster_merge.cc" # from [13c48d6355d0a7521acaeb841383395a3740119a] # to [0e3b1be78c8073f29014b3533914adbdaed510b1] # # patch "roster_merge.hh" # from [528467e96d5195c9639b3c3b48799391c3fb2d7f] # to [61dc2b4c870575223b62bca5b1edc56bf4589485] # # patch "tests/automate_show_conflicts/__driver__.lua" # from [1702dae2d13bb2b959fb7c1a9b9b669ae0d70c05] # to [55184339895e15080a5885a6ff5536a36acbb310] # # patch "tests/automate_show_conflicts/expected-1.stdout" # from [f1d2d2f924e986ac86fdf7b36c94bcdf32beec15] # to [5bf00ceb1106c1eb98191f6fc864f8d88dba1ad4] # # patch "tests/automate_show_conflicts/expected-2.stdout" # from [e242ed3bffccdf271b7fbaf34ed72d089537b42f] # to [ccf1e1d8a563efc9937d481ab95deb8c31df65c2] # ============================================================ --- automate.cc ef2ff038b98144c19686fc37f49222a4c5e9152e +++ automate.cc 030a79236cf0806d7487779badd6573eda088c94 @@ -2286,7 +2286,7 @@ CMD_AUTOMATE(show_conflicts, N_("[REVID, N(heads.size() == 2, F("branch '%s' has %d heads; must be exactly 2 for show_conflicts") % app.opts.branchname % heads.size()); l_id = *heads.begin(); - r_id = *heads.end(); + r_id = *heads.rbegin(); } else if (args.size() == 2) { ============================================================ --- cmd_merging.cc fb2f2037a464226d7e99feb91ea119b6f90c76b2 +++ cmd_merging.cc 9816ce8c4366109fa56ecc47ebfa6fb9c661524b @@ -282,7 +282,7 @@ CMD(update, "update", "", CMD_REF(worksp content_merge_workspace_adaptor wca(db, old_rid, old_roster, left_markings, right_markings, paths); wca.cache_roster(working_rid, working_roster); - resolve_merge_conflicts(app.lua, *working_roster, chosen_roster, + resolve_merge_conflicts(app.lua, db, *working_roster, chosen_roster, result, wca); // Make sure it worked... @@ -631,7 +631,7 @@ CMD(merge_into_dir, "merge_into_dir", "" content_merge_database_adaptor dba(db, left_rid, right_rid, left_marking_map, right_marking_map); - resolve_merge_conflicts(app.lua, left_roster, right_roster, + resolve_merge_conflicts(app.lua, db, left_roster, right_roster, result, dba); { @@ -743,7 +743,7 @@ CMD(merge_into_workspace, "merge_into_wo content_merge_workspace_adaptor wca(db, lca_id, lca.first, *left.second, *right.second, paths); wca.cache_roster(working_rid, working_roster); - resolve_merge_conflicts(app.lua, *left.first, *right.first, merge_result, wca); + resolve_merge_conflicts(app.lua, db, *left.first, *right.first, merge_result, wca); // Make sure it worked... I(merge_result.is_clean()); @@ -888,7 +888,7 @@ show_conflicts_core (database & db, revi result.report_orphaned_node_conflicts(l_roster, r_roster, adaptor, basic_io, output); result.report_multiple_name_conflicts(l_roster, r_roster, adaptor, basic_io, output); - result.report_duplicate_name_conflicts(l_roster, r_roster, adaptor, basic_io, output); + result.report_duplicate_name_conflicts(db, l_roster, r_roster, adaptor, basic_io, output); result.report_attribute_conflicts(l_roster, r_roster, adaptor, basic_io, output); result.report_file_content_conflicts(l_roster, r_roster, adaptor, basic_io, output); @@ -1035,7 +1035,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac // to_roster is not fetched from the db which does not have temporary nids wca.cache_roster(to_rid, to_roster); - resolve_merge_conflicts(app.lua, *working_roster, *to_roster, + resolve_merge_conflicts(app.lua, db, *working_roster, *to_roster, result, wca); I(result.is_clean()); ============================================================ --- merge.cc 3085e923fba02976219da4889f0a71892a91ca74 +++ merge.cc a9e8c3a5f704d0fc64e8c28e23c4a3ea376cb322 @@ -126,7 +126,7 @@ void } void -resolve_merge_conflicts(lua_hooks & lua, +resolve_merge_conflicts(lua_hooks & lua, database & db, roster_t const & left_roster, roster_t const & right_roster, roster_merge_result & result, @@ -149,7 +149,7 @@ resolve_merge_conflicts(lua_hooks & lua, result.report_orphaned_node_conflicts(left_roster, right_roster, adaptor, false, std::cout); result.report_multiple_name_conflicts(left_roster, right_roster, adaptor, false, std::cout); - result.report_duplicate_name_conflicts(left_roster, right_roster, adaptor, false, std::cout); + result.report_duplicate_name_conflicts(db, left_roster, right_roster, adaptor, false, std::cout); result.report_attribute_conflicts(left_roster, right_roster, adaptor, false, std::cout); result.report_file_content_conflicts(left_roster, right_roster, adaptor, false, std::cout); @@ -202,7 +202,7 @@ interactive_merge_and_store(lua_hooks & content_merge_database_adaptor dba(db, left_rid, right_rid, left_marking_map, right_marking_map); - resolve_merge_conflicts(lua, left_roster, right_roster, + resolve_merge_conflicts(lua, db, left_roster, right_roster, result, dba); // write new files into the db ============================================================ --- merge.hh f3613e195ad378f7666d003b959b322abbce97d0 +++ merge.hh f2aebbc268773f136c78e287ce22207d5fd0bc64 @@ -25,7 +25,7 @@ void struct content_merge_adaptor; void -resolve_merge_conflicts(lua_hooks & lua, +resolve_merge_conflicts(lua_hooks & lua, database & db, roster_t const & left_roster, roster_t const & right_roster, roster_merge_result & result, ============================================================ --- roster_merge.cc 13c48d6355d0a7521acaeb841383395a3740119a +++ roster_merge.cc 0e3b1be78c8073f29014b3533914adbdaed510b1 @@ -527,10 +527,11 @@ void } void -roster_merge_result::report_duplicate_name_conflicts(roster_t const & left_roster, +roster_merge_result::report_duplicate_name_conflicts(database & db, + roster_t const & left_roster, roster_t const & right_roster, content_merge_adaptor & adaptor, - bool basic_io, + bool const basic_io, std::ostream & output) const { MM(left_roster); @@ -543,9 +544,6 @@ roster_merge_result::report_duplicate_na node_id left_nid, right_nid; - basic_io::stanza st; - basic_io::printer pr; - left_nid = conflict.left_nid; right_nid = conflict.right_nid; @@ -565,12 +563,12 @@ roster_merge_result::report_duplicate_na adaptor.get_ancestral_roster(left_nid, left_lca_rid, left_lca_roster); adaptor.get_ancestral_roster(right_nid, right_lca_rid, right_lca_roster); + basic_io::stanza st; + if (basic_io) { - st.push_str_pair(syms::conflict, "duplicate_name"); + st.push_str_pair(syms::conflict, "duplicate name"); st.push_str_pair(syms::name, left_name.as_external()); - st.push_hex_pair(syms::left_id, left_lca_rid.inner()); // FIXME: get file revision, not ancestor revision? - st.push_hex_pair(syms::right_id, right_lca_rid.inner()); } else { @@ -584,7 +582,12 @@ roster_merge_result::report_duplicate_na { if (left_type == file_type) if (basic_io) - st.push_str_pair(syms::left_type, "added file"); + { + file_id fid; + db.get_file_content (left_lca_rid, left_nid, fid); + st.push_str_pair(syms::left_type, "added file"); + st.push_hex_pair(syms::left_id, fid.inner()); + } else P(F("added as a new file on the left")); else @@ -595,7 +598,12 @@ roster_merge_result::report_duplicate_na if (right_type == file_type) if (basic_io) - st.push_str_pair(syms::right_type, "added file"); + { + file_id fid; + db.get_file_content (right_lca_rid, right_nid, fid); + st.push_str_pair(syms::right_type, "added file"); + st.push_hex_pair(syms::right_id, fid.inner()); + } else P(F("added as a new file on the right")); else @@ -717,7 +725,15 @@ roster_merge_result::report_duplicate_na I(false); if (basic_io) - output.write(pr.buf.data(), pr.buf.size()); + { + // We have to declare the printer here, rather than more globally, + // because adaptor.get_ancestral_roster uses a basic_io::printer + // internally, and there can only be one active at a time. + basic_io::printer pr; + output << "\n"; + pr.print_stanza(st); + output.write(pr.buf.data(), pr.buf.size()); + } } } ============================================================ --- roster_merge.hh 528467e96d5195c9639b3c3b48799391c3fb2d7f +++ roster_merge.hh 61dc2b4c870575223b62bca5b1edc56bf4589485 @@ -11,6 +11,7 @@ // PURPOSE. #include "rev_types.hh" +#include "database.hh" #include "diff_patch.hh" #include "roster.hh" // needs full definition of roster_t available @@ -179,10 +180,11 @@ struct roster_merge_result content_merge_adaptor & adaptor, bool basic_io, std::ostream & output) const; - void report_duplicate_name_conflicts(roster_t const & left, + void report_duplicate_name_conflicts(database & db, + roster_t const & left, roster_t const & right, content_merge_adaptor & adaptor, - bool basic_io, + bool const basic_io, std::ostream & output) const; void report_attribute_conflicts(roster_t const & left, ============================================================ --- tests/automate_show_conflicts/__driver__.lua 1702dae2d13bb2b959fb7c1a9b9b669ae0d70c05 +++ tests/automate_show_conflicts/__driver__.lua 55184339895e15080a5885a6ff5536a36acbb310 @@ -31,7 +31,7 @@ check(readfile("expected-1.stdout") == r -- Now specify revisions, in an order that reverses left/right from -- the previous, to show the arguments are used. -check(mtn("automate", "show_conflicts", abe_1, beth_1), 0, true, false) +check(mtn("automate", "show_conflicts", beth_1, abe_1), 0, true, false) canonicalize("stdout") check(readfile("expected-2.stdout") == readfile("stdout")) ============================================================ --- tests/automate_show_conflicts/expected-1.stdout f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 +++ tests/automate_show_conflicts/expected-1.stdout 5bf00ceb1106c1eb98191f6fc864f8d88dba1ad4 @@ -1 +1,16 @@ -foo + left [1337cb1059c4bc3e376b14381b43e9383c654da1] +right [d5f1dd136c86b5bbd5e71b0c3365667e328af492] + + conflict "duplicate name" + name "checkout.sh" + left_type "added file" + left_id [61b8d4fb0e5d78be111f691b955d523c782fa92e] +right_type "added file" + right_id [dd6805ae36432d6edcbdff6ea578ea981ffa2144] + + conflict "duplicate name" + name "thermostat.c" + left_type "added file" + left_id [4cdcec6fa2f9d5c075d5b80d03c708c8e4801196] +right_type "added file" + right_id [7e9f2712c5d3570815f1546772d9119474d32afc] ============================================================ --- tests/automate_show_conflicts/expected-2.stdout e242ed3bffccdf271b7fbaf34ed72d089537b42f +++ tests/automate_show_conflicts/expected-2.stdout ccf1e1d8a563efc9937d481ab95deb8c31df65c2 @@ -1 +1,16 @@ -bar + left [d5f1dd136c86b5bbd5e71b0c3365667e328af492] +right [1337cb1059c4bc3e376b14381b43e9383c654da1] + + conflict "duplicate name" + name "checkout.sh" + left_type "added file" + left_id [dd6805ae36432d6edcbdff6ea578ea981ffa2144] +right_type "added file" + right_id [61b8d4fb0e5d78be111f691b955d523c782fa92e] + + conflict "duplicate name" + name "thermostat.c" + left_type "added file" + left_id [7e9f2712c5d3570815f1546772d9119474d32afc] +right_type "added file" + right_id [4cdcec6fa2f9d5c075d5b80d03c708c8e4801196]