[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Monotone-commits-diffs] net.venge.monotone: 7282e7ba458b5e92f9c3850486c7b1c0df13c951,
code <=