# # # patch "cmd_merging.cc" # from [edae4eaccdef47b8fc497327603d16254de8b423] # to [97b6b695edfc97d361f655be497353a716976f54] # # patch "merge_content.cc" # from [812920a264c04fa3d937910649cd4f488dca0ea2] # to [7b3d119b5dbc73304ab5b11fba31fc78c10b82d8] # # patch "merge_content.hh" # from [f686979a4a2f6af3912880b91d8c9fea3be2db06] # to [c74c14bb8031b9bf67f684d9ddfdf6624f424f01] # # patch "monotone.texi" # from [5b13393d7df65767bc1666100553f291ac04938b] # to [98313b504e2b1493a5f80f35e157b94dbfd29018] # # patch "tests/automate_update/__driver__.lua" # from [33ba9867907d8e690b89632ee71ba05c96dc439d] # to [3d8cadaf6c9fcd9ca4bdfb69e51647985d89164a] # ============================================================ --- cmd_merging.cc edae4eaccdef47b8fc497327603d16254de8b423 +++ cmd_merging.cc 97b6b695edfc97d361f655be497353a716976f54 @@ -310,7 +310,7 @@ update(app_state & app, 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, app.opts, *working_roster, chosen_roster, result, wca, false); // Make sure it worked... @@ -721,7 +721,7 @@ CMD(merge_into_dir, "merge_into_dir", "" parse_resolve_conflicts_opts (app.opts, left_rid, left_roster, right_rid, right_roster, result, resolutions_given); - resolve_merge_conflicts(app.lua, left_roster, right_roster, + resolve_merge_conflicts(app.lua, app.opts, left_roster, right_roster, result, dba, resolutions_given); { @@ -843,7 +843,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, false); + resolve_merge_conflicts(app.lua, app.opts, *left.first, *right.first, merge_result, wca, false); // Make sure it worked... I(merge_result.is_clean()); @@ -1347,7 +1347,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, app.opts, *working_roster, *to_roster, result, wca, false); I(result.is_clean()); ============================================================ --- merge_content.cc 812920a264c04fa3d937910649cd4f488dca0ea2 +++ merge_content.cc 7b3d119b5dbc73304ab5b11fba31fc78c10b82d8 @@ -1,5 +1,5 @@ // Copyright (C) 2008 Nathaniel Smith -// 2008, 2009 Stephen Leake +// 2008, 2010 Stephen Leake // // This program is made available under the GNU GPL version 2.0 or // greater. See the accompanying file COPYING for details. @@ -636,6 +636,7 @@ resolve_merge_conflicts(lua_hooks & lua, void resolve_merge_conflicts(lua_hooks & lua, + options const & opts, roster_t const & left_roster, roster_t const & right_roster, roster_merge_result & result, @@ -699,6 +700,21 @@ resolve_merge_conflicts(lua_hooks & lua, P(FP("%d content conflict requires user intervention", "%d content conflicts require user intervention", remaining) % remaining); + + // We don't spawn the merger here, because some mergers + // (such as opendiff) require prompting the user via + // stdin/stdout, and that's what 'non_interactive' prevents. + // Note that 'automate stdio' sets non_interactive true, + // because it doesn't support prompting. + // + // Another option would be to pass the option to the merger, + // and let it decide. We are not doing that, because it is + // felt this whole design is already too complicated; we are + // working to find a better solution. See thread at + // http://lists.gnu.org/archive/html/monotone-devel/2010-04/msg00000.html + E(!opts.non_interactive, origin::user, + F("can't spawn external merger when non-interactive")); + result.report_file_content_conflicts(lua, left_roster, right_roster, adaptor, false, std::cout); try_to_merge_files(lua, left_roster, right_roster, @@ -739,7 +755,7 @@ interactive_merge_and_store(lua_hooks & parse_resolve_conflicts_opts (opts, left_rid, left_roster, right_rid, right_roster, result, resolutions_given); - resolve_merge_conflicts(lua, left_roster, right_roster, result, dba, resolutions_given); + resolve_merge_conflicts(lua, opts, left_roster, right_roster, result, dba, resolutions_given); // write new files into the db store_roster_merge_result(db, ============================================================ --- merge_content.hh f686979a4a2f6af3912880b91d8c9fea3be2db06 +++ merge_content.hh c74c14bb8031b9bf67f684d9ddfdf6624f424f01 @@ -1,5 +1,5 @@ // Copyright (C) 2005 Nathaniel Smith -// 2008 Stephen Leake +// 2008, 2010 Stephen Leake // // This program is made available under the GNU GPL version 2.0 or // greater. See the accompanying file COPYING for details. @@ -254,6 +254,7 @@ resolve_merge_conflicts(lua_hooks & lua, void resolve_merge_conflicts(lua_hooks & lua, + options const & opts, roster_t const & left_roster, roster_t const & right_roster, roster_merge_result & result, ============================================================ --- monotone.texi 5b13393d7df65767bc1666100553f291ac04938b +++ monotone.texi 98313b504e2b1493a5f80f35e157b94dbfd29018 @@ -11306,8 +11306,9 @@ @section Additional Lua Functions workspace (does not contain @file{_MTN}). After calling change_workspace, the next operation should read the -workspace options. That means it should be a top level command like -'update', called via @command{mtn_automate}. +workspace options. @command{mtn_automate} does this; other Lua +extensions do not. In addition, @command{automate stio} reads the +workspace options before executing each command. @item existonpath(@var{possible_command}) @@ -11350,8 +11351,9 @@ @section Additional Lua Functions @item includedir(@var{scriptpath}) This function loads and executes in alphabetical order all the scripts -contained into the directory scriptpath. -If one of the scripts has an error, the functions doesn't process the +contained in the directory scriptpath. + +If one of the scripts has an error, the function doesn't process the remaining scripts and immediately returns false. @item includedirpattern(@var{scriptpath}, @var{pattern}) ============================================================ --- tests/automate_update/__driver__.lua 33ba9867907d8e690b89632ee71ba05c96dc439d +++ tests/automate_update/__driver__.lua 3d8cadaf6c9fcd9ca4bdfb69e51647985d89164a @@ -35,6 +35,13 @@ check(string.find(progress[#progress], " progress = run_stdio("l6:updatee", 0, 0, 'p') check(string.find(progress[#progress], "updated to base revision") ~= nil) +revert_to(rev1) +-- don't run external merger via automate stdio, since if it's opendiff it needs to prompt +-- automate stdio sets --non-interactive +writefile("patched", "a conflicting change") +progress = run_stdio("l6:updatee", 2, 0, 'e') +check(progress[#progress] == "misuse: can't spawn external merger when non-interactive") + -- Command error cases -- no arguments allowed