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: 7282e7ba458b5e92f9c3850486c


From: code
Subject: [Monotone-commits-diffs] net.venge.monotone: 7282e7ba458b5e92f9c3850486c7b1c0df13c951
Date: Wed, 20 Mar 2013 14:49:05 +0100 (CET)

revision:            7282e7ba458b5e92f9c3850486c7b1c0df13c951
date:                2013-03-20T11:53:14
author:              address@hidden
branch:              net.venge.monotone
changelog:
* src/merge_content.cc (get_dropped_details): replace rev_id with 
uncommon_ancestors, lca; much more efficient search

* src/cmd_conflicts.cc (show_conflicts):
* src/cmd_merging.cc (perform_merge_into_dir, show_conflicts_core)
  (CMD_AUTOMATE(file_merge)):
* src/merge_conflict.cc (write_conflict_file):
  (resolve_dropped_modified_conflicts):
* src/merge_content.cc (interactive_merge_and_store):  match changes to 
content_merge_database_adaptor

* src/merge_conflict.cc (push_dropped_details): match changes to 
get_dropped_detail
  (report_dropped_modified_conflicts): match changes to push_dropped_details

* src/merge_content.cc (content_merge_database_adaptor): add 
left_uncommon_ancestors, right_uncommon_ancestors
* src/merge_content.hh (content_merge_adaptor):

manifest:
format_version "1"

new_manifest [8fc7904aa078560a61f2cf2aa0d2604c05280e23]

old_revision [00e50c1340793157706ec27e9e336422ec13bf10]

patch "src/cmd_conflicts.cc"
 from [28995825acadb97eaa4b5cda378c66e548e9ad16]
   to [0b6a73cd90560803944c26a4e633ef3b6af5aa64]

patch "src/cmd_merging.cc"
 from [0a6aa03896408c4acdb7a1a9cd1682cb98c6f02a]
   to [e6fee865163eebdc0e2ec8564e5ad30af07ff640]

patch "src/merge_conflict.cc"
 from [b47a70720f836809f06347360ee91ddf587b5721]
   to [6e6a25ae8b577b495ab851d208cee324144ac8e2]

patch "src/merge_content.cc"
 from [b3aeba9d9a98bf032c7771ae7426e9209085f070]
   to [6e5fe3365b60c66b5ef14e6775d6a7bd49ec3312]

patch "src/merge_content.hh"
 from [f9a3388e5d2bd6d873d352dabf896df32827e983]
   to [b6545d8397108a002d119659773b3dea1eff4951]
============================================================
--- src/cmd_conflicts.cc	28995825acadb97eaa4b5cda378c66e548e9ad16
+++ src/cmd_conflicts.cc	0b6a73cd90560803944c26a4e633ef3b6af5aa64
@@ -1,4 +1,4 @@
-// Copyright (C) 2008 - 2010, 2012 Stephen Leake <address@hidden>
+// Copyright (C) 2008 - 2010, 2012, 2013 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.
@@ -313,7 +313,8 @@ show_conflicts(database & db, conflicts_
                  count) % count);
 
             content_merge_database_adaptor adaptor
-              (db, conflicts.left_rid, conflicts.right_rid, conflicts.left_marking, conflicts.right_marking);
+              (db, conflicts.left_rid, conflicts.right_rid, conflicts.left_marking, conflicts.right_marking,
+               std::set<revision_id> (), std::set<revision_id> ()); // uncommon_ancestors only used in automate
 
             conflicts.result.report_missing_root_conflicts
               (*conflicts.left_roster, *conflicts.right_roster, adaptor, false, std::cout);
============================================================
--- src/cmd_merging.cc	0a6aa03896408c4acdb7a1a9cd1682cb98c6f02a
+++ src/cmd_merging.cc	e6fee865163eebdc0e2ec8564e5ad30af07ff640
@@ -1,5 +1,5 @@
 // Copyright (C) 2002 Graydon Hoare <address@hidden>
