From d22f466823192963c22eb8f51ae930cb5af8fa9a Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 30 Aug 2018 23:14:51 +0300 Subject: Add support for git repositories to brep-load --- tests/load/driver.cxx | 1705 +++++++++++++++------------- tests/load/git-cache/packages.manifest | 14 + tests/load/git-cache/repositories.manifest | 7 + tests/load/git-loadtab | 1 + 4 files changed, 938 insertions(+), 789 deletions(-) create mode 100644 tests/load/git-cache/packages.manifest create mode 100644 tests/load/git-cache/repositories.manifest create mode 100644 tests/load/git-loadtab (limited to 'tests/load') diff --git a/tests/load/driver.cxx b/tests/load/driver.cxx index 8e7c86e..b387b9b 100644 --- a/tests/load/driver.cxx +++ b/tests/load/driver.cxx @@ -60,29 +60,53 @@ namespace bpkg } } +static void +test_pkg_repos (const cstrings& loader_args, + const dir_path& loadtab_dir, + odb::pgsql::database&); + +static void +test_git_repos (const cstrings& loader_args, + const dir_path& loadtab_dir, + odb::pgsql::database&); + int main (int argc, char* argv[]) { auto print_usage = [argv]() { - cerr << "usage: " << argv[0] - << " [loader_options] " << endl; + cerr << "usage: " << argv[0] << " (pkg|git) " + << " [loader-options] " << endl; }; - if (argc < 3) + if (argc < 4) { print_usage (); return 1; } + int i (1); + repository_type rt; + + try + { + rt = to_repository_type (argv[i++]); + } + catch (const invalid_argument&) + { + print_usage (); + return 1; + } + + // Parse the database options. + // string user; string password; string name ("brep_package"); string host; unsigned int port (0); - int i (2); - for (; i < argc - 1; ++i) + for (++i; i < argc - 1; ++i) { string n (argv[i]); if (n == "--db-user" || n == "-u") @@ -103,32 +127,24 @@ main (int argc, char* argv[]) return 1; } - try - { - path cp (argv[argc - 1]); + dir_path loadtab_dir (argv[i]); - // Make configuration file path absolute to use it's directory as base for - // internal repositories relative local paths. - // - if (cp.relative ()) - cp.complete (); - - // Update the packages.manifest file timestamp to enforce the loader to - // update the persistent state. - // - path p (cp.directory () / dir_path ("1/stable") / packages); - char const* args[] = {"touch", p.string ().c_str (), nullptr}; - assert (process (args).wait ()); - - timestamp srt (file_mtime (p)); + // Make configuration file directory absolute to use it as base for internal + // repositories relative local paths. + // + if (loadtab_dir.relative ()) + loadtab_dir.complete (); - // Run the loader. - // - char const** ld_args (const_cast (argv + 1)); - assert (process (ld_args).wait ()); + // Extract the loader args that are common for all tests (database options, + // etc). Note that they don't contain the loadtab path and the trailing + // NULL. + // + cstrings loader_args; + for (int i (2); i != argc - 1; ++i) + loader_args.push_back (argv[i]); - // Check persistent objects validity. - // + try + { odb::pgsql::database db ( user, password, @@ -137,773 +153,868 @@ main (int argc, char* argv[]) port, "options='-c default_transaction_isolation=serializable'"); + switch (rt) { - session s; - transaction t (db.begin ()); - - assert (db.query ().size () == 7); - assert (db.query ().size () == 18); - - shared_ptr sr ( - db.load ("pkg:dev.cppget.org/stable")); - - shared_ptr mr ( - db.load ("pkg:dev.cppget.org/math")); - - shared_ptr cr ( - db.load ("pkg:dev.cppget.org/misc")); - - shared_ptr tr ( - db.load ("pkg:dev.cppget.org/testing")); - - shared_ptr gr ( - db.load ("pkg:dev.cppget.org/staging")); - - // Verify 'stable' repository. - // - assert (sr->location.canonical_name () == "pkg:dev.cppget.org/stable"); - assert (sr->location.string () == - "http://dev.cppget.org/1/stable"); - assert (sr->display_name == "stable"); - assert (sr->priority == 1); - assert (!sr->url); - assert (sr->email && *sr->email == "repoman@dev.cppget.org" && - sr->email->comment == "public mailing list"); - assert (sr->summary && - *sr->summary == "General C++ package stable repository"); - assert (sr->description && *sr->description == - "This is the awesome C++ package repository full of exciting " - "stuff."); - - dir_path srp (cp.directory () / dir_path ("1/stable")); - assert (sr->cache_location.path () == srp.normalize ()); - - assert (sr->packages_timestamp == srt); - assert (sr->repositories_timestamp == - file_mtime (sr->cache_location.path () / repositories)); - - assert (sr->internal); - assert (sr->complements.empty ()); - assert (sr->prerequisites.size () == 2); - assert (sr->prerequisites[0].load () == cr); - assert (sr->prerequisites[1].load () == mr); - - // Verify libfoo package versions. - // - // libfoo-+0-X.Y - // - shared_ptr fpvxy ( - db.load ( - package_id (package_name ("libfoo"), version ("+0-X.Y")))); - - assert (fpvxy->project == package_name ("libfoo")); - assert (fpvxy->summary == "The Foo Library"); - assert (fpvxy->tags.empty ()); - assert (!fpvxy->description); - assert (!fpvxy->url); - assert (!fpvxy->package_url); - assert (!fpvxy->email); - assert (!fpvxy->package_email); - - assert (fpvxy->internal_repository.load () == mr); - assert (fpvxy->other_repositories.empty ()); - - assert (fpvxy->priority == priority::low); - assert (fpvxy->changes.empty ()); - - assert (fpvxy->license_alternatives.size () == 1); - assert (fpvxy->license_alternatives[0].size () == 1); - assert (fpvxy->license_alternatives[0][0] == "MIT"); - - assert (fpvxy->dependencies.empty ()); - assert (fpvxy->requirements.empty ()); - - assert (check_location (fpvxy)); - - assert (fpvxy->sha256sum && *fpvxy->sha256sum == - "c994fd49f051ab7fb25f3a4e68ca878e484c5d3c2cb132b37d41224b0621b618"); - - // libfoo-1.0 - // - shared_ptr fpv1 ( - db.load ( - package_id (package_name ("libfoo"), version ("1.0")))); - - assert (fpv1->summary == "The Foo Library"); - assert (fpv1->tags.empty ()); - assert (!fpv1->description); - assert (!fpv1->url); - assert (!fpv1->package_url); - assert (!fpv1->email); - assert (!fpv1->package_email); - - assert (fpv1->internal_repository.load () == sr); - assert (fpv1->other_repositories.size () == 2); - assert (fpv1->other_repositories[0].load () == mr); - assert (fpv1->other_repositories[1].load () == cr); - - assert (fpv1->priority == priority::low); - assert (fpv1->changes.empty ()); - - assert (fpv1->license_alternatives.size () == 1); - assert (fpv1->license_alternatives[0].size () == 1); - assert (fpv1->license_alternatives[0][0] == "MIT"); - - assert (fpv1->dependencies.empty ()); - assert (fpv1->requirements.empty ()); - - assert (check_location (fpv1)); - - assert (fpv1->sha256sum && *fpv1->sha256sum == - "0df6d45a3514c6101609bdcfefe7659b5754e505c6cf6b4107141d8217bb981d"); - - // libfoo-1.2.2 - // - shared_ptr fpv2 ( - db.load ( - package_id (package_name ("libfoo"), version ("1.2.2")))); - - assert (fpv2->summary == "The Foo library"); - assert (fpv2->tags == strings ({"c++", "foo"})); - assert (!fpv2->description); - assert (fpv2->url && *fpv2->url == "http://www.example.com/foo/"); - assert (!fpv2->package_url); - assert (fpv2->email && *fpv2->email == "foo-users@example.com"); - assert (!fpv2->package_email); - - assert (fpv2->internal_repository.load () == sr); - assert (fpv2->other_repositories.empty ()); - assert (fpv2->priority == priority::low); - assert (fpv2->changes.empty ()); - - assert (fpv2->license_alternatives.size () == 1); - assert (fpv2->license_alternatives[0].size () == 1); - assert (fpv2->license_alternatives[0][0] == "MIT"); - - assert (fpv2->dependencies.size () == 2); - assert (fpv2->dependencies[0].size () == 1); - assert (fpv2->dependencies[1].size () == 1); - - auto dep = [&db] ( - const char* n, const optional& c) -> dependency + case repository_type::pkg: + { + test_pkg_repos (loader_args, loadtab_dir, db); + break; + } + case repository_type::git: { - return {lazy_shared_ptr ( - db, package_id (package_name (n), version ())), c}; - }; - - assert (fpv2->dependencies[0][0] == - dep ( - "libbar", - optional ( - dependency_constraint ( - nullopt, true, version ("2.4.0"), false)))); - - assert (fpv2->dependencies[1][0] == - dep ( - "libexp", - optional ( - dependency_constraint ( - version ("+2-1.2"), false, version ("+2-1.2"), false)))); - - assert (check_location (fpv2)); - - assert (fpv2->sha256sum && *fpv2->sha256sum == - "088068ea3d69542a153f829cf836013374763148fba0a43d8047974f58b5efd7"); - - // libfoo-1.2.2-alpha.1 - // - shared_ptr fpv2a ( - db.load ( - package_id (package_name ("libfoo"), version ("1.2.2-alpha.1")))); - - assert (fpv2a->summary == "The Foo library"); - assert (fpv2a->tags == strings ({"c++", "foo"})); - assert (!fpv2a->description); - assert (fpv2a->url && *fpv2a->url == "http://www.example.com/foo/"); - assert (!fpv2a->package_url); - assert (fpv2a->email && *fpv2a->email == "foo-users@example.com"); - assert (!fpv2a->package_email); - - assert (fpv2a->internal_repository.load () == sr); - assert (fpv2a->other_repositories.empty ()); - assert (fpv2a->priority == priority::low); - assert (fpv2a->changes.empty ()); - - assert (fpv2a->license_alternatives.size () == 1); - assert (fpv2a->license_alternatives[0].size () == 1); - assert (fpv2a->license_alternatives[0][0] == "MIT"); - - assert (fpv2a->dependencies.size () == 3); - assert (fpv2a->dependencies[0].size () == 2); - assert (fpv2a->dependencies[1].size () == 1); - assert (fpv2a->dependencies[2].size () == 2); - - assert (fpv2a->dependencies[0][0] == - dep ( - "libmisc", - optional ( - dependency_constraint ( - version ("0.1"), false, version ("2.0.0-"), true)))); - - assert (fpv2a->dependencies[0][1] == - dep ( - "libmisc", - optional ( - dependency_constraint ( - version ("2.0"), false, version ("5.0"), false)))); - - assert (fpv2a->dependencies[1][0] == - dep ( - "libgenx", - optional ( - dependency_constraint ( - version ("0.2"), true, version ("3.0"), true)))); - - assert (fpv2a->dependencies[2][0] == - dep ( - "libexpat", - optional ( - dependency_constraint ( - nullopt, true, version ("5.2"), true)))); - - assert (fpv2a->dependencies[2][1] == - dep ( - "libexpat", - optional ( - dependency_constraint ( - version ("1"), true, version ("5.1"), false)))); - - assert (fpv2a->requirements.empty ()); - - assert (check_location (fpv2a)); - - assert (fpv2a->sha256sum && *fpv2a->sha256sum == - "34fc224087bfd9212de4acfbbf5275513ebc57678b5f029546918a62c57d15cb"); - - // libfoo-1.2.3-4 - // - shared_ptr fpv3 ( - db.load ( - package_id (package_name ("libfoo"), version ("1.2.3+4")))); - - assert (fpv3->summary == "The Foo library"); - assert (fpv3->tags == strings ({"c++", "foo"})); - assert (!fpv3->description); - assert (fpv3->url && *fpv3->url == "http://www.example.com/foo/"); - assert (!fpv3->package_url); - assert (fpv3->email && *fpv3->email == "foo-users@example.com"); - assert (!fpv3->package_email); - - assert (fpv3->internal_repository.load () == sr); - assert (fpv3->other_repositories.empty ()); - assert (fpv3->priority == priority::low); - - assert (fpv3->changes.empty ()); - - assert (fpv3->license_alternatives.size () == 1); - assert (fpv3->license_alternatives[0].size () == 1); - assert (fpv3->license_alternatives[0][0] == "MIT"); - - assert (fpv3->dependencies.size () == 1); - assert (fpv3->dependencies[0].size () == 1); - assert (fpv3->dependencies[0][0] == - dep ( - "libmisc", - optional ( - dependency_constraint ( - version ("2.0.0"), false, nullopt, true)))); - - assert (check_location (fpv3)); - - assert (fpv3->sha256sum && *fpv3->sha256sum == - "204fb25edf2404e9e88e1bef8b2a444281a807d9087093147a2cc80a1ffba79a"); - - // libfoo-1.2.4 - // - shared_ptr fpv4 ( - db.load ( - package_id (package_name ("libfoo"), version ("1.2.4")))); - - assert (fpv4->summary == "The Foo Library"); - assert (fpv4->tags == strings ({"c++", "foo"})); - assert (*fpv4->description == "Very good foo library."); - assert (fpv4->url && *fpv4->url == "http://www.example.com/foo/"); - assert (!fpv4->package_url); - assert (fpv4->email && *fpv4->email == "foo-users@example.com"); - assert (!fpv4->package_email); - - assert (fpv4->internal_repository.load () == sr); - assert (fpv4->other_repositories.empty ()); - assert (fpv4->priority == priority::low); - assert (fpv4->changes == "some changes 1\n\nsome changes 2"); - - assert (fpv4->license_alternatives.size () == 1); - assert (fpv4->license_alternatives[0].comment == - "Permissive free software license."); - assert (fpv4->license_alternatives[0].size () == 1); - assert (fpv4->license_alternatives[0][0] == "MIT"); - - assert (fpv4->dependencies.size () == 1); - assert (fpv4->dependencies[0].size () == 1); - assert (fpv4->dependencies[0][0] == - dep ( - "libmisc", - optional ( - dependency_constraint ( - version ("2.0.0"), false, nullopt, true)))); - - assert (check_location (fpv4)); - - assert (fpv4->sha256sum && *fpv4->sha256sum == - "aa1606323bfc59b70de642629dc5d8318cc5348e3646f90ed89406d975db1e1d"); - - // Verify 'math' repository. - // - assert (mr->location.canonical_name () == "pkg:dev.cppget.org/math"); - assert (mr->location.string () == - "http://dev.cppget.org/1/math"); - assert (mr->display_name == "math"); - assert (mr->priority == 2); - assert (!mr->url); - assert (mr->email && *mr->email == "repoman@dev.cppget.org"); - assert (mr->summary && *mr->summary == "Math C++ package repository"); - assert (mr->description && *mr->description == - "This is the awesome C++ package repository full of remarkable " - "algorithms and\nAPIs."); - - dir_path mrp (cp.directory () / dir_path ("1/math")); - assert (mr->cache_location.path () == mrp.normalize ()); - - assert (mr->packages_timestamp == - file_mtime (mr->cache_location.path () / packages)); - - assert (mr->repositories_timestamp == - file_mtime (mr->cache_location.path () / repositories)); - - assert (mr->internal); - - assert (mr->complements.empty ()); - assert (mr->prerequisites.size () == 1); - assert (mr->prerequisites[0].load () == cr); - - // Verify libstudxml package version. - // - shared_ptr xpv ( - db.load ( - package_id (package_name ("libstudxml"), version ("1.0.0+1")))); - - assert (xpv->summary == "Modern C++ XML API"); - assert (xpv->tags == strings ({"c++", "xml", "parser", "serializer", - "pull", "streaming", "modern"})); - assert (!xpv->description); - assert (xpv->url && - *xpv->url == "http://www.codesynthesis.com/projects/libstudxml/"); - assert (!xpv->package_url); - assert (xpv->email && *xpv->email == - email ("studxml-users@codesynthesis.com", - "Public mailing list, posts by non-members " - "are allowed but moderated.")); - assert (xpv->package_email && - *xpv->package_email == email ("boris@codesynthesis.com", - "Direct email to the author.")); - - assert (xpv->internal_repository.load () == mr); - assert (xpv->other_repositories.empty ()); - assert (xpv->priority == priority::low); - assert (xpv->changes.empty ()); - - assert (xpv->license_alternatives.size () == 1); - assert (xpv->license_alternatives[0].size () == 1); - assert (xpv->license_alternatives[0][0] == "MIT"); - - assert (xpv->dependencies.size () == 2); - assert (xpv->dependencies[0].size () == 1); - assert (xpv->dependencies[0][0] == - dep ( - "libexpat", - optional ( - dependency_constraint ( - version ("2.0.0"), false, nullopt, true)))); - - assert (xpv->dependencies[1].size () == 1); - assert (xpv->dependencies[1][0] == dep ("libgenx", nullopt)); - - assert (xpv->requirements.empty ()); - - assert (check_location (xpv)); - - assert (xpv->sha256sum && *xpv->sha256sum == - "cfa4b1f89f8e903d48eff1e1d14628c32aa4d126d09b0b056d2cd80f8dc78580"); - - // Verify libfoo package versions. - // - // libfoo-1.2.4-1 - // - shared_ptr fpv5 ( - db.load ( - package_id (package_name ("libfoo"), version ("1.2.4+1")))); - - assert (fpv5->summary == "The Foo Math Library"); - assert (fpv5->tags == strings ({"c++", "foo", "math"})); - assert (*fpv5->description == - "A modern C++ library with easy to use linear algebra and lot " - "of optimization\ntools.\n\nThere are over 100 functions in " - "total with an extensive test suite. The API is\nsimilar to " - "MATLAB.\n\nUseful for conversion of research code into " - "production environments."); - - assert (fpv5->url && *fpv5->url == "http://www.example.com/foo/"); - - assert (fpv5->doc_url && *fpv5->doc_url == - "http://www.example.org/projects/libfoo/man.xhtml" && - fpv5->doc_url->comment == "Documentation page."); - - assert (fpv5->src_url && *fpv5->src_url == - "http://scm.example.com/?p=odb/libodb.git;a=tree" && - fpv5->src_url->comment == "Source tree url."); - - assert (fpv5->package_url && - *fpv5->package_url == "http://www.example.com/foo/pack"); - assert (fpv5->email && *fpv5->email == "foo-users@example.com"); - assert (fpv5->package_email && - *fpv5->package_email == "pack@example.com"); - - assert (fpv5->internal_repository.load () == mr); - assert (fpv5->other_repositories.size () == 1); - assert (fpv5->other_repositories[0].load () == cr); - - assert (fpv5->priority == priority::high); - assert (fpv5->priority.comment == - "Critical bug fixes, performance improvement."); - - const char ch[] = R"DLM(1.2.4+1 + test_git_repos (loader_args, loadtab_dir, db); + break; + } + default: + { + print_usage (); + return 1; + } + } + } + // Fully qualified to avoid ambiguity with odb exception. + // + catch (const std::exception& e) + { + cerr << e << endl; + return 1; + } + + return 0; +} + +static inline dependency +dep (const char* n, optional c) +{ + return dependency {package_name (n), move (c), nullptr}; +} + +static void +test_git_repos (const cstrings& loader_args, + const dir_path& loadtab_dir, + odb::pgsql::database& db) +{ + path loadtab (loadtab_dir / "git-loadtab"); + + cstrings args (loader_args); + args.push_back ("--force"); + args.push_back ("--shallow"); + args.push_back (loadtab.string ().c_str ()); + args.push_back (nullptr); + + { + // Run the loader. + // + assert (process (args.data ()).wait ()); + + // Check persistent objects. + // + session s; + transaction t (db.begin ()); + + assert (db.query ().size () == 1); + assert (db.query ().size () == 1); + + // Verify 'foo' repository. + // + shared_ptr r ( + db.load ("git:example.com/foo#master")); + + assert (r->location.string () == "https://git.example.com/foo.git#master"); + assert (r->summary && *r->summary == "foo project repository"); + + // Verify libfoo package version. + // + // libfoo-1.0 + // + shared_ptr p ( + db.load ( + package_id (package_name ("libfoo"), version ("1.0")))); + + assert (p->fragment && + *p->fragment == "0f50af28d1cfb0c22f5b88e2bf674ab732e058d9"); + + assert (p->dependencies.size () == 1); + assert (p->dependencies[0].size () == 1); + + assert (p->dependencies[0][0] == + dep ("libmisc", + dependency_constraint ( + version ("1.0"), false, version ("1.0"), false))); + + t.commit (); + } +} + +static void +test_pkg_repos (const cstrings& loader_args, + const dir_path& loadtab_dir, + odb::pgsql::database& db) +{ + path p (loadtab_dir / dir_path ("1/stable") / packages); + timestamp srt (file_mtime (p)); + + path loadtab (loadtab_dir / "loadtab"); + + // Load the repositories and check persistent objects validity. + // + { + cstrings args (loader_args); + args.push_back ("--force"); + args.push_back (loadtab.string ().c_str ()); + args.push_back (nullptr); + + // Run the loader. + // + assert (process (args.data ()).wait ()); + + // Check persistent objects. + // + session s; + transaction t (db.begin ()); + + assert (db.query ().size () == 7); + assert (db.query ().size () == 18); + + shared_ptr sr ( + db.load ("pkg:dev.cppget.org/stable")); + + shared_ptr mr ( + db.load ("pkg:dev.cppget.org/math")); + + shared_ptr cr ( + db.load ("pkg:dev.cppget.org/misc")); + + shared_ptr tr ( + db.load ("pkg:dev.cppget.org/testing")); + + shared_ptr gr ( + db.load ("pkg:dev.cppget.org/staging")); + + // Verify 'stable' repository. + // + assert (sr->location.canonical_name () == "pkg:dev.cppget.org/stable"); + assert (sr->location.string () == + "http://dev.cppget.org/1/stable"); + assert (sr->display_name == "stable"); + assert (sr->priority == 1); + assert (!sr->interface_url); + assert (sr->email && *sr->email == "repoman@dev.cppget.org" && + sr->email->comment == "public mailing list"); + assert (sr->summary && + *sr->summary == "General C++ package stable repository"); + assert (sr->description && *sr->description == + "This is the awesome C++ package repository full of exciting " + "stuff."); + + dir_path srp (loadtab.directory () / dir_path ("1/stable")); + assert (sr->cache_location.path () == srp.normalize ()); + + assert (sr->packages_timestamp == srt); + assert (sr->repositories_timestamp == + file_mtime (sr->cache_location.path () / repositories)); + + assert (sr->internal); + assert (sr->complements.empty ()); + assert (sr->prerequisites.size () == 2); + assert (sr->prerequisites[0].load () == cr); + assert (sr->prerequisites[1].load () == mr); + + // Verify libfoo package versions. + // + // libfoo-+0-X.Y + // + shared_ptr fpvxy ( + db.load ( + package_id (package_name ("libfoo"), version ("+0-X.Y")))); + + assert (fpvxy->project == package_name ("libfoo")); + assert (fpvxy->summary == "The Foo Library"); + assert (fpvxy->tags.empty ()); + assert (!fpvxy->description); + assert (!fpvxy->url); + assert (!fpvxy->package_url); + assert (!fpvxy->email); + assert (!fpvxy->package_email); + + assert (fpvxy->internal_repository.load () == mr); + assert (fpvxy->other_repositories.empty ()); + + assert (fpvxy->priority == priority::low); + assert (fpvxy->changes.empty ()); + + assert (fpvxy->license_alternatives.size () == 1); + assert (fpvxy->license_alternatives[0].size () == 1); + assert (fpvxy->license_alternatives[0][0] == "MIT"); + + assert (fpvxy->dependencies.empty ()); + assert (fpvxy->requirements.empty ()); + + assert (check_location (fpvxy)); + + assert (fpvxy->sha256sum && *fpvxy->sha256sum == + "c994fd49f051ab7fb25f3a4e68ca878e484c5d3c2cb132b37d41224b0621b618"); + + // libfoo-1.0 + // + shared_ptr fpv1 ( + db.load ( + package_id (package_name ("libfoo"), version ("1.0")))); + + assert (fpv1->summary == "The Foo Library"); + assert (fpv1->tags.empty ()); + assert (!fpv1->description); + assert (!fpv1->url); + assert (!fpv1->package_url); + assert (!fpv1->email); + assert (!fpv1->package_email); + + assert (fpv1->internal_repository.load () == sr); + assert (fpv1->other_repositories.size () == 2); + assert (fpv1->other_repositories[0].load () == mr); + assert (fpv1->other_repositories[1].load () == cr); + + assert (fpv1->priority == priority::low); + assert (fpv1->changes.empty ()); + + assert (fpv1->license_alternatives.size () == 1); + assert (fpv1->license_alternatives[0].size () == 1); + assert (fpv1->license_alternatives[0][0] == "MIT"); + + assert (fpv1->dependencies.empty ()); + assert (fpv1->requirements.empty ()); + + assert (check_location (fpv1)); + + assert (fpv1->sha256sum && *fpv1->sha256sum == + "0df6d45a3514c6101609bdcfefe7659b5754e505c6cf6b4107141d8217bb981d"); + + // libfoo-1.2.2 + // + shared_ptr fpv2 ( + db.load ( + package_id (package_name ("libfoo"), version ("1.2.2")))); + + assert (fpv2->summary == "The Foo library"); + assert (fpv2->tags == strings ({"c++", "foo"})); + assert (!fpv2->description); + assert (fpv2->url && *fpv2->url == "http://www.example.com/foo/"); + assert (!fpv2->package_url); + assert (fpv2->email && *fpv2->email == "foo-users@example.com"); + assert (!fpv2->package_email); + + assert (fpv2->internal_repository.load () == sr); + assert (fpv2->other_repositories.empty ()); + assert (fpv2->priority == priority::low); + assert (fpv2->changes.empty ()); + + assert (fpv2->license_alternatives.size () == 1); + assert (fpv2->license_alternatives[0].size () == 1); + assert (fpv2->license_alternatives[0][0] == "MIT"); + + assert (fpv2->dependencies.size () == 2); + assert (fpv2->dependencies[0].size () == 1); + assert (fpv2->dependencies[1].size () == 1); + + assert (fpv2->dependencies[0][0] == + dep ("libbar", + dependency_constraint ( + nullopt, true, version ("2.4.0"), false))); + + assert (fpv2->dependencies[1][0] == + dep ("libexp", + dependency_constraint ( + version ("+2-1.2"), false, version ("+2-1.2"), false))); + + assert (check_location (fpv2)); + + assert (fpv2->sha256sum && *fpv2->sha256sum == + "088068ea3d69542a153f829cf836013374763148fba0a43d8047974f58b5efd7"); + + // libfoo-1.2.2-alpha.1 + // + shared_ptr fpv2a ( + db.load ( + package_id (package_name ("libfoo"), version ("1.2.2-alpha.1")))); + + assert (fpv2a->summary == "The Foo library"); + assert (fpv2a->tags == strings ({"c++", "foo"})); + assert (!fpv2a->description); + assert (fpv2a->url && *fpv2a->url == "http://www.example.com/foo/"); + assert (!fpv2a->package_url); + assert (fpv2a->email && *fpv2a->email == "foo-users@example.com"); + assert (!fpv2a->package_email); + + assert (fpv2a->internal_repository.load () == sr); + assert (fpv2a->other_repositories.empty ()); + assert (fpv2a->priority == priority::low); + assert (fpv2a->changes.empty ()); + + assert (fpv2a->license_alternatives.size () == 1); + assert (fpv2a->license_alternatives[0].size () == 1); + assert (fpv2a->license_alternatives[0][0] == "MIT"); + + assert (fpv2a->dependencies.size () == 3); + assert (fpv2a->dependencies[0].size () == 2); + assert (fpv2a->dependencies[1].size () == 1); + assert (fpv2a->dependencies[2].size () == 2); + + assert (fpv2a->dependencies[0][0] == + dep ("libmisc", + dependency_constraint ( + version ("0.1"), false, version ("2.0.0-"), true))); + + assert (fpv2a->dependencies[0][1] == + dep ("libmisc", + dependency_constraint ( + version ("2.0"), false, version ("5.0"), false))); + + assert (fpv2a->dependencies[1][0] == + dep ("libgenx", + dependency_constraint ( + version ("0.2"), true, version ("3.0"), true))); + + assert (fpv2a->dependencies[2][0] == + dep ("libexpat", + dependency_constraint ( + nullopt, true, version ("5.2"), true))); + + assert (fpv2a->dependencies[2][1] == + dep ("libexpat", + dependency_constraint ( + version ("1"), true, version ("5.1"), false))); + + assert (fpv2a->requirements.empty ()); + + assert (check_location (fpv2a)); + + assert (fpv2a->sha256sum && *fpv2a->sha256sum == + "34fc224087bfd9212de4acfbbf5275513ebc57678b5f029546918a62c57d15cb"); + + // libfoo-1.2.3-4 + // + shared_ptr fpv3 ( + db.load ( + package_id (package_name ("libfoo"), version ("1.2.3+4")))); + + assert (fpv3->summary == "The Foo library"); + assert (fpv3->tags == strings ({"c++", "foo"})); + assert (!fpv3->description); + assert (fpv3->url && *fpv3->url == "http://www.example.com/foo/"); + assert (!fpv3->package_url); + assert (fpv3->email && *fpv3->email == "foo-users@example.com"); + assert (!fpv3->package_email); + + assert (fpv3->internal_repository.load () == sr); + assert (fpv3->other_repositories.empty ()); + assert (fpv3->priority == priority::low); + + assert (fpv3->changes.empty ()); + + assert (fpv3->license_alternatives.size () == 1); + assert (fpv3->license_alternatives[0].size () == 1); + assert (fpv3->license_alternatives[0][0] == "MIT"); + + assert (fpv3->dependencies.size () == 1); + assert (fpv3->dependencies[0].size () == 1); + assert (fpv3->dependencies[0][0] == + dep ("libmisc", + dependency_constraint ( + version ("2.0.0"), false, nullopt, true))); + + assert (check_location (fpv3)); + + assert (fpv3->sha256sum && *fpv3->sha256sum == + "204fb25edf2404e9e88e1bef8b2a444281a807d9087093147a2cc80a1ffba79a"); + + // libfoo-1.2.4 + // + shared_ptr fpv4 ( + db.load ( + package_id (package_name ("libfoo"), version ("1.2.4")))); + + assert (fpv4->summary == "The Foo Library"); + assert (fpv4->tags == strings ({"c++", "foo"})); + assert (*fpv4->description == "Very good foo library."); + assert (fpv4->url && *fpv4->url == "http://www.example.com/foo/"); + assert (!fpv4->package_url); + assert (fpv4->email && *fpv4->email == "foo-users@example.com"); + assert (!fpv4->package_email); + + assert (fpv4->internal_repository.load () == sr); + assert (fpv4->other_repositories.empty ()); + assert (fpv4->priority == priority::low); + assert (fpv4->changes == "some changes 1\n\nsome changes 2"); + + assert (fpv4->license_alternatives.size () == 1); + assert (fpv4->license_alternatives[0].comment == + "Permissive free software license."); + assert (fpv4->license_alternatives[0].size () == 1); + assert (fpv4->license_alternatives[0][0] == "MIT"); + + assert (fpv4->dependencies.size () == 1); + assert (fpv4->dependencies[0].size () == 1); + assert (fpv4->dependencies[0][0] == + dep ("libmisc", + dependency_constraint ( + version ("2.0.0"), false, nullopt, true))); + + assert (check_location (fpv4)); + + assert (fpv4->sha256sum && *fpv4->sha256sum == + "aa1606323bfc59b70de642629dc5d8318cc5348e3646f90ed89406d975db1e1d"); + + // Verify 'math' repository. + // + assert (mr->location.canonical_name () == "pkg:dev.cppget.org/math"); + assert (mr->location.string () == + "http://dev.cppget.org/1/math"); + assert (mr->display_name == "math"); + assert (mr->priority == 2); + assert (!mr->interface_url); + assert (mr->email && *mr->email == "repoman@dev.cppget.org"); + assert (mr->summary && *mr->summary == "Math C++ package repository"); + assert (mr->description && *mr->description == + "This is the awesome C++ package repository full of remarkable " + "algorithms and\nAPIs."); + + dir_path mrp (loadtab.directory () / dir_path ("1/math")); + assert (mr->cache_location.path () == mrp.normalize ()); + + assert (mr->packages_timestamp == + file_mtime (mr->cache_location.path () / packages)); + + assert (mr->repositories_timestamp == + file_mtime (mr->cache_location.path () / repositories)); + + assert (mr->internal); + + assert (mr->complements.empty ()); + assert (mr->prerequisites.size () == 1); + assert (mr->prerequisites[0].load () == cr); + + // Verify libstudxml package version. + // + shared_ptr xpv ( + db.load ( + package_id (package_name ("libstudxml"), version ("1.0.0+1")))); + + assert (xpv->summary == "Modern C++ XML API"); + assert (xpv->tags == strings ({"c++", "xml", "parser", "serializer", + "pull", "streaming", "modern"})); + assert (!xpv->description); + assert (xpv->url && + *xpv->url == "http://www.codesynthesis.com/projects/libstudxml/"); + assert (!xpv->package_url); + assert (xpv->email && *xpv->email == + email ("studxml-users@codesynthesis.com", + "Public mailing list, posts by non-members " + "are allowed but moderated.")); + assert (xpv->package_email && + *xpv->package_email == email ("boris@codesynthesis.com", + "Direct email to the author.")); + + assert (xpv->internal_repository.load () == mr); + assert (xpv->other_repositories.empty ()); + assert (xpv->priority == priority::low); + assert (xpv->changes.empty ()); + + assert (xpv->license_alternatives.size () == 1); + assert (xpv->license_alternatives[0].size () == 1); + assert (xpv->license_alternatives[0][0] == "MIT"); + + assert (xpv->dependencies.size () == 2); + assert (xpv->dependencies[0].size () == 1); + assert (xpv->dependencies[0][0] == + dep ("libexpat", + dependency_constraint ( + version ("2.0.0"), false, nullopt, true))); + + assert (xpv->dependencies[1].size () == 1); + assert (xpv->dependencies[1][0] == dep ("libgenx", nullopt)); + + assert (xpv->requirements.empty ()); + + assert (check_location (xpv)); + + assert (xpv->sha256sum && *xpv->sha256sum == + "cfa4b1f89f8e903d48eff1e1d14628c32aa4d126d09b0b056d2cd80f8dc78580"); + + // Verify libfoo package versions. + // + // libfoo-1.2.4-1 + // + shared_ptr fpv5 ( + db.load ( + package_id (package_name ("libfoo"), version ("1.2.4+1")))); + + assert (fpv5->summary == "The Foo Math Library"); + assert (fpv5->tags == strings ({"c++", "foo", "math"})); + assert (*fpv5->description == + "A modern C++ library with easy to use linear algebra and lot " + "of optimization\ntools.\n\nThere are over 100 functions in " + "total with an extensive test suite. The API is\nsimilar to " + "MATLAB.\n\nUseful for conversion of research code into " + "production environments."); + + assert (fpv5->url && *fpv5->url == "http://www.example.com/foo/"); + + assert (fpv5->doc_url && *fpv5->doc_url == + "http://www.example.org/projects/libfoo/man.xhtml" && + fpv5->doc_url->comment == "Documentation page."); + + assert (fpv5->src_url && *fpv5->src_url == + "http://scm.example.com/?p=odb/libodb.git;a=tree" && + fpv5->src_url->comment == "Source tree url."); + + assert (fpv5->package_url && + *fpv5->package_url == "http://www.example.com/foo/pack"); + assert (fpv5->email && *fpv5->email == "foo-users@example.com"); + assert (fpv5->package_email && + *fpv5->package_email == "pack@example.com"); + + assert (fpv5->internal_repository.load () == mr); + assert (fpv5->other_repositories.size () == 1); + assert (fpv5->other_repositories[0].load () == cr); + + assert (fpv5->priority == priority::high); + assert (fpv5->priority.comment == + "Critical bug fixes, performance improvement."); + + const char ch[] = R"DLM(1.2.4+1 * applied patch for critical bug-219 * regenerated documentation 1.2.4 * test suite extended significantly)DLM"; - assert (fpv5->changes == ch); - - assert (fpv5->license_alternatives.size () == 2); - assert (fpv5->license_alternatives[0].comment == - "If using with GNU TLS."); - assert (fpv5->license_alternatives[0].size () == 2); - assert (fpv5->license_alternatives[0][0] == "LGPLv2"); - assert (fpv5->license_alternatives[0][1] == "MIT"); - assert (fpv5->license_alternatives[1].comment == - "If using with OpenSSL."); - assert (fpv5->license_alternatives[1].size () == 1); - assert (fpv5->license_alternatives[1][0] == "BSD"); - - assert (fpv5->dependencies.size () == 3); - assert (fpv5->dependencies[0].size () == 2); - assert (fpv5->dependencies[0].comment == - "Crashes with 1.1.0-2.3.0."); - - assert (fpv5->dependencies[0][0] == - dep ( - "libmisc", - optional ( - dependency_constraint ( - nullopt, true, version ("1.1"), true)))); - - assert (fpv5->dependencies[0][1] == - dep ( - "libmisc", - optional ( - dependency_constraint ( - version ("2.3.0"), true, nullopt, true)))); - - assert (fpv5->dependencies[1].size () == 1); - assert (fpv5->dependencies[1].comment.empty ()); - - assert (fpv5->dependencies[1][0] == - dep ("libexp", - optional ( - dependency_constraint ( - version ("1.0"), false, nullopt, true)))); - - assert (fpv5->dependencies[2].size () == 2); - assert (fpv5->dependencies[2].comment == "The newer the better."); - - assert (fpv5->dependencies[2][0] == dep ("libstudxml", nullopt)); - assert (fpv5->dependencies[2][1] == dep ("libexpat", nullopt)); - - requirements& fpvr5 (fpv5->requirements); - assert (fpvr5.size () == 4); - - assert (fpvr5[0] == strings ({"linux", "windows", "macosx"})); - assert (!fpvr5[0].conditional); - assert (fpvr5[0].comment == "Symbian support is coming."); - - assert (fpvr5[1] == strings ({"c++11"})); - assert (!fpvr5[1].conditional); - assert (fpvr5[1].comment.empty ()); - - assert (fpvr5[2].empty ()); - assert (fpvr5[2].conditional); - assert (fpvr5[2].comment == - "libc++ standard library if using Clang on Mac OS X."); - - assert (fpvr5[3] == strings ({"vc++ >= 12.0"})); - assert (fpvr5[3].conditional); - assert (fpvr5[3].comment == "Only if using VC++ on Windows."); - - assert (check_location (fpv5)); - - assert (fpv5->sha256sum && *fpv5->sha256sum == - "c5e593d8efdc34a258f8c0b8cc352dc7193ea4a1d666bcf8d48708c7dd82d0d6"); - - // Verify libexp package version. - // - // libexp-+2-1.2 - // - shared_ptr epv ( - db.load ( - package_id (package_name ("libexp"), version ("+2-1.2+1")))); - - assert (epv->project == "mathLab"); - assert (epv->summary == "The exponent"); - assert (epv->tags == strings ({"mathlab", "c++", "exponent"})); - assert (epv->description && *epv->description == - "The exponent math function."); - assert (epv->url && *epv->url == "http://www.exp.com"); - assert (!epv->package_url); - assert (epv->email && *epv->email == email ("users@exp.com")); - assert (!epv->package_email); - assert (epv->build_email && *epv->build_email == "builds@exp.com"); - - assert (epv->internal_repository.load () == mr); - assert (epv->other_repositories.empty ()); - assert (epv->priority == priority (priority::low)); - assert (epv->changes.empty ()); - - assert (epv->license_alternatives.size () == 1); - assert (epv->license_alternatives[0].size () == 1); - assert (epv->license_alternatives[0][0] == "MIT"); - - assert (epv->dependencies.size () == 2); - assert (epv->dependencies[0].size () == 1); - assert (epv->dependencies[0][0] == dep ("libmisc", nullopt)); - - assert (epv->dependencies[1].size () == 1); - assert (epv->dependencies[1][0] == - dep ("libpq", - optional ( - dependency_constraint ( - version ("9.0.0"), false, nullopt, true)))); - - assert (epv->requirements.empty ()); - - db.load (*epv, epv->build_section); - - assert ( - epv->build_constraints == - build_constraints ({ + assert (fpv5->changes == ch); + + assert (fpv5->license_alternatives.size () == 2); + assert (fpv5->license_alternatives[0].comment == + "If using with GNU TLS."); + assert (fpv5->license_alternatives[0].size () == 2); + assert (fpv5->license_alternatives[0][0] == "LGPLv2"); + assert (fpv5->license_alternatives[0][1] == "MIT"); + assert (fpv5->license_alternatives[1].comment == + "If using with OpenSSL."); + assert (fpv5->license_alternatives[1].size () == 1); + assert (fpv5->license_alternatives[1][0] == "BSD"); + + assert (fpv5->dependencies.size () == 3); + assert (fpv5->dependencies[0].size () == 2); + assert (fpv5->dependencies[0].comment == + "Crashes with 1.1.0-2.3.0."); + + assert (fpv5->dependencies[0][0] == + dep ("libmisc", + dependency_constraint ( + nullopt, true, version ("1.1"), true))); + + assert (fpv5->dependencies[0][1] == + dep ("libmisc", + dependency_constraint ( + version ("2.3.0"), true, nullopt, true))); + + assert (fpv5->dependencies[1].size () == 1); + assert (fpv5->dependencies[1].comment.empty ()); + + assert (fpv5->dependencies[1][0] == + dep ("libexp", + dependency_constraint ( + version ("1.0"), false, nullopt, true))); + + assert (fpv5->dependencies[2].size () == 2); + assert (fpv5->dependencies[2].comment == "The newer the better."); + + assert (fpv5->dependencies[2][0] == dep ("libstudxml", nullopt)); + assert (fpv5->dependencies[2][1] == dep ("libexpat", nullopt)); + + requirements& fpvr5 (fpv5->requirements); + assert (fpvr5.size () == 4); + + assert (fpvr5[0] == strings ({"linux", "windows", "macosx"})); + assert (!fpvr5[0].conditional); + assert (fpvr5[0].comment == "Symbian support is coming."); + + assert (fpvr5[1] == strings ({"c++11"})); + assert (!fpvr5[1].conditional); + assert (fpvr5[1].comment.empty ()); + + assert (fpvr5[2].empty ()); + assert (fpvr5[2].conditional); + assert (fpvr5[2].comment == + "libc++ standard library if using Clang on Mac OS X."); + + assert (fpvr5[3] == strings ({"vc++ >= 12.0"})); + assert (fpvr5[3].conditional); + assert (fpvr5[3].comment == "Only if using VC++ on Windows."); + + assert (check_location (fpv5)); + + assert (fpv5->sha256sum && *fpv5->sha256sum == + "c5e593d8efdc34a258f8c0b8cc352dc7193ea4a1d666bcf8d48708c7dd82d0d6"); + + // Verify libexp package version. + // + // libexp-+2-1.2 + // + shared_ptr epv ( + db.load ( + package_id (package_name ("libexp"), version ("+2-1.2+1")))); + + assert (epv->project == "mathLab"); + assert (epv->summary == "The exponent"); + assert (epv->tags == strings ({"mathlab", "c++", "exponent"})); + assert (epv->description && *epv->description == + "The exponent math function."); + assert (epv->url && *epv->url == "http://www.exp.com"); + assert (!epv->package_url); + assert (epv->email && *epv->email == email ("users@exp.com")); + assert (!epv->package_email); + assert (epv->build_email && *epv->build_email == "builds@exp.com"); + + assert (epv->internal_repository.load () == mr); + assert (epv->other_repositories.empty ()); + assert (epv->priority == priority (priority::low)); + assert (epv->changes.empty ()); + + assert (epv->license_alternatives.size () == 1); + assert (epv->license_alternatives[0].size () == 1); + assert (epv->license_alternatives[0][0] == "MIT"); + + assert (epv->dependencies.size () == 2); + assert (epv->dependencies[0].size () == 1); + assert (epv->dependencies[0][0] == dep ("libmisc", nullopt)); + + assert (epv->dependencies[1].size () == 1); + assert (epv->dependencies[1][0] == + dep ("libpq", + dependency_constraint ( + version ("9.0.0"), false, nullopt, true))); + + assert (epv->requirements.empty ()); + + db.load (*epv, epv->build_section); + + assert ( + epv->build_constraints == + build_constraints ({ build_constraint (true, "*", nullopt, "Only supported on Linux."), - build_constraint (false, "linux*", nullopt, "")})); - - assert (check_location (epv)); - assert (epv->sha256sum && *epv->sha256sum == - "bc68940a1b3b7e345cbceac35d308b4e04b304f49ff2087340949f2879709967"); - - // Verify libpq package version. - // - // libpq-0 - // - shared_ptr qpv ( - db.load (package_id (package_name ("libpq"), version ("0")))); - - assert (qpv->summary == "PostgreSQL C API client library"); - - // Verify 'misc' repository. - // - assert (cr->location.canonical_name () == "pkg:dev.cppget.org/misc"); - assert (cr->location.string () == - "http://dev.cppget.org/1/misc"); - assert (cr->display_name.empty ()); - assert (cr->priority == 0); - assert (cr->url && *cr->url == "http://misc.cppget.org/"); - assert (!cr->email); - assert (!cr->summary); - assert (!cr->description); - - dir_path crp (cp.directory () / dir_path ("1/misc")); - assert (cr->cache_location.path () == crp.normalize ()); - - assert (cr->packages_timestamp == - file_mtime (cr->cache_location.path () / packages)); - - assert (cr->repositories_timestamp == - file_mtime (cr->cache_location.path () / repositories)); - - assert (!cr->internal); - assert (cr->prerequisites.empty ()); - assert (cr->complements.size () == 1); - assert (cr->complements[0].load () == tr); - - // Verify libbar package version. - // - // libbar-2.4.0+3 - // - shared_ptr bpv ( - db.load ( - package_id (package_name ("libbar"), version ("2.4.0+3")))); - - assert (check_external (*bpv)); - assert (bpv->other_repositories.size () == 1); - assert (bpv->other_repositories[0].load () == cr); - assert (check_location (bpv)); - - // Verify libfoo package versions. - // - // libfoo-0.1 - // - shared_ptr fpv0 ( - db.load ( - package_id (package_name ("libfoo"), version ("0.1")))); - - assert (check_external (*fpv0)); - assert (fpv0->other_repositories.size () == 1); - assert (fpv0->other_repositories[0].load () == cr); - assert (check_location (fpv0)); - - // libfoo-1.2.4-2 - // - shared_ptr fpv6 ( - db.load ( - package_id (package_name ("libfoo"), version ("1.2.4+2")))); - - assert (check_external (*fpv6)); - assert (fpv6->other_repositories.size () == 1); - assert (fpv6->other_repositories[0].load () == cr); - assert (check_location (fpv6)); - - // Verify 'testing' repository. - // - assert (tr->location.canonical_name () == "pkg:dev.cppget.org/testing"); - assert (tr->location.string () == - "http://dev.cppget.org/1/testing"); - assert (tr->display_name.empty ()); - assert (tr->priority == 0); - assert (tr->url && *tr->url == "http://test.cppget.org/hello/"); - assert (!tr->email); - assert (!tr->summary); - assert (!tr->description); - - dir_path trp (cp.directory () / dir_path ("1/testing")); - assert (tr->cache_location.path () == trp.normalize ()); - - assert (tr->packages_timestamp == - file_mtime (tr->cache_location.path () / packages)); - - assert (tr->repositories_timestamp == - file_mtime (tr->cache_location.path () / repositories)); - - assert (!tr->internal); - assert (tr->prerequisites.empty ()); - assert (tr->complements.size () == 1); - assert (tr->complements[0].load () == gr); - - // Verify libmisc package version. - // - // libmisc-2.4.0 - // - shared_ptr mpv0 ( - db.load ( - package_id (package_name ("libmisc"), version ("2.4.0")))); - - assert (check_external (*mpv0)); - assert (mpv0->other_repositories.size () == 1); - assert (mpv0->other_repositories[0].load () == tr); - assert (check_location (mpv0)); - - // libmisc-2.3.0+1 - // - shared_ptr mpv1 ( - db.load ( - package_id (package_name ("libmisc"), version ("2.3.0+1")))); - - assert (check_external (*mpv1)); - assert (mpv1->other_repositories.size () == 1); - assert (mpv1->other_repositories[0].load () == tr); - assert (check_location (mpv1)); - - // Verify 'staging' repository. - // - assert (gr->location.canonical_name () == "pkg:dev.cppget.org/staging"); - assert (gr->location.string () == - "http://dev.cppget.org/1/staging"); - assert (gr->display_name.empty ()); - assert (gr->priority == 0); - assert (gr->url && *gr->url == "http://dev.cppget.org/"); - assert (!gr->email); - assert (!gr->summary); - assert (!gr->description); - - dir_path grp (cp.directory () / dir_path ("1/staging")); - assert (gr->cache_location.path () == grp.normalize ()); - - assert (gr->packages_timestamp == - file_mtime (gr->cache_location.path () / packages)); - - assert (gr->repositories_timestamp == - file_mtime (gr->cache_location.path () / repositories)); - - assert (!gr->internal); - assert (gr->prerequisites.empty ()); - assert (gr->complements.empty ()); - - // Verify libexpat package version. - // - // libexpat-5.1 - // - shared_ptr tpv ( - db.load ( - package_id (package_name ("libexpat"), version ("5.1")))); - - assert (check_external (*tpv)); - assert (tpv->other_repositories.size () == 1); - assert (tpv->other_repositories[0].load () == gr); - assert (check_location (tpv)); - - // Verify libgenx package version. - // - // libgenx-1.0 - // - shared_ptr gpv ( - db.load ( - package_id (package_name ("libgenx"), version ("1.0")))); - - assert (check_external (*gpv)); - assert (gpv->other_repositories.size () == 1); - assert (gpv->other_repositories[0].load () == gr); - assert (check_location (gpv)); - - // Verify libmisc package version. - // - // libmisc-1.0 - // - shared_ptr mpv2 ( - db.load ( - package_id (package_name ("libmisc"), version ("1.0")))); - - assert (check_external (*mpv2)); - assert (mpv2->other_repositories.size () == 1); - assert (mpv2->other_repositories[0].load () == gr); - assert (check_location (mpv2)); - - // Change package summary, update the object persistent state, rerun - // loader and ensure the model were not rebuilt. - // - bpv->summary = "test"; - db.update (bpv); - - t.commit (); - } + build_constraint (false, "linux*", nullopt, "")})); + + assert (check_location (epv)); + assert (epv->sha256sum && *epv->sha256sum == + "bc68940a1b3b7e345cbceac35d308b4e04b304f49ff2087340949f2879709967"); + + // Verify libpq package version. + // + // libpq-0 + // + shared_ptr qpv ( + db.load (package_id (package_name ("libpq"), version ("0")))); + + assert (qpv->summary == "PostgreSQL C API client library"); + + // Verify 'misc' repository. + // + assert (cr->location.canonical_name () == "pkg:dev.cppget.org/misc"); + assert (cr->location.string () == + "http://dev.cppget.org/1/misc"); + assert (cr->display_name.empty ()); + assert (cr->priority == 0); + assert (cr->interface_url && + *cr->interface_url == "http://misc.cppget.org/"); + assert (!cr->email); + assert (!cr->summary); + assert (!cr->description); + + dir_path crp (loadtab.directory () / dir_path ("1/misc")); + assert (cr->cache_location.path () == crp.normalize ()); + + assert (cr->packages_timestamp == + file_mtime (cr->cache_location.path () / packages)); + + assert (cr->repositories_timestamp == + file_mtime (cr->cache_location.path () / repositories)); + + assert (!cr->internal); + assert (cr->prerequisites.empty ()); + assert (cr->complements.size () == 1); + assert (cr->complements[0].load () == tr); + + // Verify libbar package version. + // + // libbar-2.4.0+3 + // + shared_ptr bpv ( + db.load ( + package_id (package_name ("libbar"), version ("2.4.0+3")))); + + assert (check_external (*bpv)); + assert (bpv->other_repositories.size () == 1); + assert (bpv->other_repositories[0].load () == cr); + assert (check_location (bpv)); + + // Verify libfoo package versions. + // + // libfoo-0.1 + // + shared_ptr fpv0 ( + db.load ( + package_id (package_name ("libfoo"), version ("0.1")))); + + assert (check_external (*fpv0)); + assert (fpv0->other_repositories.size () == 1); + assert (fpv0->other_repositories[0].load () == cr); + assert (check_location (fpv0)); + + // libfoo-1.2.4-2 + // + shared_ptr fpv6 ( + db.load ( + package_id (package_name ("libfoo"), version ("1.2.4+2")))); + + assert (check_external (*fpv6)); + assert (fpv6->other_repositories.size () == 1); + assert (fpv6->other_repositories[0].load () == cr); + assert (check_location (fpv6)); + + // Verify 'testing' repository. + // + assert (tr->location.canonical_name () == "pkg:dev.cppget.org/testing"); + assert (tr->location.string () == + "http://dev.cppget.org/1/testing"); + assert (tr->display_name.empty ()); + assert (tr->priority == 0); + assert (tr->interface_url && + *tr->interface_url == "http://test.cppget.org/hello/"); + assert (!tr->email); + assert (!tr->summary); + assert (!tr->description); + + dir_path trp (loadtab.directory () / dir_path ("1/testing")); + assert (tr->cache_location.path () == trp.normalize ()); + + assert (tr->packages_timestamp == + file_mtime (tr->cache_location.path () / packages)); + + assert (tr->repositories_timestamp == + file_mtime (tr->cache_location.path () / repositories)); + + assert (!tr->internal); + assert (tr->prerequisites.empty ()); + assert (tr->complements.size () == 1); + assert (tr->complements[0].load () == gr); + + // Verify libmisc package version. + // + // libmisc-2.4.0 + // + shared_ptr mpv0 ( + db.load ( + package_id (package_name ("libmisc"), version ("2.4.0")))); + + assert (check_external (*mpv0)); + assert (mpv0->other_repositories.size () == 1); + assert (mpv0->other_repositories[0].load () == tr); + assert (check_location (mpv0)); + + // libmisc-2.3.0+1 + // + shared_ptr mpv1 ( + db.load ( + package_id (package_name ("libmisc"), version ("2.3.0+1")))); + + assert (check_external (*mpv1)); + assert (mpv1->other_repositories.size () == 1); + assert (mpv1->other_repositories[0].load () == tr); + assert (check_location (mpv1)); + + // Verify 'staging' repository. + // + assert (gr->location.canonical_name () == "pkg:dev.cppget.org/staging"); + assert (gr->location.string () == + "http://dev.cppget.org/1/staging"); + assert (gr->display_name.empty ()); + assert (gr->priority == 0); + assert (gr->interface_url && + *gr->interface_url == "http://dev.cppget.org/"); + assert (!gr->email); + assert (!gr->summary); + assert (!gr->description); + + dir_path grp (loadtab.directory () / dir_path ("1/staging")); + assert (gr->cache_location.path () == grp.normalize ()); + + assert (gr->packages_timestamp == + file_mtime (gr->cache_location.path () / packages)); + + assert (gr->repositories_timestamp == + file_mtime (gr->cache_location.path () / repositories)); + + assert (!gr->internal); + assert (gr->prerequisites.empty ()); + assert (gr->complements.empty ()); + + // Verify libexpat package version. + // + // libexpat-5.1 + // + shared_ptr tpv ( + db.load ( + package_id (package_name ("libexpat"), version ("5.1")))); + + assert (check_external (*tpv)); + assert (tpv->other_repositories.size () == 1); + assert (tpv->other_repositories[0].load () == gr); + assert (check_location (tpv)); + + // Verify libgenx package version. + // + // libgenx-1.0 + // + shared_ptr gpv ( + db.load ( + package_id (package_name ("libgenx"), version ("1.0")))); + + assert (check_external (*gpv)); + assert (gpv->other_repositories.size () == 1); + assert (gpv->other_repositories[0].load () == gr); + assert (check_location (gpv)); + + // Verify libmisc package version. + // + // libmisc-1.0 + // + shared_ptr mpv2 ( + db.load ( + package_id (package_name ("libmisc"), version ("1.0")))); + + assert (check_external (*mpv2)); + assert (mpv2->other_repositories.size () == 1); + assert (mpv2->other_repositories[0].load () == gr); + assert (check_location (mpv2)); + + // Change package summary, update the object persistent state, rerun + // the loader and make sure the model were not rebuilt. + // + bpv->summary = "test"; + db.update (bpv); + + t.commit (); + } + + // Rerun the loader without --force and make sure the model were not + // rebuilt. + // + { + cstrings args (loader_args); + args.push_back (loadtab.string ().c_str ()); + args.push_back (nullptr); + + assert (process (args.data ()).wait ()); - assert (process (ld_args).wait ()); transaction t (db.begin ()); shared_ptr bpv ( @@ -914,11 +1025,27 @@ main (int argc, char* argv[]) t.commit (); } - // Fully qualified to avoid ambiguity with odb exception. + + // Restore the original setup. // - catch (const std::exception& e) { - cerr << e << endl; - return 1; + cstrings args (loader_args); + args.push_back ("--force"); + args.push_back (loadtab.string ().c_str ()); + args.push_back (nullptr); + + assert (process (args.data ()).wait ()); + + transaction t (db.begin ()); + + shared_ptr bpv ( + db.find ( + package_id (package_name ("libbar"), version ("2.4.0+3")))); + + // External package summary is not saved. + // + assert (bpv->summary.empty ()); + + t.commit (); } } diff --git a/tests/load/git-cache/packages.manifest b/tests/load/git-cache/packages.manifest new file mode 100644 index 0000000..1cec922 --- /dev/null +++ b/tests/load/git-cache/packages.manifest @@ -0,0 +1,14 @@ +: 1 +name: libfoo +version: 1.0 +project: foo +summary: The Foo Library +license: MIT +tags: c++, foo +description-file: README +changes-file: NEWS +url: http://www.example.com/foo/ +email: foo-users@example.com +depends: libmisc == 1.0 +location: libfoo +fragment: 0f50af28d1cfb0c22f5b88e2bf674ab732e058d9 diff --git a/tests/load/git-cache/repositories.manifest b/tests/load/git-cache/repositories.manifest new file mode 100644 index 0000000..f8f5696 --- /dev/null +++ b/tests/load/git-cache/repositories.manifest @@ -0,0 +1,7 @@ +: 1 +location: ../libmisc.git##HEAD +type: git +role: prerequisite +fragment: 0f50af28d1cfb0c22f5b88e2bf674ab732e058d9 +: +summary: foo project repository diff --git a/tests/load/git-loadtab b/tests/load/git-loadtab new file mode 100644 index 0000000..eb8f88b --- /dev/null +++ b/tests/load/git-loadtab @@ -0,0 +1 @@ +https://git.example.com/foo.git#master foo cache:git-cache -- cgit v1.1