diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2024-05-14 18:50:55 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2024-05-14 21:10:30 +0300 |
commit | 3271ee28840ff1ab905943649acbcea262cd9b2b (patch) | |
tree | acdd475f31b2fa711ca2d90aa04d947e65bf4f37 | |
parent | dcb8512ff90f75da37227e4d9bcc7c058a3b9ca6 (diff) |
Fix rep-remove assertions
-rw-r--r-- | bpkg/rep-fetch.cxx | 4 | ||||
-rw-r--r-- | bpkg/rep-mask.cxx | 11 | ||||
-rw-r--r-- | bpkg/rep-remove.cxx | 55 | ||||
-rw-r--r-- | bpkg/rep-remove.hxx | 7 |
4 files changed, 57 insertions, 20 deletions
diff --git a/bpkg/rep-fetch.cxx b/bpkg/rep-fetch.cxx index d02a064..fe25b86 100644 --- a/bpkg/rep-fetch.cxx +++ b/bpkg/rep-fetch.cxx @@ -1552,6 +1552,10 @@ namespace bpkg } } +#ifndef NDEBUG + rep_remove_verify (db, t); +#endif + // Make sure that the external packages are available from a single // directory-based repository. // diff --git a/bpkg/rep-mask.cxx b/bpkg/rep-mask.cxx index d7f9c6a..e670005 100644 --- a/bpkg/rep-mask.cxx +++ b/bpkg/rep-mask.cxx @@ -6,6 +6,7 @@ #include <bpkg/package.hxx> #include <bpkg/package-odb.hxx> #include <bpkg/database.hxx> +#include <bpkg/rep-remove.hxx> // rep_remove_verify() #include <bpkg/diagnostics.hxx> #include <bpkg/package-query.hxx> // repo_configs #include <bpkg/manifest-utility.hxx> // repository_name() @@ -273,6 +274,16 @@ namespace bpkg for (database& db: repo_configs) { + // While at it, verify that the repository information has stayed + // consistent after the potential repository removals. + // + // Note that rep_remove() doesn't remove the available packages in the + // mask mode and thus we don't verify them. + // +#ifndef NDEBUG + rep_remove_verify (db, t, false /* verify_packages */); +#endif + // Add the repository location canonical name to the database-specific // unmasked repositories or repository fragments lists. Note that // repository location is used only for tracing. diff --git a/bpkg/rep-remove.cxx b/bpkg/rep-remove.cxx index ad10f56..22702a5 100644 --- a/bpkg/rep-remove.cxx +++ b/bpkg/rep-remove.cxx @@ -178,12 +178,6 @@ namespace bpkg for (const repository::fragment_type& fr: r->fragments) rep_remove_fragment (db, t, fr.fragment.load (), mask); - // If there are no repositories stayed in the database then no repository - // fragments should stay either. - // - if (db.query_value<repository_count> () == 0) - assert (db.query_value<repository_fragment_count> () == 0); - // Unless in the mask repositories mode, cleanup the repository state if // present and there are no more repositories referring this state. // @@ -272,20 +266,6 @@ namespace bpkg // db.erase (rf); - // If there are no repository fragments stayed in the database then no - // repositories nor packages should stay either. - // - // Note that a repository is removed prior to the removal of fragments it - // contains (see rep_remove()). Also note that the packages contained in a - // repository fragment are removed, if this is the only containing - // fragment, prior to the fragment removal (see above). - // - if (db.query_value<repository_fragment_count> () == 0) - { - assert (db.query_value<repository_count> () == 0); - assert (mask || db.query_value<available_package_count> () == 0); - } - // Remove dangling complements and prerequisites. // // Prior to removing a prerequisite/complement we need to make sure it @@ -521,6 +501,10 @@ namespace bpkg text << "removed " << r.object_id (); } +#ifndef NDEBUG + rep_remove_verify (db, t); +#endif + // If the --all option is specified then no user-added repositories should // remain. // @@ -538,4 +522,35 @@ namespace bpkg return 0; } + + void + rep_remove_verify (database& db, transaction&, bool verify_packages) + { + size_t rn (db.query_value<repository_count> ()); + size_t fn (db.query_value<repository_fragment_count> ()); + + // If there are no repositories stayed in the database then no repository + // fragments should stay either. + // + assert (rn != 0 || fn == 0); + + // If there are no repository fragments stayed in the database then no + // repositories with fragments nor packages should stay either. + // + // Note that repositories may not have any fragments if they are not + // fetched yet or due to the refname exclusions in the repository URL + // fragments (see repository-types(1) for details). + // + if (fn == 0) + { + // If there are some repositories have stayed, then make sure that none + // of them have any fragments. + // + assert (rn == 0 || + db.query_value<fragment_repository_count> ("repository!=''") == 0); + + if (verify_packages) + assert (db.query_value<available_package_count> () == 0); + } + } } diff --git a/bpkg/rep-remove.hxx b/bpkg/rep-remove.hxx index 0fc82e8..94a38c6 100644 --- a/bpkg/rep-remove.hxx +++ b/bpkg/rep-remove.hxx @@ -57,6 +57,13 @@ namespace bpkg rep_remove_package_locations (database&, transaction&, const string& fragment_name); + + // Verify that after all the repository/fragment removals the repository + // information is consistent in the database (if no repositories stayed then + // no fragments stayed either, etc). + // + void + rep_remove_verify (database&, transaction&, bool verify_packages = true); } #endif // BPKG_REP_REMOVE_HXX |