-//               2008, 2010, 2012 Stephen Leake <address@hidden>
+//               2008, 2010, 2012, 2013 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.
@@ -721,7 +721,8 @@ void perform_merge_into_dir(app_state & 
 
         temp_node_id_source nis;
         content_merge_database_adaptor
-          dba(db, left_rid, right_rid, left_marking_map, right_marking_map);
+          dba(db, left_rid, right_rid, left_marking_map, right_marking_map,
+              left_uncommon_ancestors, right_uncommon_ancestors);
 
         bool resolutions_given;
 
@@ -1045,8 +1046,8 @@ show_conflicts_core (database & db,
     }
   else
     {
-      content_merge_database_adaptor adaptor(db, l_id, r_id,
-                                             l_marking, r_marking);
+      content_merge_database_adaptor adaptor(db, l_id, r_id, l_marking, r_marking,
+                                             l_uncommon_ancestors, r_uncommon_ancestors);
 
       if (basic_io)
         {
@@ -1244,7 +1245,9 @@ CMD_AUTOMATE(file_merge, N_("LEFT_REVID 
   db.get_roster(right_rid, right_roster, right_marking);
 
   content_merge_database_adaptor adaptor(db, left_rid, right_rid,
-                                         left_marking, right_marking);
+                                         left_marking, right_marking,
+                                         set<revision_id> (), set<revision_id> ());
+  // uncommon_ancestors only needed for dropped_modified conflicts
 
   const_file_t left_n = downcast_to_file_t(left_roster.get_node(left_path));
   const_file_t right_n = downcast_to_file_t(right_roster.get_node(right_path));
============================================================
--- src/merge_conflict.cc	b47a70720f836809f06347360ee91ddf587b5721
+++ src/merge_conflict.cc	6e6a25ae8b577b495ab851d208cee324144ac8e2
@@ -1066,14 +1066,15 @@ push_dropped_details(content_merge_datab
                      symbol                           rev_sym,
                      symbol                           name_sym,
                      symbol                           file_id_sym,
-                     revision_id                      rev_id,
+                     std::set<revision_id> const &    uncommon_ancestors,
+                     revision_id const &              lca,
                      node_id                          nid,
                      basic_io::stanza &               st)
 {
   revision_id dropped_rev_id;
   file_path   dropped_name;
   file_id     dropped_file_id;
-  db_adaptor.get_dropped_details(rev_id, nid, dropped_rev_id, dropped_name, dropped_file_id);
+  db_adaptor.get_dropped_details(uncommon_ancestors, lca, nid, dropped_rev_id, dropped_name, dropped_file_id);
 
   st.push_binary_pair(rev_sym, dropped_rev_id.inner());
   st.push_str_pair(name_sym, dropped_name.as_external());
@@ -1141,7 +1142,7 @@ roster_merge_result::report_dropped_modi
                 {
                    st.push_str_pair(syms::left_type, "orphaned file");
                    push_dropped_details(db_adaptor, syms::left_rev, syms::left_name, syms::left_file_id,
-                                        db_adaptor.left_rid, nid, st);
+                                        db_adaptor.left_uncommon_ancestors, db_adaptor.lca, nid, st);
                 }
               else
                 {
@@ -1149,7 +1150,7 @@ roster_merge_result::report_dropped_modi
                     {
                       st.push_str_pair(syms::left_type, "dropped file");
                       push_dropped_details(db_adaptor, syms::left_rev, syms::left_name, syms::left_file_id,
-                                           db_adaptor.left_rid, nid, st);
+                                           db_adaptor.left_uncommon_ancestors, db_adaptor.lca, nid, st);
                     }
                   else
                     {
@@ -1176,7 +1177,7 @@ roster_merge_result::report_dropped_modi
                 {
                   st.push_str_pair(syms::right_type, "orphaned file");
                   push_dropped_details(db_adaptor, syms::right_rev, syms::right_name, syms::right_file_id,
-                                       db_adaptor.right_rid, nid, st);
+                                       db_adaptor.right_uncommon_ancestors, db_adaptor.lca, nid, st);
                 }
               else
                 {
@@ -1184,7 +1185,7 @@ roster_merge_result::report_dropped_modi
                     {
                       st.push_str_pair(syms::right_type, "dropped file");
                       push_dropped_details(db_adaptor, syms::right_rev, syms::right_name, syms::right_file_id,
-                                           db_adaptor.right_rid, nid, st);
+                                           db_adaptor.right_uncommon_ancestors, db_adaptor.lca, nid, st);
                     }
                   else
                     {
@@ -2664,8 +2665,13 @@ roster_merge_result::write_conflict_file
 {
   std::ostringstream output;
 
+  std::set<revision_id> left_uncommon_ancestors;
+  std::set<revision_id> right_uncommon_ancestors;
+  db.get_uncommon_ancestors(left_rid, right_rid, left_uncommon_ancestors, right_uncommon_ancestors);
+
   content_merge_database_adaptor adaptor(db, left_rid, right_rid,
-                                         left_marking, right_marking);
+                                         left_marking, right_marking,
+                                         left_uncommon_ancestors, right_uncommon_ancestors);
 
   adaptor.cache_roster (left_rid, left_roster);
   adaptor.cache_roster (right_rid, right_roster);
@@ -3092,7 +3098,8 @@ roster_merge_result::resolve_dropped_mod
                 {
                   // attr mtn::resolve_conflict drop does not set rid; find it now
                   adaptor.get_dropped_details
-                    (adaptor.left_rid, conflict.left_nid, conflict.left_rid, left_name, left_fid);
+                    (adaptor.left_uncommon_ancestors, adaptor.lca,
+                     conflict.left_nid, conflict.left_rid, left_name, left_fid);
                 }
               else
                 {
@@ -3114,7 +3121,8 @@ roster_merge_result::resolve_dropped_mod
               if (null_id(conflict.left_rid))
                 {
                   adaptor.get_dropped_details
-                    (adaptor.right_rid, conflict.right_nid, conflict.right_rid, right_name, right_fid);
+                    (adaptor.right_uncommon_ancestors, adaptor.lca,
+                     conflict.right_nid, conflict.right_rid, right_name, right_fid);
                 }
               else
                 {
============================================================
--- src/merge_content.cc	b3aeba9d9a98bf032c7771ae7426e9209085f070
+++ src/merge_content.cc	6e5fe3365b60c66b5ef14e6775d6a7bd49ec3312
@@ -42,8 +42,11 @@ content_merge_database_adaptor::content_
                                                                revision_id const & left,
                                                                revision_id const & right,
                                                                marking_map const & left_mm,
-                                                               marking_map const & right_mm)
-  : db(db), left_rid (left), right_rid (right), left_mm(left_mm), right_mm(right_mm)
+                                                               marking_map const & right_mm,
+                                                               set<revision_id> left_uncommon_ancestors,
+                                                               set<revision_id> right_uncommon_ancestors)
+  : db(db), left_rid (left), right_rid (right), left_mm(left_mm), right_mm(right_mm),
+  left_uncommon_ancestors (left_uncommon_ancestors), right_uncommon_ancestors (right_uncommon_ancestors)
 {
   // FIXME: possibly refactor to run this lazily, as we don't
   // need to find common ancestors if we're never actually
@@ -180,21 +183,20 @@ void
 }
 
 void
-content_merge_database_adaptor::get_dropped_details(revision_id & rev_id,
-                                                    node_id       nid,
-                                                    revision_id & dropped_rev_id,
-                                                    file_path   & dropped_name,
-                                                    file_id     & dropped_file_id)
+content_merge_database_adaptor::get_dropped_details(set<revision_id> const & uncommon_ancestors,
+                                                    revision_id const &      least_common_ancestor,
+                                                    node_id const            nid,
+                                                    revision_id &            dropped_rev_id,
+                                                    file_path   &            dropped_name,
+                                                    file_id     &            dropped_file_id)
 {
-  set<revision_id> parents;
-  db.get_revision_parents(rev_id, parents);
+  roster_t roster;
+  marking_map marking_map;
 
-  while (parents.begin() != parents.end())
+  // graph.cc ensures that uncommon_ancestors is in topological order, leaf-most first.
+  for (set<revision_id>::const_iterator i = uncommon_ancestors.begin();
+       i != uncommon_ancestors.end(); ++i)
     {
-      set<revision_id>::iterator i = parents.begin();
-      roster_t roster;
-      marking_map marking_map;
-
       db.get_roster(*i, roster, marking_map);
       if (roster.has_node(nid))
         {
@@ -202,14 +204,16 @@ content_merge_database_adaptor::get_drop
           roster.get_file_details(nid, dropped_file_id, dropped_name);
           return;
         }
-      else
-        {
-          set<revision_id> more_parents;
-          db.get_revision_parents(*i, more_parents);
-          parents.erase (i);
-          parents.insert(more_parents.begin(), more_parents.end());
-        }
     }
+
+  db.get_roster(least_common_ancestor, roster, marking_map);
+  if (roster.has_node(nid))
+    {
+      dropped_rev_id = least_common_ancestor;
+      roster.get_file_details(nid, dropped_file_id, dropped_name);
+      return;
+    }
+  I(false);
 }
 
 void
@@ -837,7 +841,8 @@ interactive_merge_and_store(lua_hooks & 
   bool resolutions_given;
   temp_node_id_source nis;
   content_merge_database_adaptor dba(db, left_rid, right_rid,
-                                     left_marking_map, right_marking_map);
+                                     left_marking_map, right_marking_map,
+                                     left_uncommon_ancestors, right_uncommon_ancestors);
 
   parse_resolve_conflicts_opts (opts, left_rid, left_roster, right_rid, right_roster, result, resolutions_given);
 
============================================================
--- src/merge_content.hh	f9a3388e5d2bd6d873d352dabf896df32827e983
+++ src/merge_content.hh	b6545d8397108a002d119659773b3dea1eff4951
@@ -1,5 +1,5 @@
 // Copyright (C) 2005 Nathaniel Smith <address@hidden>
-//               2008, 2010, 2012 Stephen Leake <address@hidden>
+//               2008, 2010, 2012, 2013 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.
@@ -60,12 +60,15 @@ content_merge_database_adaptor
   revision_id right_rid;
   marking_map const & left_mm;
   marking_map const & right_mm;
+  std::set<revision_id> left_uncommon_ancestors, right_uncommon_ancestors;
   std::map<revision_id, boost::shared_ptr<roster_t const> > rosters;
   content_merge_database_adaptor(database & db,
                                  revision_id const & left,
                                  revision_id const & right,
                                  marking_map const & left_mm,
-                                 marking_map const & right_mm);
+                                 marking_map const & right_mm,
+                                 std::set<revision_id> left_uncommon_ancestors,
+                                 std::set<revision_id> right_uncommon_ancestors);
   void record_merge(file_id const & left_ident,
                     file_id const & right_ident,
                     file_id const & merged_ident,
@@ -88,13 +91,15 @@ content_merge_database_adaptor
                             revision_id & rid,
                             boost::shared_ptr<roster_t const> & anc);
 
-  // Search parents of rev_id (which must be left_rid or right_rid); return
-  // rev, file_path, and file_id for nid just before it was dropped.
-  void get_dropped_details(revision_id & rev_id,
-                           node_id       nid,
-                           revision_id & dropped_rev_id,
-                           file_path   & dropped_name,
-                           file_id     & dropped_file_id);
+  // Search uncommon_ancestors (which must be left_uncommon_ancestors or
+  // right_uncommon_ancestors); return rev, file_path, and file_id for nid
+  // just before it was dropped.
+  void get_dropped_details(std::set<revision_id> const & uncommon_ancestors,
+                           revision_id const &           least_common_ancestor,
+                           node_id                       nid,
+                           revision_id &                 dropped_rev_id,
+                           file_path   &                 dropped_name,
+                           file_id     &                 dropped_file_id);
 
   void get_version(file_id const & ident,
                    file_data & dat) const;

reply via email to

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