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: 48b14e6f132ad73fc


From: code
Subject: [Monotone-commits-diffs] net.venge.monotone.issue-209: 48b14e6f132ad73fc3ed421bbf318c4ce6ec5b4e
Date: Mon, 23 Jul 2012 11:01:10 +0200 (CEST)

revision:            48b14e6f132ad73fc3ed421bbf318c4ce6ec5b4e
date:                2012-07-17T23:49:02
author:              address@hidden
branch:              net.venge.monotone.issue-209
changelog:
resolve_conflicts_dropped_modified_upstream_vs_local_2 : more passing

* src/cmd_conflicts.cc (show_resolution): new
  (show_conflicts): improve dropped_modified
  (set_first_conflict): more error detection in dropped_modified

* src/merge_conflict.cc (report_dropped_modified_conflicts): fix

* src/merge_roster.cc (resolve_conflicts): move image functions into namespace
  (roster_merge): fix bug

* src/merge_roster.hh (dropped_modified_conflict): fix bug

* 
test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/__driver__.lua 
: improve; more passing

* 
test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_3_2_resolved:
 add right resolution

manifest:
format_version "1"

new_manifest [2022be19738bb8445b0f4ab97a7d47d9569ccabb]

old_revision [d4a22d4d54c5ab65e491cd43f0f12a3b96b45c78]

patch "src/cmd_conflicts.cc"
 from [c4c2c75feb32cce46f146e05aba424c038152ded]
   to [21bfaa34a4c999f8214b8a2619cbbf82986f9158]

patch "src/merge_conflict.cc"
 from [d653ef4d1d748fa833b2500eed77ecc0107d48fb]
   to [ed311d6cdf1fa47f00a602e0db5b57f84be6a690]

patch "src/merge_roster.cc"
 from [b4de8ec7db2c60b3ebb777bfa58d9e0d8986558d]
   to [5d36f441612f9de68ce237b13226bdffd1e2c92a]

patch "src/merge_roster.hh"
 from [63eab7b216f8839626f9d9d04dc8e58c3eed90bf]
   to [b013f590a5c9e643afa06d41d3ed362f6c27d0e6]

patch 
"test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/__driver__.lua"
 from [46e918155fe50737229d3c2cb31899cf204ef9fd]
   to [897b4a52ad2ebdb38453f98db1b4284da562a03c]

patch 
"test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_3_2_resolved"
 from [954b8dfc7ee161c1ca809b61d03ad8fd12bfb539]
   to [4482ad2e755308ce8a546191348cc648ad13d782]
============================================================
--- src/cmd_conflicts.cc	c4c2c75feb32cce46f146e05aba424c038152ded
+++ src/cmd_conflicts.cc	21bfaa34a4c999f8214b8a2619cbbf82986f9158
@@ -50,6 +50,16 @@ static void
 typedef enum {first, remaining} show_conflicts_case_t;
 
 static void
