monotone-commits-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Monotone-commits-diffs] net.venge.monotone.issue-209: 544ac7c8203751d61


From: code
Subject: [Monotone-commits-diffs] net.venge.monotone.issue-209: 544ac7c8203751d61f6ccc016d6b0a28cb1e7596
Date: Sun, 3 Jun 2012 17:47:16 +0200 (CEST)

revision:            544ac7c8203751d61f6ccc016d6b0a28cb1e7596
date:                2012-06-01T08:58:00
author:              address@hidden
branch:              net.venge.monotone.issue-209
changelog:
resolve_dropped_modified; progress, still fails tests

* src/merge_content.hh:
* src/merge_content.cc:
* src/cmd_merging.cc: add nis to resolve_merge_conflicts

* src/merge_conflict.cc (resolve_dropped_modified_conflicts): change keep, user 
to drop/add new

* src/merge_roster.hh: add nis to resolve_dropped_modified_conflicts

* test/func/resolve_conflicts_dropped_modified/__driver__.lua: improve test





manifest:
format_version "1"

new_manifest [0230d1fa921775b0d9d1e21032cf31edf562669f]

old_revision [be008714e09af86a72e27ae7044cb85b9e689909]

patch "src/cmd_merging.cc"
 from [7050a2b91ad9a15d6b8066c2b5e54bb96c87265c]
   to [149b3d0a65bd2822f88e9838815aea01d827fc67]

patch "src/merge_conflict.cc"
 from [15f8399fb683061a7f301d74f34d93af9d75dc98]
   to [6f0a13f140b97c5b8d2f4edfd327882d6006afe8]

patch "src/merge_content.cc"
 from [f3b9e82e6c46b53d17147068607cec03d581957b]
   to [3f38508142269cd629be6760713f636ed75bbbfd]

patch "src/merge_content.hh"
 from [c74c14bb8031b9bf67f684d9ddfdf6624f424f01]
   to [c8fec9bc061a8a7ad9729ece909fde64e31b55ae]

patch "src/merge_roster.hh"
 from [0756147ceb36ee1af0d2eb02371587b3c8a8ffe6]
   to [90740a700bceeecc6f662663246ddbe655f2edcb]

patch "test/func/resolve_conflicts_dropped_modified/__driver__.lua"
 from [939ea819f903966c0d0cf89ceb8375d5f2c40e6c]
   to [a77c8e0b701e417014bf7958f8f2e8ed922586c6]
============================================================
--- src/cmd_merging.cc	7050a2b91ad9a15d6b8066c2b5e54bb96c87265c
+++ src/cmd_merging.cc	149b3d0a65bd2822f88e9838815aea01d827fc67
@@ -329,7 +329,7 @@ update(app_state & app,
                                       left_markings, right_markings, paths);
   wca.cache_roster(working_rid, working_roster);
   resolve_merge_conflicts(app.lua, app.opts, *working_roster, chosen_roster,
-                          result, wca, false);
+                          result, wca, nis, false);
 
   // Make sure it worked...
   I(result.is_clean());
@@ -719,6 +719,7 @@ void perform_merge_into_dir(app_state & 
                      right_uncommon_ancestors,
                      result);
 
+        temp_node_id_source nis;
         content_merge_database_adaptor
           dba(db, left_rid, right_rid, left_marking_map, right_marking_map);
 
@@ -728,7 +729,7 @@ void perform_merge_into_dir(app_state & 
           (app.opts, left_rid, left_roster, right_rid, right_roster, result, resolutions_given);
 
         resolve_merge_conflicts(app.lua, app.opts, left_roster, right_roster,
-                                result, dba, resolutions_given);
+                                result, dba, nis, resolutions_given);
 
         {
           dir_t moved_root = left_roster.root();
@@ -872,10 +873,11 @@ CMD(merge_into_workspace, "merge_into_wo
   map<file_id, file_path> paths;
   get_content_paths(*working_roster, paths);
 
+  temp_node_id_source nis;
   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, app.opts, *left.first, *right.first, merge_result, wca, false);
+  resolve_merge_conflicts(app.lua, app.opts, *left.first, *right.first, merge_result, wca, nis, false);
 
   // Make sure it worked...
   I(merge_result.is_clean());
@@ -1405,7 +1407,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac
   wca.cache_roster(to_rid, to_roster);
 
   resolve_merge_conflicts(app.lua, app.opts, *working_roster, *to_roster,
-                          result, wca, false);
+                          result, wca, nis, false);
 
   I(result.is_clean());
   // temporary node ids may appear
