#
#
# 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.