+show_resolution(resolve_conflicts::file_resolution_t resolution, char const * const prefix)
+{
+
+  if (resolution.resolution != resolve_conflicts::none)
+    {
+      P(F(string(prefix).append(image(resolution)).c_str()));
+    }
+}
+
+static void
 show_conflicts(database & db, conflicts_t conflicts, show_conflicts_case_t show_case)
 {
   // Go thru the conflicts we know how to resolve in the same order
@@ -90,8 +100,8 @@ show_conflicts(database & db, conflicts_
     {
       dropped_modified_conflict & conflict = *i;
 
-      if (conflict.left_resolution.resolution == resolve_conflicts::none ||
-          conflict.right_resolution.resolution == resolve_conflicts::none)
+      if ((conflict.left_nid != the_null_node && conflict.left_resolution.resolution == resolve_conflicts::none) ||
+          (conflict.right_nid != the_null_node && conflict.right_resolution.resolution == resolve_conflicts::none))
         {
           file_path modified_name;
 
@@ -149,13 +159,15 @@ show_conflicts(database & db, conflicts_
                 }
             }
 
-          if (show_case == remaining) return;
+          show_resolution(conflict.left_resolution, "left_");
+          show_resolution(conflict.right_resolution, "right_");
 
-          P(F("possible resolutions:"));
+          if (show_case == remaining) return;
 
           if (conflict.left_nid == the_null_node || conflict.right_nid == the_null_node)
             {
               // only one file involved; only need one resolution
+              P(F("possible resolutions:"));
               P(F("resolve_first drop"));
               P(F("resolve_first rename"));
               P(F("resolve_first user_rename \"new_content_name\" \"new_file_name\""));
@@ -170,21 +182,35 @@ show_conflicts(database & db, conflicts_
           else
             {
               // recreated or repeated duplicate name; need two resolutions
-              P(F("resolve_first_left drop"));
-              P(F("resolve_first_right drop"));
 
-              P(F("resolve_first_left rename"));
-              P(F("resolve_first_right rename"));
-              P(F("resolve_first_left user_rename \"new_content_name\" \"new_file_name\""));
-              P(F("resolve_first_right user_rename \"new_content_name\" \"new_file_name\""));
+              P(F("possible resolutions:"));
 
-              if (!conflict.orphaned)
+              if (conflict.left_nid != the_null_node &&
+                  conflict.left_resolution.resolution == resolve_conflicts::none)
                 {
-                  P(F("resolve_first_left keep"));
-                  P(F("resolve_first_right keep"));
-                  P(F("resolve_first_left user \"name\""));
-                  P(F("resolve_first_right user \"name\""));
+                  P(F("resolve_first_left drop"));
+                  P(F("resolve_first_left rename"));
+                  P(F("resolve_first_left user_rename \"new_content_name\" \"new_file_name\""));
+
+                  if (!conflict.orphaned)
+                    {
+                      P(F("resolve_first_left keep"));
+                      P(F("resolve_first_left user \"name\""));
+                    }
                 }
+
+              if (conflict.right_nid != the_null_node &&
+                  conflict.right_resolution.resolution == resolve_conflicts::none)
+                {
+                  P(F("resolve_first_right drop"));
+                  P(F("resolve_first_right rename"));
+                  P(F("resolve_first_right user_rename \"new_content_name\" \"new_file_name\""));
+                  if (!conflict.orphaned)
+                    {
+                      P(F("resolve_first_right keep"));
+                      P(F("resolve_first_right user \"name\""));
+                    }
+                }
               return;
             }
         }
@@ -528,6 +554,9 @@ set_first_conflict(database & db,
           switch (conflict.dropped_side)
             {
             case resolve_conflicts::left_side:
+              E(conflict.left_nid == the_null_node, origin::user,
+                F("must specify 'resolve_first_left' or 'resolve_first_right' (not just 'resolve_first')"));
+
               if (conflict.left_resolution.resolution == resolve_conflicts::none)
                 {
                   if ("drop" == idx(args,0)())
@@ -574,7 +603,11 @@ set_first_conflict(database & db,
                   return;
                 }
               break;
+
             case resolve_conflicts::right_side:
+              E(conflict.right_nid == the_null_node, origin::user,
+                F("must specify 'resolve_first_left' or 'resolve_first_right' (not just 'resolve_first')"));
+
               if (conflict.right_resolution.resolution == resolve_conflicts::none)
                 {
                   if ("drop" == idx(args,0)())
@@ -585,10 +618,10 @@ set_first_conflict(database & db,
                     }
                   else if ("keep" == idx(args,0)())
                     {
-                  E(args.size() == 1, origin::user, F("wrong number of arguments"));
-                  E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
+                      E(args.size() == 1, origin::user, F("wrong number of arguments"));
+                      E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
 
-                  conflict.right_resolution.resolution  = resolve_conflicts::keep;
+                      conflict.right_resolution.resolution  = resolve_conflicts::keep;
                     }
                   else if ("user" == idx(args,0)())
                     {
============================================================
--- src/merge_conflict.cc	d653ef4d1d748fa833b2500eed77ecc0107d48fb
+++ src/merge_conflict.cc	ed311d6cdf1fa47f00a602e0db5b57f84be6a690
@@ -1160,13 +1160,18 @@ roster_merge_result::report_dropped_modi
                     }
                 }
 
+              st.push_str_pair(syms::right_type, "modified file");
+              st.push_str_pair(syms::right_name, modified_name.as_external());
+              db_adaptor.db.get_file_content (db_adaptor.right_rid, nid, fid);
+              st.push_binary_pair(syms::right_file_id, fid.inner());
+              break;
+
+            case resolve_conflicts::right_side:
               st.push_str_pair(syms::left_type, "modified file");
               st.push_str_pair(syms::left_name, modified_name.as_external());
               db_adaptor.db.get_file_content (db_adaptor.left_rid, nid, fid);
               st.push_binary_pair(syms::left_file_id, fid.inner());
-              break;
 
-            case resolve_conflicts::right_side:
               if (conflict.orphaned)
                 {
                   st.push_str_pair(syms::right_type, "orphaned file");
@@ -1189,11 +1194,6 @@ roster_merge_result::report_dropped_modi
                       st.push_binary_pair(syms::right_file_id, fid.inner());
                     }
                 }
-
-              st.push_str_pair(syms::right_type, "modified file");
-              st.push_str_pair(syms::right_name, modified_name.as_external());
-              db_adaptor.db.get_file_content (db_adaptor.right_rid, nid, fid);
-              st.push_binary_pair(syms::right_file_id, fid.inner());
               break;
             }
 
@@ -1243,6 +1243,8 @@ roster_merge_result::report_dropped_modi
           switch (conflict.left_resolution.resolution)
             {
             case resolve_conflicts::none:
+              break;
+
             case resolve_conflicts::content_user:
             case resolve_conflicts::content_user_rename:
             case resolve_conflicts::rename:
@@ -1258,6 +1260,8 @@ roster_merge_result::report_dropped_modi
           switch (conflict.right_resolution.resolution)
             {
             case resolve_conflicts::none:
+              break;
+
             case resolve_conflicts::content_user:
             case resolve_conflicts::content_user_rename:
             case resolve_conflicts::rename:
============================================================
--- src/merge_roster.cc	b4de8ec7db2c60b3ebb777bfa58d9e0d8986558d
+++ src/merge_roster.cc	5d36f441612f9de68ce237b13226bdffd1e2c92a
@@ -26,42 +26,48 @@ enum side_t {left_side, right_side};
 
 enum side_t {left_side, right_side};
 
-static char const *
-image(resolve_conflicts::resolution_t resolution)
+namespace resolve_conflicts
 {
-  switch (resolution)
-    {
-    case resolve_conflicts::none:
-      return "none";
-    case resolve_conflicts::content_user:
-      return "content_user";
-    case resolve_conflicts::content_internal:
-      return "content_internal";
-    case resolve_conflicts::drop:
-      return "drop";
-    case resolve_conflicts::keep:
-      return "keep";
-    case resolve_conflicts::rename:
-      return "rename";
-    case resolve_conflicts::content_user_rename:
-      return "content_user_rename";
-    }
-  I(false); // keep compiler happy
-}
+  char const *
+  image(resolution_t resolution)
+  {
+    switch (resolution)
+      {
+      case resolve_conflicts::none:
+        return "none";
+      case resolve_conflicts::content_user:
+        return "content_user";
+      case resolve_conflicts::content_internal:
+        return "content_internal";
+      case resolve_conflicts::drop:
+        return "drop";
+      case resolve_conflicts::keep:
+        return "keep";
+      case resolve_conflicts::rename:
+        return "rename";
+      case resolve_conflicts::content_user_rename:
+        return "content_user_rename";
+      }
+    I(false); // keep compiler happy
+  }
 
-static string
-image(resolve_conflicts::file_resolution_t res)
-{
-  if (res.resolution == resolve_conflicts::none)
-    return string("");
-  else
-    {
-      ostringstream oss;
-      oss << "resolution: " << image(res.resolution) << " "
-          << "content: " << res.content << " "
-          << "rename: " << res.rename << "\n";
-      return oss.str();
-    }
+  string
+  image(file_resolution_t res)
+  {
+    if (res.resolution == resolve_conflicts::none)
+      return string("");
+    else
+      {
+        ostringstream oss;
+        oss << "resolution: " << image(res.resolution);
+        if (res.content != 0)
+          oss << " content: " << res.content;
+        if (res.rename.as_internal().length()>0)
+          oss << "rename: " << res.rename;
+        oss << "\n";
+        return oss.str();
+      }
+  }
 }
 
 template <> void
@@ -833,7 +839,7 @@ roster_merge(roster_t const & left_paren
           if (right_parent.has_node (modified_name))
             {
               conflict.right_nid = right_parent.get_node(modified_name)->self;
-              duplicate_name = false;
+              duplicate_name = true;
             }
 
           else if (result.roster.has_node(modified_name))
============================================================
--- src/merge_roster.hh	63eab7b216f8839626f9d9d04dc8e58c3eed90bf
+++ src/merge_roster.hh	b013f590a5c9e643afa06d41d3ed362f6c27d0e6
@@ -31,6 +31,8 @@ namespace resolve_conflicts
 {
   enum resolution_t {none, content_user, content_internal, drop, keep, rename, content_user_rename};
 
+  char const * image(resolution_t item);
+
   enum side_t {left_side, right_side};
 
   struct file_resolution_t
@@ -46,6 +48,8 @@ namespace resolve_conflicts
       {}
   };
 
+  std::string image(file_resolution_t res);
+
   // For filename read from conflicts file; converts path to utf8. basic_io
   // parser should return utf8 in the first place.
   file_path file_path_external(std::string path);
@@ -145,7 +149,7 @@ struct dropped_modified_conflict
     right_rid(),
     left_resolution(),
     right_resolution()
-  {dropped_side = (left_nid == the_null_node ? resolve_conflicts::right_side : resolve_conflicts::left_side);}
+  {dropped_side = (left_nid == the_null_node ? resolve_conflicts::left_side : resolve_conflicts::right_side);}
 
   dropped_modified_conflict() :
     left_nid(the_null_node),
============================================================
--- test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/__driver__.lua	46e918155fe50737229d3c2cb31899cf204ef9fd
+++ test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/__driver__.lua	897b4a52ad2ebdb38453f98db1b4284da562a03c
@@ -90,24 +90,45 @@ check(samefilestd("conflicts_3_2", "_MTN
 check(mtn("conflicts", "store", upstream_3, local_2), 0, nil, true)
 check(samefilestd("conflicts_3_2", "_MTN/conflicts"))
 
--- 'keep' is ambiguous here, so it gives an error
+-- since we have a duplicate name conflict, we need to specify both
+-- right and left resolutions, so 'resolve_first' is wrong here
 check(mtn("conflicts", "resolve_first", "keep"), 1, nil, true)
-check(qgrep("ambiguous; use 'keep_left' or 'keep_right'", "stderr"))
+check(qgrep("must specify 'resolve_first_left' or 'resolve_first_right'", "stderr"))
 
 check(mtn("conflicts", "show_first"), 0, nil, true)
 check(samelines("stderr",
- {"mtn: conflict: file 'file_2' from revision 27d41ae9f2b3cb73b130d9845d77574a11021b17",
-  "mtn: modified on the left, named file_2",
+ {"mtn: conflict: file 'file_2'",
+  "mtn: modified on the left",
   "mtn: dropped and recreated on the right",
+  "mtn: possible resolutions:",
+  "mtn: resolve_first_left drop",
+  "mtn: resolve_first_left rename",
+  "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\"",
+  "mtn: resolve_first_left keep",
+  "mtn: resolve_first_left user \"name\"",
+  "mtn: resolve_first_right drop",
+  "mtn: resolve_first_right rename",
+  "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\"",
+  "mtn: resolve_first_right keep",
+  "mtn: resolve_first_right user \"name\""}))   
+
+-- We want to keep the upstream node to avoid future conflicts
+check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, true)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: conflict: file 'file_2'",
   "mtn: modified on the left",
+  "mtn: dropped and recreated on the right",
+  "mtn: left_resolution: keep",
   "mtn: possible resolutions:",
-  "mtn: resolve_first keep_left",
-  "mtn: resolve_first keep_right",
-  "mtn: resolve_first user_left \"name\"",
-  "mtn: resolve_first user_right \"name\""}))
+  "mtn: resolve_first_right drop",
+  "mtn: resolve_first_right rename",
+  "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\"",
+  "mtn: resolve_first_right keep",
+  "mtn: resolve_first_right user \"name\""}))   
 
--- We want to keep the upstream node to avoid future conflicts
-check(mtn("conflicts", "resolve_first", "keep_left"), 0, nil, true)
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, true)
 check(samefilestd("conflicts_3_2_resolved", "_MTN/conflicts"))
 
 check(mtn("explicit_merge", "--resolve-conflicts", upstream_3, local_2, "testbranch"), 0, nil, true)
============================================================
--- test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_3_2_resolved	954b8dfc7ee161c1ca809b61d03ad8fd12bfb539
+++ test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_3_2_resolved	4482ad2e755308ce8a546191348cc648ad13d782
@@ -2,13 +2,14 @@ ancestor [27d41ae9f2b3cb73b130d9845d7757
    right [650057e8a81bd41991dc5ff10b2d60343f1032ae]
 ancestor [27d41ae9f2b3cb73b130d9845d77574a11021b17]
 
-          conflict dropped_modified
-     ancestor_name "file_2"
-  ancestor_file_id [7fc990de4797bd6534a5c1deb344e11964f6b353]
-         left_type "modified file"
-         left_name "file_2"
-      left_file_id [b7e3240a78dc6afce4507f5a18ab516963e72022]
-        right_type "recreated file"
-        right_name "file_2"
-     right_file_id [6e49d17f382dc2f03d495181490e7653f1a14ad9]
-resolved_keep_left
+           conflict dropped_modified
+      ancestor_name "file_2"
+   ancestor_file_id [7fc990de4797bd6534a5c1deb344e11964f6b353]
+          left_type "modified file"
+          left_name "file_2"
+       left_file_id [b7e3240a78dc6afce4507f5a18ab516963e72022]
+         right_type "recreated file"
+         right_name "file_2"
+      right_file_id [6e49d17f382dc2f03d495181490e7653f1a14ad9]
+ resolved_keep_left 
+resolved_drop_right 

reply via email to

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