============================================================
--- src/merge_conflict.cc	15f8399fb683061a7f301d74f34d93af9d75dc98
+++ src/merge_conflict.cc	6f0a13f140b97c5b8d2f4edfd327882d6006afe8
@@ -2590,7 +2590,8 @@ roster_merge_result::resolve_dropped_mod
 roster_merge_result::resolve_dropped_modified_conflicts(lua_hooks & lua,
                                                         roster_t const & left_roster,
                                                         roster_t const & right_roster,
-                                                        content_merge_adaptor & adaptor)
+                                                        content_merge_adaptor & adaptor,
+                                                        temp_node_id_source & nis)
 {
   MM(left_roster);
   MM(right_roster);
@@ -2632,21 +2633,20 @@ roster_merge_result::resolve_dropped_mod
             modified_name % conflict.resolution.second->as_external());
 
           {
-            file_data modified_data, result_data;
+            // See comments in keep below on why we drop first
+            roster.drop_detached_node(nid);
+
+            file_data result_data;
             data result_raw_data;
             file_id result_fid;
-            adaptor.get_version(modified_fid, modified_data);
-
             read_data(*conflict.resolution.second, result_raw_data);
 
             result_data = file_data(result_raw_data);
             calculate_ident(result_data, result_fid);
 
-            file_t result_node = downcast_to_file_t(roster.get_node_for_update(nid));
-            result_node->content = result_fid;
+            // FIXME: need to record file in db
+            nid = roster.create_file_node(result_fid, nis);
 
-            adaptor.record_file(modified_fid, result_fid, modified_data, result_data);
-
             attach_node(lua, roster, nid, modified_name);
           }
           break;
@@ -2659,6 +2659,17 @@ roster_merge_result::resolve_dropped_mod
 
         case resolve_conflicts::keep:
           P(F("keeping '%s'") % modified_name);
+
+          // We'd like to just attach_node here, but that violates a
+          // fundamental design principle of mtn; nodes are born once, and
+          // die once. If we attach here, the node is born, died, and then
+          // born again.
+          //
+          // So we have to drop the old node, and create a new node with the
+          // same contents. That loses history; 'mtn log <path>' will end
+          // here, not showing the history of the original node.
+          roster.drop_detached_node(nid);
+          nid = roster.create_file_node(modified_fid, nis);
           attach_node (lua, roster, nid, modified_name);
           break;
 
