# # # patch "ChangeLog" # from [006117d774f89233f958dc0196f23fdbda607c9c] # to [9c93c573292d02257be62e88889ed5ae78408bb8] # # patch "cset.cc" # from [77ce10b44f0409d4f5b86ffa528621c63ca8895d] # to [d4b4ae843138b3b3ed84bcc6527ae3b0fec7dced] # # patch "database.cc" # from [293bd9d6733f072957e866c8daeaaff11ae962b2] # to [89d38ab4620424410c7bb55f837364443c975900] # # patch "packet.cc" # from [52631488354c6c84a47933df991616e7c7764905] # to [7487db713d703f1128458e740a02a1266a8bb364] # # patch "revision.cc" # from [15ae85321c01342ff77f2891a6a435b2997c650e] # to [4d90ae5702de7fa4aa2b54ec576b56f6ae9c711c] # # patch "sanity.cc" # from [d81f699c8daf70322c2fe440c7a366ac13aefda6] # to [138093daf9687e823c9246b0708b7185f422ef45] # # patch "sanity.hh" # from [0e176663e0e3f7a8e26cb0c1abb194366ea7d878] # to [30ca10f5630908ddf9b0ec48523211436891f98b] # ============================================================ --- ChangeLog 006117d774f89233f958dc0196f23fdbda607c9c +++ ChangeLog 9c93c573292d02257be62e88889ed5ae78408bb8 @@ -1,3 +1,10 @@ +2005-12-10 Timothy Brownawell + + * sanity.{cc,hh}: Fix musing dumps so that the header line always gets + printed, even if printing the body throws an exception. + * database.cc, packet,cc, revision.cc: sprinkle MMs + * cset.cc: sanity check print_cset to match parse_cset + 2005-12-02 Matthew Gregan * Makefile.am: Make Win32 build link against shfolder.lib to get ============================================================ --- cset.cc 77ce10b44f0409d4f5b86ffa528621c63ca8895d +++ cset.cc d4b4ae843138b3b3ed84bcc6527ae3b0fec7dced @@ -256,43 +256,63 @@ print_cset(basic_io::printer & printer, cset const & cs) { + string prev; for (path_set::const_iterator i = cs.nodes_deleted.begin(); i != cs.nodes_deleted.end(); ++i) { + file_path p(*i); + I(prev.empty() || p.as_internal() > prev); + prev = p.as_internal(); basic_io::stanza st; st.push_file_pair(syms::delete_node, file_path(*i)); printer.print_stanza(st); } + prev.clear(); for (map::const_iterator i = cs.nodes_renamed.begin(); i != cs.nodes_renamed.end(); ++i) { + file_path p(i->first); + I(prev.empty() || p.as_internal() > prev); + prev = p.as_internal(); basic_io::stanza st; st.push_file_pair(syms::rename_node, file_path(i->first)); st.push_file_pair(syms::to, file_path(i->second)); printer.print_stanza(st); } + prev.clear(); for (path_set::const_iterator i = cs.dirs_added.begin(); i != cs.dirs_added.end(); ++i) { + file_path p(*i); + I(prev.empty() || p.as_internal() > prev); + prev = p.as_internal(); basic_io::stanza st; st.push_file_pair(syms::add_dir, file_path(*i)); printer.print_stanza(st); } + prev.clear(); for (map::const_iterator i = cs.files_added.begin(); i != cs.files_added.end(); ++i) { + file_path p(i->first); + I(prev.empty() || p.as_internal() > prev); + prev = p.as_internal(); basic_io::stanza st; st.push_file_pair(syms::add_file, file_path(i->first)); st.push_hex_pair(syms::content, i->second.inner()()); printer.print_stanza(st); } + prev.clear(); for (map >::const_iterator i = cs.deltas_applied.begin(); i != cs.deltas_applied.end(); ++i) { + file_path p(i->first); + I(prev.empty() || p.as_internal() > prev); + prev = p.as_internal(); basic_io::stanza st; st.push_file_pair(syms::patch, file_path(i->first)); st.push_hex_pair(syms::from, i->second.first.inner()()); @@ -300,18 +320,29 @@ printer.print_stanza(st); } + pair prev_pair; for (set >::const_iterator i = cs.attrs_cleared.begin(); i != cs.attrs_cleared.end(); ++i) { + pair new_pair(file_path(i->first).as_internal(), + i->second()); + I(new_pair > prev_pair); + prev_pair = new_pair; basic_io::stanza st; st.push_file_pair(syms::clear, file_path(i->first)); st.push_str_pair(syms::attr, i->second()); printer.print_stanza(st); } + prev_pair.first.clear(); + prev_pair.second.clear(); for (map, attr_value>::const_iterator i = cs.attrs_set.begin(); i != cs.attrs_set.end(); ++i) { + pair new_pair(file_path(i->first.first).as_internal(), + i->first.second()); + I(new_pair > prev_pair); + prev_pair = new_pair; basic_io::stanza st; st.push_file_pair(syms::set, file_path(i->first.first)); st.push_str_pair(syms::attr, i->first.second()); @@ -327,9 +358,14 @@ { cs.clear(); string t1, t2, t3; + MM(t1); + MM(t2); + MM(t3); // prev is used to enforce monotonically increasing filename ordering string prev; MM(prev); pair prev_pair; + MM(prev_pair.first); + MM(prev_pair.second); while (parser.symp(syms::delete_node)) { ============================================================ --- database.cc 293bd9d6733f072957e866c8daeaaff11ae962b2 +++ database.cc 89d38ab4620424410c7bb55f837364443c975900 @@ -1485,6 +1485,8 @@ { transaction_guard guard(*this); revision_set rev; + MM(rev); + MM(rid); get_revision(rid, rev); // Make sure that all parent revs have their files replaced with deltas // from this rev's files. @@ -1529,6 +1531,7 @@ rev.check_sane(); revision_data d; + MM(d.inner()); write_revision_set(rev, d); // Phase 1: confirm the revision makes sense @@ -1550,6 +1553,7 @@ marking_map mm; { manifest_id roster_manifest_id; + MM(roster_manifest_id); make_roster_for_revision(rev, new_id, ros, mm, *__app); calculate_ident(ros, roster_manifest_id); I(rev.new_manifest == roster_manifest_id); @@ -2733,6 +2737,7 @@ roster_t & roster, marking_map & marks) { + MM(rev_id); data old_data, new_data; delta reverse_delta; hexenc old_id, new_id; ============================================================ --- packet.cc 52631488354c6c84a47933df991616e7c7764905 +++ packet.cc 7487db713d703f1128458e740a02a1266a8bb364 @@ -655,6 +655,7 @@ packet_db_writer::consume_revision_data(revision_id const & ident, revision_data const & dat) { + MM(ident); transaction_guard guard(pimpl->app.db); if (! pimpl->revision_exists_in_db(ident)) { @@ -663,6 +664,7 @@ dp = shared_ptr(new delayed_revision_data_packet(ident, dat)); revision_set rev; + MM(rev); read_revision_set(dat, rev); for (edge_map::const_iterator i = rev.edges.begin(); ============================================================ --- revision.cc 15ae85321c01342ff77f2891a6a435b2997c650e +++ revision.cc 4d90ae5702de7fa4aa2b54ec576b56f6ae9c711c @@ -1483,6 +1483,7 @@ edge_map & es) { boost::shared_ptr cs(new cset()); + MM(*cs); manifest_id old_man; revision_id old_rev; std::string tmp; @@ -1505,6 +1506,7 @@ parse_revision(basic_io::parser & parser, revision_set & rev) { + MM(rev); rev.edges.clear(); std::string tmp; parser.esym(syms::new_manifest); @@ -1519,6 +1521,7 @@ read_revision_set(data const & dat, revision_set & rev) { + MM(rev); std::istringstream iss(dat()); basic_io::input_source src(iss, "revision"); basic_io::tokenizer tok(src); ============================================================ --- sanity.cc d81f699c8daf70322c2fe440c7a366ac13aefda6 +++ sanity.cc 138093daf9687e823c9246b0708b7185f422ef45 @@ -290,12 +290,17 @@ } -void MusingBase::gasp(const std::string & objstr, std::string & out) const +void MusingBase::gasp_head(std::string & out) const { - out = (boost::format("----- begin '%s' (in %s, at %s:%d)\n" - "%s" - "----- end '%s' (in %s, at %s:%d)\n") + out = (boost::format("----- begin '%s' (in %s, at %s:%d)\n") % name % func % file % line + ).str(); +} + +void MusingBase::gasp_body(const std::string & objstr, std::string & out) const +{ + out += (boost::format("%s" + "----- end '%s' (in %s, at %s:%d)\n") % objstr % name % func % file % line ).str(); ============================================================ --- sanity.hh 0e176663e0e3f7a8e26cb0c1abb194366ea7d878 +++ sanity.hh 30ca10f5630908ddf9b0ec48523211436891f98b @@ -234,7 +234,8 @@ MusingBase(char const * name, char const * file, int line, char const * func) : name(name), file(file), func(func), line(line) {} - void gasp(const std::string & objstr, std::string & out) const; + void gasp_head(std::string & out) const; + void gasp_body(const std::string & objstr, std::string & out) const; }; @@ -249,14 +250,22 @@ T const & obj; }; - +// The header line must be printed into the "out" string before +// dump() is called. +// This is so that even if the call to dump() throws an error, +// the header line ("----- begin ...") will be printed. +// If these calls are collapsed into one, then *no* identifying +// information will be printed in the case of dump() throwing. +// Having the header line without the body is still useful, as it +// provides some semblance of a backtrace. template void Musing::gasp(std::string & out) const { std::string tmp; + MusingBase::gasp_head(out); dump(obj, tmp); - MusingBase::gasp(tmp, out); + MusingBase::gasp_body(tmp, out); } // Yes, this is insane. No, it doesn't work if you do something more sane.