# # patch "ChangeLog" # from [babd61b2ae2e5a9c88f5c77e649f65ca3ae282b5] # to [63c759b0cfd48e65dc585981636065a006a2409e] # # patch "change_set.cc" # from [f20e89774ae99040b5867f1d59803b660d29a071] # to [39d27129e791256a3b0bba63888179de3fe225c0] # # patch "pcdv.cc" # from [68692c9fe057fd16f00fe064bfdbaa95a2ef73d0] # to [3bf2c8965080e804a4f70c0e152ef89f34c9bc03] # ======================================================================== --- ChangeLog babd61b2ae2e5a9c88f5c77e649f65ca3ae282b5 +++ ChangeLog 63c759b0cfd48e65dc585981636065a006a2409e @@ -1,3 +1,10 @@ +2005-08-19 Timothy Brownawell + + * change_set.cc: Add (and use) dump() for vector + * pcdv.cc: Clean up P() / L() usage. + * pcdv.cc (item_status::suture): Downgrade invariant (should + have been error) to warning; was triggered by monotone db. + 2005-08-18 Timothy Brownawell * pcdv.cc (tree_state::merge_with_resolution): bugfix, multiple ======================================================================== --- change_set.cc f20e89774ae99040b5867f1d59803b660d29a071 +++ change_set.cc 39d27129e791256a3b0bba63888179de3fe225c0 @@ -1939,6 +1939,7 @@ app.db.get_revision(roots.front(), rs); std::vector treevec; std::vector revec; + MM(revec); for (edge_map::const_iterator i = rs.edges.begin(); i != rs.edges.end(); ++i) { @@ -2827,25 +2828,53 @@ } void -write_path_rearrangement(change_set::path_rearrangement const & re, - data & dat) +write_insane_path_rearrangement(change_set::path_rearrangement const & re, + data & dat) { - re.check_sane(); std::ostringstream oss; basic_io::printer pr(oss); - print_path_rearrangement(pr, re); + print_insane_path_rearrangement(pr, re); dat = data(oss.str()); } void +write_path_rearrangement(change_set::path_rearrangement const & re, + data & dat) +{ + re.check_sane(); + write_insane_path_rearrangement(re, dat); +} + +void dump(change_set const & cs, std::string & out) { data tmp; write_insane_change_set(cs, tmp); -// write_change_set(cs, tmp); out = tmp(); } +void +dump(change_set::path_rearrangement const & pr, std::string & out) +{ + data tmp; + write_insane_path_rearrangement(pr, tmp); + out = tmp(); +} + +void +dump(std::vector const & obj, + std::string & out) +{ + out.clear(); + std::string tmp; + for (std::vector::const_iterator + i = obj.begin(); i != obj.end(); ++i) + { + dump(*i, tmp); + out += tmp + "\n\n"; + } +} + #ifdef BUILD_UNIT_TESTS #include "unit_tests.hh" #include "sanity.hh" ======================================================================== --- pcdv.cc 68692c9fe057fd16f00fe064bfdbaa95a2ef73d0 +++ pcdv.cc 3bf2c8965080e804a4f70c0e152ef89f34c9bc03 @@ -887,7 +887,11 @@ versions->insert(*o); else { - I(m->second.first == o->second.first); + if (!(m->second.first == o->second.first)) + { + W(F("Sutured items previously had different names in the same revision.")); + L(F("This was in revision #%1%") % o->first); + } std::set s; std::vector const & ov(o->second.second); std::vector & mv(m->second.second); @@ -998,6 +1002,8 @@ void tree_state::add_suture(item_id l, item_id r) { + I(l != -1); + I(r != -1); I(l != r); if (l < r) { @@ -1009,7 +1015,10 @@ if (i != sutures->end()) add_suture(l, i->second); else - sutures->insert(make_pair(l, r)); + { + L(F("Suturing item %1% to item %2%") % l % r); + sutures->insert(make_pair(l, r)); + } } void @@ -1044,6 +1053,9 @@ item_id out = from; while (i != sutures->end()) { + std::map::iterator j = states->find(i->first); + if (j != states->end()) + return i->first; out = i->second; i = sutures->find(out); } @@ -1164,6 +1176,8 @@ std::vector const & changes, std::string revision) { + tree_state out(mash(trees)); + L(F("Now processing %1% (#%2%)") % revision % out.itx->intern(revision)); // shortest first, then in order of: // deleted dirs, deleted files, renamed dirs, renamed files, added files // sort key is (depth, class, rev#) @@ -1184,7 +1198,6 @@ } } interner cit; - tree_state out(mash(trees)); fpid rootid = cit.intern(file_path()()); outmap.insert(make_pair(rootid, -1)); done.insert(-1); @@ -1239,8 +1252,9 @@ for (std::set::iterator i = unchanged.begin(); i != unchanged.end(); ++i) { - item_id myid = out.getid(i->get<1>()); - item_id pid = out.getid(i->get<2>()); + tree_state const & t(*i->get<0>()); + item_id myid = t.getid(i->get<1>()); + item_id pid = t.getid(i->get<2>()); // process this item if its parent has been processed if (done.find(pid) == done.end()) continue; @@ -1248,17 +1262,23 @@ if (done.find(myid) != done.end()) continue; std::map::const_iterator - j = out.states->find(myid); - I(j != out.states->end()); - file_path fp = out.get_full_name(j->second); + j = t.states->find(myid); + I(j != t.states->end()); + file_path fp = t.get_full_name(j->second); + I(!(fp == file_path())); done.insert(myid); std::pair::iterator, bool> r; r = outmap.insert(make_pair(cit.intern(fp()), myid)); if (r.first->second != myid) { - W(F("Colliding over %1%") % fp); + L(F("Items %1% and %2% Colliding over %3% in revision %4%") + % myid + % r.first->second + % fp + % revision); out.add_suture(r.first->second, myid); } + done.insert(t.getid(myid)); } lastlevel = level; } @@ -1282,7 +1302,7 @@ I(p.second); j = p.first; addednew = true; - L(F("New item: %1%") % to); + L(F("New item: %1% (%2%)") % to % current_id); } else { @@ -1313,6 +1333,7 @@ done.insert(current_id); continue; } + I(!(to == file_path())); { int d = -1; std::set s = current_item.current_names(); @@ -1340,6 +1361,15 @@ I(k != outmap.end()); // ...and get it moved in. + if (type != added_file && type != added_dir) + { + std::map::const_iterator + i = idx(trees,which).states->find(current_id); + if (i != idx(trees,which).states->end()) + L(F("File %1% being renamed to %2%. (%3%)") + % idx(trees,which).get_full_name(i->second) + % to % current_id); + } current_item = current_item.rename(out.itx->intern(revision), k->second, new_name); @@ -1351,15 +1381,20 @@ r = outmap.insert(make_pair(cit.intern(to()), current_id)); if (r.first->second != current_id) { - W(F("Colliding over %1%") % to); + L(F("Items %1% and %2% Colliding over %3% in revision %4%") + % current_id + % r.first->second + % to + % revision); out.add_suture(r.first->second, current_id); } } for (std::set::iterator i = unchanged.begin(); i != unchanged.end(); ++i) { - item_id myid = out.getid(i->get<1>()); - item_id pid = out.getid(i->get<2>()); + tree_state const & t(*i->get<0>()); + item_id myid = t.getid(i->get<1>()); + item_id pid = t.getid(i->get<2>()); // process this item if its parent has been processed if (done.find(pid) == done.end()) continue; @@ -1367,17 +1402,22 @@ if (done.find(myid) != done.end()) continue; std::map::const_iterator - j = out.states->find(myid); - I(j != out.states->end()); - file_path fp = out.get_full_name(j->second); - done.insert(myid); + j = t.states->find(myid); + I(j != t.states->end()); + file_path fp = t.get_full_name(j->second); + I(!(fp == file_path())); std::pair::iterator, bool> r; r = outmap.insert(make_pair(cit.intern(fp()), myid)); if (r.first->second != myid) { - W(F("Colliding over %1%") % fp); + L(F("Items %1% and %2% Colliding over %3% in revision %4%") + % myid + % r.first->second + % fp + % revision); out.add_suture(r.first->second, myid); } + done.insert(t.getid(myid)); } out.apply_sutures(); return out;