============================================================
--- src/merge_content.cc	f3b9e82e6c46b53d17147068607cec03d581957b
+++ src/merge_content.cc	3f38508142269cd629be6760713f636ed75bbbfd
@@ -644,6 +644,7 @@ resolve_merge_conflicts(lua_hooks & lua,
                         roster_t const & right_roster,
                         roster_merge_result & result,
                         content_merge_adaptor & adaptor,
+                        temp_node_id_source & nis,
                         const bool resolutions_given)
 {
   if (!result.is_clean())
@@ -669,7 +670,7 @@ resolve_merge_conflicts(lua_hooks & lua,
 
           // resolve the ones we can, if they have resolutions specified
           result.resolve_orphaned_node_conflicts(lua, left_roster, right_roster, adaptor);
-          result.resolve_dropped_modified_conflicts(lua, left_roster, right_roster, adaptor);
+          result.resolve_dropped_modified_conflicts(lua, left_roster, right_roster, adaptor, nis);
           result.resolve_duplicate_name_conflicts(lua, left_roster, right_roster, adaptor);
           result.resolve_file_content_conflicts(lua, left_roster, right_roster, adaptor);
         }
@@ -755,12 +756,13 @@ interactive_merge_and_store(lua_hooks & 
                result);
 
   bool resolutions_given;
+  temp_node_id_source nis;
   content_merge_database_adaptor dba(db, left_rid, right_rid,
                                      left_marking_map, right_marking_map);
 
   parse_resolve_conflicts_opts (opts, left_rid, left_roster, right_rid, right_roster, result, resolutions_given);
 
-  resolve_merge_conflicts(lua, opts, left_roster, right_roster, result, dba, resolutions_given);
+  resolve_merge_conflicts(lua, opts, left_roster, right_roster, result, dba, nis, resolutions_given);
 
   // write new files into the db
   store_roster_merge_result(db,
@@ -779,7 +781,7 @@ store_roster_merge_result(database & db,
 {
   I(result.is_clean());
   roster_t & merged_roster = result.roster;
-  merged_roster.check_sane();
+  merged_roster.check_sane(true); // resolve conflicts can create new nodes
 
   revision_t merged_rev;
   merged_rev.made_for = made_for_database;
============================================================
--- src/merge_content.hh	c74c14bb8031b9bf67f684d9ddfdf6624f424f01
+++ src/merge_content.hh	c8fec9bc061a8a7ad9729ece909fde64e31b55ae
@@ -1,5 +1,5 @@
 // Copyright (C) 2005 Nathaniel Smith <address@hidden>
-//               2008, 2010 Stephen Leake <address@hidden>
+//               2008, 2010, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -12,6 +12,7 @@
 #define __MERGE_HH__
 
 #include "vocab.hh"
+#include "roster.hh"
 #include "rev_types.hh"
 #include "paths.hh"
 
@@ -259,6 +260,7 @@ resolve_merge_conflicts(lua_hooks & lua,
                         roster_t const & right_roster,
                         roster_merge_result & result,
                         content_merge_adaptor & adaptor,
+                        temp_node_id_source & nis,
                         bool const resolutions_given);
 
 // traditional resolve-all-conflicts-as-you-go style merging with 3-way merge
============================================================
--- src/merge_roster.hh	0756147ceb36ee1af0d2eb02371587b3c8a8ffe6
+++ src/merge_roster.hh	90740a700bceeecc6f662663246ddbe655f2edcb
@@ -247,7 +247,8 @@ struct roster_merge_result
   void resolve_dropped_modified_conflicts(lua_hooks & lua,
                                           roster_t const & left_roster,
                                           roster_t const & right_roster,
-                                          content_merge_adaptor & adaptor);
+                                          content_merge_adaptor & adaptor,
+                                          temp_node_id_source & nis);
 
   void report_duplicate_name_conflicts(roster_t const & left,
                                        roster_t const & right,
============================================================
--- test/func/resolve_conflicts_dropped_modified/__driver__.lua	939ea819f903966c0d0cf89ceb8375d5f2c40e6c
+++ test/func/resolve_conflicts_dropped_modified/__driver__.lua	a77c8e0b701e417014bf7958f8f2e8ed922586c6
@@ -152,8 +152,9 @@ check(qgrep("keeping 'file_5'", "stderr"
 check(qgrep("dropping 'file_3_renamed'", "stderr"))
 check(qgrep("keeping 'file_4'", "stderr"))
 check(qgrep("keeping 'file_5'", "stderr"))
-check(qgrep("replacing 'file_6_renamed' with '_MTN/resolutions/file_6_resolved", "stderr"))
-check(qgrep("replacing 'file_7_renamed' with '_MTN/resolutions/file_7_resolved", "stderr"))
+check(qgrep("replacing content of 'file_6_renamed' with '_MTN/resolutions/file_6_resolved", "stderr"))
+check(qgrep("replacing content of 'file_7_renamed' with '_MTN/resolutions/file_7_resolved", "stderr"))
+check(not qgrep("warning", "stderr"))
 
 -- FIXME: add dropped_modified to 'show_conflicts' test (etc?)
 -- better to put those tests here

reply via email to

[Prev in Thread] Current Thread [Next in Thread]