#
# patch "ChangeLog"
# from [b057c2543646fc3da2fa4a0f6ad90194f3b52a94]
# to [5cec6a775da7b25da5dcc392abec0e8ed4054030]
#
# patch "commands.cc"
# from [c37e80febb5d27822b14f8fb0ebb0a509e5efb79]
# to [314b18e558832d2fc334767f00d057ad4c623fa7]
#
# patch "pcdv.cc"
# from [ec5439e5a58d5895d73ce163d6c8ac96ce7d908e]
# to [0bd04eacd73e9056c97f92d2a08772f5a624f147]
#
# patch "pcdv.hh"
# from [42bf317c405625ccb402ce51c6ec96b65c187907]
# to [6dc79305b5e65ce553a85b79f998f0c7da205f2d]
#
========================================================================
--- ChangeLog b057c2543646fc3da2fa4a0f6ad90194f3b52a94
+++ ChangeLog 5cec6a775da7b25da5dcc392abec0e8ed4054030
@@ -1,3 +1,8 @@
+2005-08-03 Timothy Brownawell
+
+ * pcdv.{cc,hh}: Work on merge functions for trees.
+ * commands.cc: Misc. changes to pcdv driver
+
2005-08-02 Timothy Brownawell
* pcdv.{cc,hh}: Add history-aware filetree merge.
========================================================================
--- commands.cc c37e80febb5d27822b14f8fb0ebb0a509e5efb79
+++ commands.cc 314b18e558832d2fc334767f00d057ad4c623fa7
@@ -3888,14 +3888,18 @@
vector & roots,
app_state & app)
{
- manifest_id mid;
- app.db.get_revision_manifest(start, mid);
- manifest_map m;
- app.db.get_manifest(mid, m);
- manifest_map::const_iterator i = m.find(fp);
- I(i != m.end());
- file_id ident = manifest_entry_id(i);
- fileids.insert(make_pair(start, make_pair(ident, fp)));
+ if (!(fp == file_path()))
+ {
+ manifest_id mid;
+ app.db.get_revision_manifest(start, mid);
+ manifest_map m;
+ app.db.get_manifest(mid, m);
+ manifest_map::const_iterator i = m.find(fp);
+ I(i != m.end());
+ file_id ident = manifest_entry_id(i);
+ fileids.insert(make_pair(start, make_pair(ident, fp)));
+ }
+
std::deque > todo;
todo.push_back(make_pair(start, fp));
ticker num("file_id count", "F", 1);
@@ -3967,6 +3971,162 @@
}
}
+void
+prdiff(change_set::path_rearrangement const & a,
+ change_set::path_rearrangement const & b)
+{
+ std::set::const_iterator sa, sb;
+ std::map::const_iterator ma, mb;
+
+ sa = a.deleted_files.begin();
+ sb = b.deleted_files.begin();
+ while (sa != a.deleted_files.end() || sb != b.deleted_files.end())
+ {
+ if (sa == a.deleted_files.end())
+ {
+ P(F("> delete_file %1%") % *sb);
+ ++sb;
+ }
+ else if (sb == b.deleted_files.end())
+ {
+ P(F("< delete_file %1%") % *sa);
+ ++sa;
+ }
+ else if (*sa < *sb)
+ {
+ P(F("< delete_file %1%") % *sa);
+ ++sa;
+ }
+ else if (*sb < *sa)
+ {
+ P(F("> delete_file %1%") % *sb);
+ ++sb;
+ }
+ else
+ ++sa, ++sb;
+ }
+
+ sa = a.deleted_dirs.begin();
+ sb = b.deleted_dirs.begin();
+ while (sa != a.deleted_dirs.end() || sb != b.deleted_dirs.end())
+ {
+ if (sa == a.deleted_dirs.end())
+ {
+ P(F("> delete_dir %1%") % *sb);
+ ++sb;
+ }
+ else if (sb == b.deleted_dirs.end())
+ {
+ P(F("< delete_dir %1%") % *sa);
+ ++sa;
+ }
+ else if (*sa < *sb)
+ {
+ P(F("< delete_dir %1%") % *sa);
+ ++sa;
+ }
+ else if (*sb < *sa)
+ {
+ P(F("> delete_dir %1%") % *sb);
+ ++sb;
+ }
+ else
+ ++sa, ++sb;
+ }
+
+ sa = a.added_files.begin();
+ sb = b.added_files.begin();
+ while (sa != a.added_files.end() || sb != b.added_files.end())
+ {
+ if (sa == a.added_files.end())
+ {
+ P(F("> add_file %1%") % *sb);
+ ++sb;
+ }
+ else if (sb == b.added_files.end())
+ {
+ P(F("< add_file %1%") % *sa);
+ ++sa;
+ }
+ else if (*sa < *sb)
+ {
+ P(F("< add_file %1%") % *sa);
+ ++sa;
+ }
+ else if (*sb < *sa)
+ {
+ P(F("> add_file %1%") % *sb);
+ ++sb;
+ }
+ else
+ ++sa, ++sb;
+ }
+
+ ma = a.renamed_files.begin();
+ mb = b.renamed_files.begin();
+ while (ma != a.renamed_files.end() || mb != b.renamed_files.end())
+ {
+ if (ma == a.renamed_files.end())
+ {
+ P(F("> rename_file %1%") % mb->first);
+ P(F("> to %1%") % mb->second);
+ ++mb;
+ }
+ else if (mb == b.renamed_files.end())
+ {
+ P(F("< rename_file %1%") % ma->first);
+ P(F("> to %1%") % ma->second);
+ ++ma;
+ }
+ else if (*ma < *mb)
+ {
+ P(F("< rename_file %1%") % ma->first);
+ P(F("> to %1%") % ma->second);
+ ++ma;
+ }
+ else if (*mb < *ma)
+ {
+ P(F("> rename_file %1%") % mb->first);
+ P(F("> to %1%") % mb->second);
+ ++mb;
+ }
+ else
+ ++ma, ++mb;
+ }
+
+ ma = a.renamed_dirs.begin();
+ mb = b.renamed_dirs.begin();
+ while (ma != a.renamed_dirs.end() || mb != b.renamed_dirs.end())
+ {
+ if (ma == a.renamed_dirs.end())
+ {
+ P(F("> rename_dir %1%") % mb->first);
+ P(F("> to %1%") % mb->second);
+ ++mb;
+ }
+ else if (mb == b.renamed_dirs.end())
+ {
+ P(F("< rename_dir %1%") % ma->first);
+ P(F("> to %1%") % ma->second);
+ ++ma;
+ }
+ else if (*ma < *mb)
+ {
+ P(F("< rename_dir %1%") % ma->first);
+ P(F("> to %1%") % ma->second);
+ ++ma;
+ }
+ else if (*mb < *ma)
+ {
+ P(F("> rename_dir %1%") % mb->first);
+ P(F("> to %1%") % mb->second);
+ ++mb;
+ }
+ else
+ ++ma, ++mb;
+ }
+}
+
CMD(pcdv, "debug", "REVISION REVISION FILENAME",
"precise-cdv merge FILENAME in the two given revisions",
OPT_NONE)
@@ -4032,8 +4192,22 @@
treevec.push_back(from);
revec.push_back(edge_changes(i).rearrangement);
}
- tree_state newtree(tree_state::merge(treevec, revec,
+ tree_state newtree(tree_state::merge_with_rearrangement(treevec, revec,
roots.front().inner()()));
+ if (rs.edges.size() > 1)
+ for (unsigned int i = 0; i != rs.edges.size(); ++i)
+ {
+ std::set res;
+ change_set::path_rearrangement changes;
+ idx(treevec, i).get_changes_for_merge(newtree, changes);
+ if (!(idx(revec, i) == changes))
+ {
+// P(F("From parent #%1% to %2%") % i % roots.front());
+// P(F("Real vs. calc"));
+// prdiff(idx(revec, i), changes);
+// I(false);
+ }
+ }
trees.insert(make_pair(roots.front(), newtree));
std::map >::const_iterator
@@ -4101,6 +4275,52 @@
roots.pop_front();
}
+ std::map::const_iterator lt(trees.find(left));
+ std::map::const_iterator rt(trees.find(right));
+ I(lt != trees.end());
+ I(rt != trees.end());
+ std::vector conf(lt->second.conflict(rt->second));
+/*
+ std::vector > t(lt->second.current());
+ for (std::vector >::const_iterator
+ i = t.begin(); i != t.end(); ++i)
+ {
+ P(F("%1%: %2%") % i->first % i->second);
+ }
+*/
+ P(F("There are %1% conflicts:") % conf.size());
+ for (std::vector::const_iterator i = conf.begin();
+ i != conf.end(); ++i)
+ {
+ P(F("Type: %1%") % ((i->type == path_conflict::collision)
+ ?"Collision":"Split"));
+ for (unsigned int j = 0; j < i->items.size(); ++j)
+ {
+ P(F("Item %1%:") % idx(i->items, j));
+ P(F("Lname: %1%") % idx(i->lnames, j));
+ P(F("Rname: %1%") % idx(i->rnames, j));
+ }
+ P(F("Name: %1%") % i->name);
+ }
+ if (conf.empty())
+ {
+ std::set res;
+ std::vector parents;
+ parents.push_back(lt->second);
+ parents.push_back(rt->second);
+ change_set::path_rearrangement changes;
+ data dat;
+ tree_state mt(tree_state::merge_with_resolution(parents, res, "xxx"));
+ lt->second.get_changes_for_merge(mt, changes);
+// P(F("Left changes:"));
+// write_path_rearrangement(changes, dat);
+// P(F("%1%") % dat);
+ rt->second.get_changes_for_merge(mt, changes);
+// P(F("Right changes:"));
+// write_path_rearrangement(changes, dat);
+// P(F("%1%") % dat);
+ }
+
map::iterator l = files.find(left);
N(l != files.end(), F("Not found: %s.") % left);
map::iterator r = files.find(right);
@@ -4109,16 +4329,7 @@
P(F("Done building history."));
vector result(l->second.conflict(r->second));
- P(F(""));
show_conflict(consolidate(result));
- std::map::const_iterator lt(trees.find(left));
- std::map::const_iterator rt(trees.find(right));
- std::vector > t(lt->second.current());
- for (std::vector >::const_iterator
- i = t.begin(); i != t.end(); ++i)
- {
- P(F("%1%: %2%") % i->first % i->second);
- }
}
========================================================================
--- pcdv.cc ec5439e5a58d5895d73ce163d6c8ac96ce7d908e
+++ pcdv.cc 0bd04eacd73e9056c97f92d2a08772f5a624f147
@@ -1,6 +1,7 @@
#include
#include