# # # add_dir "tests/resolve_conflicts_multiple_names" # # add_file "tests/resolve_conflicts_errors/merge-old-conflicts-file" # content [fc3566288419dc5ca7dcb86673a07bbc15bba5e1] # # add_file "tests/resolve_conflicts_multiple_names/__driver__.lua" # content [fbeef82db6e4c188e405f6624557a7979cc8304f] # # patch "cmd_conflicts.cc" # from [8cba28b58e4809f0315fade0a06cb9fa5da11ebd] # to [e024806a8cf16675a1dfa7c1dca4464c3e6d0054] # # patch "monotone.texi" # from [a430ff48f72f79fda5eb5aa03737850a1403f8ca] # to [875c9a83e7f0ea211fed6b0606df869f7b1ada20] # # patch "tests/automate_show_conflicts/__driver__.lua" # from [d5373d214d4fa6ce9e622aae99ff03f23e5e433b] # to [f835c5204474b98db1ef43aead8c9c0f97014575] # # patch "tests/resolve_conflicts_errors/__driver__.lua" # from [7b8eb3a9c7b7f5d2305558eaa9c745da0438d49c] # to [db22998c9bfcef5bf298a8a923f546077855c5a6] # ============================================================ --- tests/resolve_conflicts_errors/merge-old-conflicts-file fc3566288419dc5ca7dcb86673a07bbc15bba5e1 +++ tests/resolve_conflicts_errors/merge-old-conflicts-file fc3566288419dc5ca7dcb86673a07bbc15bba5e1 @@ -0,0 +1,6 @@ +mtn: 2 heads on branch 'testbranch' +mtn: merge 1 / 1: +mtn: calculating best pair of heads to merge next +mtn: [left] 52f8049a6454895521a6a5f7d739ebfd58e72655 +mtn: [right] 7d425fa3827653bfc4ea9b62560ef896bb3c83ca +mtn: misuse: right revision id does not match conflict file ============================================================ --- tests/resolve_conflicts_multiple_names/__driver__.lua fbeef82db6e4c188e405f6624557a7979cc8304f +++ tests/resolve_conflicts_multiple_names/__driver__.lua fbeef82db6e4c188e405f6624557a7979cc8304f @@ -0,0 +1,32 @@ +-- Test resolving multiple names conflicts +-- +-- this is currently not supported; we are documenting a test case +-- that must be considered when implementing it. + +mtn_setup() + +-- two conflicts on single node; what does 'conflicts resolve_first' do? + +addfile("foo", "foo base") +commit("testbranch", "base") +base = base_revision() + +writefile("foo", "foo left") +check(mtn("mv", "foo", "bar"), 0, false, false) + +commit("testbranch", "left 1") +left_1 = base_revision() + +revert_to(base) + +writefile("foo", "foo right") +check(mtn("mv", "foo", "baz"), 0, false, false) +commit("testbranch", "right 1") +right_1 = base_revision() + +check(mtn("conflicts", "store"), 0, nil, true) +canonicalize("stderr") +check("mtn: warning: 1 conflict with no supported resolutions.\n" == readfile("stderr")) + +-- mtn("conflicts", "show_first") +-- end of file ============================================================ --- cmd_conflicts.cc 8cba28b58e4809f0315fade0a06cb9fa5da11ebd +++ cmd_conflicts.cc e024806a8cf16675a1dfa7c1dca4464c3e6d0054 @@ -210,6 +210,7 @@ set_duplicate_name_conflict(resolve_conf static void set_duplicate_name_conflict(resolve_conflicts::file_resolution_t & resolution, + resolve_conflicts::file_resolution_t const & other_resolution, args_vector const & args) { if ("drop" == idx(args, 0)()) @@ -226,6 +227,9 @@ set_duplicate_name_conflict(resolve_conf else if ("user" == idx(args, 0)()) { N(args.size() == 2, F("wrong number of arguments")); + N(other_resolution.first != resolve_conflicts::content_user, + F("left and right resolutions cannot both be 'user'")); + resolution.first = resolve_conflicts::content_user; resolution.second = new_optimal_path(idx(args,1)(), false); } @@ -254,7 +258,7 @@ set_first_conflict(database & db, case left: if (conflict.left_resolution.first == resolve_conflicts::none) { - set_duplicate_name_conflict(conflict.left_resolution, args); + set_duplicate_name_conflict(conflict.left_resolution, conflict.right_resolution, args); return; } break; @@ -262,7 +266,7 @@ set_first_conflict(database & db, case right: if (conflict.right_resolution.first == resolve_conflicts::none) { - set_duplicate_name_conflict(conflict.right_resolution, args); + set_duplicate_name_conflict(conflict.right_resolution, conflict.left_resolution, args); return; } break; ============================================================ --- monotone.texi a430ff48f72f79fda5eb5aa03737850a1403f8ca +++ monotone.texi 875c9a83e7f0ea211fed6b0606df869f7b1ada20 @@ -4759,6 +4759,11 @@ @subsection Conflicts @end ftable +monotone internals note: we don't provide an @code{interactive} +resolution for two-file conflicts, because monotone currently does not +provide a @code{merge2} Lua hook. two-file conflicts don't have a +shared ancestor, so @code{merge3} is not applicable. + @page @node Workspace, Network, Tree, Command Reference @section Workspace ============================================================ --- tests/automate_show_conflicts/__driver__.lua d5373d214d4fa6ce9e622aae99ff03f23e5e433b +++ tests/automate_show_conflicts/__driver__.lua f835c5204474b98db1ef43aead8c9c0f97014575 @@ -353,7 +353,7 @@ check_asc() check_asc() --- content conflict on detached node +-- content conflict plus multiple names branch = "content-detached" setup(branch) ============================================================ --- tests/resolve_conflicts_errors/__driver__.lua 7b8eb3a9c7b7f5d2305558eaa9c745da0438d49c +++ tests/resolve_conflicts_errors/__driver__.lua db22998c9bfcef5bf298a8a923f546077855c5a6 @@ -2,22 +2,23 @@ mtn_setup() mtn_setup() +---------- -- Conflict that is not supported; attribute addfile("simple_file", "simple\none\ntwo\nthree\n") commit("testbranch", "base") base = base_revision() check(mtn("attr", "set", "simple_file", "foo", "1"), 0, nil, nil) -commit("testbranch", "left") -left = base_revision() +commit("testbranch", "left 1") +left_1 = base_revision() revert_to(base) check(mtn("attr", "set", "simple_file", "foo", "2"), 0, nil, nil) -commit("testbranch", "right") -right = base_revision() +commit("testbranch", "right 1") +right_1 = base_revision() -check(mtn("conflicts", "store", left, right), 0, nil, true) +check(mtn("conflicts", "store", left_1, right_1), 0, nil, true) canonicalize("stderr") check(samefilestd("conflicts-attr-store-1", "stderr")) @@ -29,11 +30,42 @@ check(samefilestd("conflicts-attr-show-2 canonicalize("stderr") check(samefilestd("conflicts-attr-show-2", "stderr")) +---------- -- specify conflicts file not in bookkeeping dir -check(mtn("conflicts", "--conflicts-file", "conflicts", "store", left, right), 1, nil, true) +check(mtn("conflicts", "--conflicts-file", "conflicts", "store", left_1, right_1), 1, nil, true) canonicalize("stderr") check(samefilestd("conflicts-attr-store-2", "stderr")) --- FIXME: use old conflicts file for new merge +---------- +-- use old conflicts file for new merge +-- get rid of attr conflict, add file content conflict +check(mtn("attr", "set", "simple_file", "foo", "1"), 0, nil, nil) +writefile("simple_file", "simple\ntwo\nthree\nfour\n") +commit("testbranch", "right 2") + +-- attempt merge with old conflict file +check(mtn("merge", "--resolve-conflicts"), 1, nil, true) +canonicalize("stderr") +check(samefilestd("merge-old-conflicts-file", "stderr")) + + +---------- +-- specify inconsistent left and right resolutions for duplicate_name + +addfile("checkout.sh", "checkout.sh right 1") +commit("testbranch", "right 3") + +revert_to(left_1) +addfile("checkout.sh", "checkout.sh left 1") +commit("testbranch", "left 2") + +check(mtn("conflicts", "store"), 0, true, nil) + +-- both sides specify user file +check(mtn("conflicts", "resolve_first_left", "user", "checkout.sh"), 0, nil, nil) +check(mtn("conflicts", "resolve_first_right", "user", "checkout.sh"), 1, nil, true) +canonicalize("stderr") +check("mtn: misuse: left and right resolutions cannot both be 'user'\n" == readfile("stderr")) + -- end of file