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