#
# add_file "tests/t_database_check_normalized.at"
#
# patch "ChangeLog"
# from [9a03d37929a41641694d603e4de9992de1fa57ee]
# to [21a43af0d846004b1e8d41f56b8ef66140a8a21b]
#
# patch "database_check.cc"
# from [63ce24deafa543d9f38e21ae826d8230e3d4d44c]
# to [e0df7d5bc527b6d8d783d315bd5ce559a3f411a9]
#
# patch "tests/t_database_check_normalized.at"
# from []
# to [b56eaa874dc95e9f15a87b50997a11c8f85a71b5]
#
# patch "testsuite.at"
# from [48a8654f19aff02b402bcf7e0469d4f5bf383ab1]
# to [d52dd305bffb9f58f304a7380959b07e7b576d20]
#
===============================================
--- ChangeLog 9a03d37929a41641694d603e4de9992de1fa57ee
+++ ChangeLog 21a43af0d846004b1e8d41f56b8ef66140a8a21b
@@ -1,3 +1,10 @@
+2005-07-22 Matt Johnston
+
+ * database_check.cc: check that revisions and manifests
+ are normalised to the same for that they would be written as.
+ * tests/t_database_check_normalized.at: a test for it.
+ * testsuite.at: add it.
+
2005-07-21 Richard Levitte
* contrib/monotone-import.pl: Now uses the given tag.
===============================================
--- database_check.cc 63ce24deafa543d9f38e21ae826d8230e3d4d44c
+++ database_check.cc e0df7d5bc527b6d8d783d315bd5ce559a3f411a9
@@ -13,6 +13,7 @@
#include "revision.hh"
#include "ui.hh"
#include "vocab.hh"
+#include "transforms.hh"
// the database has roughly the following structure
//
@@ -56,7 +57,11 @@
size_t revision_refs; // number of revision references to this manifest
size_t missing_files; // number of missing files referenced by this manifest
- checked_manifest(): found(false), revision_refs(0), missing_files(0) {}
+ bool normalized; // write_manifest_map( read_manifest_map(dat) ) == dat
+
+ checked_manifest():
+ found(false), revision_refs(0),
+ missing_files(0), normalized(false) {}
};
// the number of times a revision is referenced (revision_refs)
@@ -79,6 +84,8 @@
size_t cert_refs; // number of references to this revision by revision certs;
+ bool normalized; // write_revision_set( read_revision_set(dat) ) == dat
+
std::string history_error;
std::set parents;
@@ -88,7 +95,7 @@
found(false),
revision_refs(0), ancestry_parent_refs(0), ancestry_child_refs(0),
missing_manifests(0), missing_revisions(0), incomplete_manifests(0),
- cert_refs(0) {}
+ cert_refs(0), normalized(false) {}
};
static void
@@ -137,6 +144,14 @@
manifest_map man;
read_manifest_map(data, man);
+ // normalisation check
+ manifest_id norm_ident;
+ manifest_data norm_data;
+ write_manifest_map(man, norm_data);
+ calculate_ident(norm_data, norm_ident);
+ if (norm_ident == *i)
+ checked_manifests[*i].normalized = true;
+
for (manifest_map::const_iterator entry = man.begin(); entry != man.end();
++entry)
{
@@ -175,6 +190,14 @@
revision_set rev;
read_revision_set(data, rev);
+ // normalisation check
+ revision_id norm_ident;
+ revision_data norm_data;
+ write_revision_set(rev, norm_data);
+ calculate_ident(norm_data, norm_ident);
+ if (norm_ident == *i)
+ checked_revisions[*i].normalized = true;
+
checked_manifests[rev.new_manifest].revision_refs++;
if (!checked_manifests[rev.new_manifest].found)
@@ -382,7 +405,8 @@
report_manifests(std::map const & checked_manifests,
size_t & missing_manifests,
size_t & unreferenced_manifests,
- size_t & incomplete_manifests)
+ size_t & incomplete_manifests,
+ size_t & non_normalized_manifests)
{
for (std::map::const_iterator
i = checked_manifests.begin(); i != checked_manifests.end(); ++i)
@@ -408,6 +432,13 @@
P(F("manifest %s incomplete (%d missing files)\n")
% i->first % manifest.missing_files);
}
+
+ if (!manifest.normalized)
+ {
+ non_normalized_manifests++;
+ P(F("manifest %s is not in normalized form\n")
+ % i->first);
+ }
}
}
@@ -417,7 +448,8 @@
size_t & incomplete_revisions,
size_t & mismatched_parents,
size_t & mismatched_children,
- size_t & bad_history)
+ size_t & bad_history,
+ size_t & non_normalized_revisions)
{
for (std::map::const_iterator
i = checked_revisions.begin(); i != checked_revisions.end(); ++i)
@@ -477,6 +509,13 @@
% i->first
% revision.history_error);
}
+
+ if (!revision.normalized)
+ {
+ non_normalized_revisions++;
+ P(F("revision %s is not in normalized form\n")
+ % i->first);
+ }
}
}
@@ -587,12 +626,14 @@
size_t missing_manifests = 0;
size_t unreferenced_manifests = 0;
size_t incomplete_manifests = 0;
+ size_t non_normalized_manifests = 0;
size_t missing_revisions = 0;
size_t incomplete_revisions = 0;
size_t mismatched_parents = 0;
size_t mismatched_children = 0;
size_t bad_history = 0;
+ size_t non_normalized_revisions = 0;
size_t missing_keys = 0;
@@ -613,12 +654,14 @@
report_files(checked_files, missing_files, unreferenced_files);
report_manifests(checked_manifests,
- missing_manifests, unreferenced_manifests, incomplete_manifests);
+ missing_manifests, unreferenced_manifests,
+ incomplete_manifests,
+ non_normalized_manifests);
report_revisions(checked_revisions,
missing_revisions, incomplete_revisions,
mismatched_parents, mismatched_children,
- bad_history);
+ bad_history, non_normalized_revisions);
report_keys(checked_keys, missing_keys);
@@ -637,6 +680,8 @@
W(F("%d unreferenced manifests\n") % unreferenced_manifests);
if (incomplete_manifests > 0)
W(F("%d incomplete manifests\n") % incomplete_manifests);
+ if (non_normalized_manifests > 0)
+ W(F("%d manifests not in normalized form\n") % non_normalized_manifests);
if (missing_revisions > 0)
W(F("%d missing revisions\n") % missing_revisions);
@@ -648,6 +693,8 @@
W(F("%d mismatched children\n") % mismatched_children);
if (bad_history > 0)
W(F("%d revisions with bad history\n") % bad_history);
+ if (non_normalized_revisions > 0)
+ W(F("%d revisions not in normalized form\n") % non_normalized_revisions);
if (missing_keys > 0)
W(F("%d missing keys\n") % missing_keys);
@@ -663,7 +710,9 @@
size_t total = missing_files + unreferenced_files +
missing_manifests + unreferenced_manifests + incomplete_manifests +
+ non_normalized_manifests +
missing_revisions + incomplete_revisions +
+ non_normalized_revisions +
mismatched_parents + mismatched_children +
bad_history +
missing_certs + mismatched_certs +
@@ -673,7 +722,9 @@
// serious errors; odd, but nothing will break.
size_t serious = missing_files +
missing_manifests + incomplete_manifests +
+ non_normalized_manifests +
missing_revisions + incomplete_revisions +
+ non_normalized_revisions +
mismatched_parents + mismatched_children +
bad_history +
missing_certs +
===============================================
--- tests/t_database_check_normalized.at
+++ tests/t_database_check_normalized.at b56eaa874dc95e9f15a87b50997a11c8f85a71b5
@@ -0,0 +1,107 @@
+# -*- Autoconf -*-
+
+AT_SETUP([database check for normalization])
+
+# the included database is valid except for all paths being "./" prefixed,
+# hence the database doesn't have correctly normalised manifests
+# nor revisions.
+
+# for future reference, it was created with a modified monotone binary,
+# manifest.cc, and transforms.cc were the modified files.
+
+MONOTONE_SETUP
+NEED_UNGZB64
+
+AT_DATA(bad.db.gz.b64,[
+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
+AAA=
+])
+UNGZB64(bad.db.gz.b64, bad.db)
+
+AT_CHECK(MONOTONE db check -d bad.db, [1], [ignore], [stderr])
+
+AT_CHECK(grep 'revisions not in normalized form' stderr, [], [ignore], [ignore])
+AT_CHECK(grep 'manifests not in normalized form' stderr, [], [ignore], [ignore])
+
+AT_CLEANUP
===============================================
--- testsuite.at 48a8654f19aff02b402bcf7e0469d4f5bf383ab1
+++ testsuite.at d52dd305bffb9f58f304a7380959b07e7b576d20
@@ -676,3 +676,4 @@
m4_include(tests/t_diff_external.at)
m4_include(tests/t_migrate_broken_schema.at)
m4_include(tests/t_ls_branches.at)
+m4_include(tests/t_database_check_normalized.at)