From 96281a6c4f818311a6df90c0d8b8f537a61e1090 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 12 Nov 2015 17:25:36 +0200 Subject: Add url, email, summary, description members to the repository class --- brep/package | 15 ++++++- brep/package-version-details.cxx | 43 ++++++++++++-------- brep/package.cxx | 20 +++++++-- brep/page.cxx | 21 ++++++++-- etc/httpd.conf | 1 + loader/loader.cxx | 61 +++++++++++++++------------- tests/loader/driver.cxx | 5 +++ tests/loader/external/1/basics/repositories | 1 + tests/loader/external/1/misc/repositories | 1 + tests/loader/external/1/staging/repositories | 1 + tests/loader/external/1/testing/repositories | 1 + 11 files changed, 114 insertions(+), 56 deletions(-) diff --git a/brep/package b/brep/package index 8fc6a43..f56906a 100644 --- a/brep/package +++ b/brep/package @@ -14,6 +14,7 @@ #include // size_t #include // move() #include // uint16 +#include #include #include // database @@ -261,6 +262,9 @@ namespace brep #pragma db member(package) column("") not_null }; + std::ostream& + operator<< (std::ostream&, const dependency&); + #pragma db value class dependency_alternatives: public std::vector { @@ -310,6 +314,14 @@ namespace brep repository_location location; std::string display_name; + optional url; + + // Set only for internal repositories. + // + optional email; + optional summary; + optional description; + // Non empty for internal repositories and external ones with a filesystem // path location. // @@ -428,8 +440,7 @@ namespace brep requirements_type requirements; odb::lazy_shared_ptr internal_repository; - // Path to the package file. Set only for packages present in internal - // repository. + // Path to the package file. Set only for internal packages. // optional location; diff --git a/brep/package-version-details.cxx b/brep/package-version-details.cxx index 9c90b8d..ce25a44 100644 --- a/brep/package-version-details.cxx +++ b/brep/package-version-details.cxx @@ -212,29 +212,36 @@ namespace brep shared_ptr p (d.package.load ()); string en (mime_url_encode (p->id.name)); - if (p->internal ()) - s << A << HREF << "/go/" << en << ~HREF << p->id.name << ~A; - else - // @@ Refer to package repository URL when supported in repository - // manifest. - // - s << p->id.name; + assert (p->internal () || !p->other_repositories.empty ()); + shared_ptr r ( + p->internal () + ? p->internal_repository.load () + : p->other_repositories[0].load ()); - if (d.constraint) - { - s << ' '; + optional u (r->url); // Repository web interface URL. + if (!u && p->internal ()) + u = ""; // Make URL to reference the current web interface. - if (p->internal ()) - s << A - << HREF << "/go/" << en << "/" << p->version.string () << ~HREF + if (u) + { + s << A << HREF << *u << "/go/" << en << ~HREF << p->id.name << ~A; + + if (d.constraint) + { + s << ' ' + << A + << HREF + << *u << "/go/" << en << "/" << p->version.string () + << ~HREF << *d.constraint << ~A; - else - // @@ Refer to package repository URL when supported in - // repository manifest. - // - s << *d.constraint; + } } + else + // Display the dependency as a plain text in no repository URL + // available. + // + s << d; } s << ~SPAN diff --git a/brep/package.cxx b/brep/package.cxx index 853d484..d99819c 100644 --- a/brep/package.cxx +++ b/brep/package.cxx @@ -6,6 +6,7 @@ #include // move() #include +#include #include @@ -24,6 +25,17 @@ namespace brep return package.object_id ().name; } + ostream& + operator<< (ostream& o, const dependency& d) + { + o << d.name (); + + if (d.constraint) + o << ' ' << *d.constraint; + + return o; + } + // package // package:: @@ -120,19 +132,19 @@ namespace brep // repository:: repository (repository_location l, string d, dir_path p) - : location (move (l)), + : name (l.canonical_name ()), + location (move (l)), display_name (move (d)), local_path (move (p)), internal (true) { - name = location.canonical_name (); } repository:: repository (repository_location l) - : location (move (l)), + : name (l.canonical_name ()), + location (move (l)), internal (false) { - name = location.canonical_name (); } } diff --git a/brep/page.cxx b/brep/page.cxx index 481825b..81a7de5 100644 --- a/brep/page.cxx +++ b/brep/page.cxx @@ -284,11 +284,24 @@ namespace brep shared_ptr p (da.package.load ()); - if (p->internal ()) - s << A << HREF << "/go/" << mime_url_encode (n) << ~HREF << n << ~A; + assert (p->internal () || !p->other_repositories.empty ()); + shared_ptr r ( + p->internal () + ? p->internal_repository.load () + : p->other_repositories[0].load ()); + + optional u (r->url); // Repository web interface URL. + if (!u && p->internal ()) + u = ""; // Make URL to reference the current web interface. + + if (u) + s << A + << HREF << *u << "/go/" << mime_url_encode (n) << ~HREF + << n + << ~A; else - // @@ Refer to package repository URL when supported in repository - // manifest. + // Display the dependency as a plain text in no repository URL + // available. // s << n; } diff --git a/etc/httpd.conf b/etc/httpd.conf index 33658a8..1000b04 100644 --- a/etc/httpd.conf +++ b/etc/httpd.conf @@ -94,3 +94,4 @@ ExtendedStatus On DirectoryIndex index.html TypesConfig /etc/mime.types AddOutputFilterByType DEFLATE application/xhtml+xml +AddOutputFilterByType DEFLATE text/css diff --git a/loader/loader.cxx b/loader/loader.cxx index 782d3f3..ee3e5fa 100644 --- a/loader/loader.cxx +++ b/loader/loader.cxx @@ -382,13 +382,13 @@ load_packages (const shared_ptr& rp, database& db) db.persist (rp); // Save the repository state. } -// Load the prerequsite repositories and their complements state from the -// 'repositories' file. Update the repository persistent state to save -// repositories_timestamp, prerequsites, and complements members. -// Should be called once per persisted internal repository. +// Load the repository manifest values, prerequsite repositories, and their +// complements state from the 'repositories' file. Update the repository +// persistent state to save changed members. Should be called once per +// persisted internal repository. // static void -load_prerequisites (const shared_ptr& rp, database& db) +load_repositories (const shared_ptr& rp, database& db) { // repositories_timestamp other than timestamp_nonexistent signals that // repository prerequisites are already loaded. @@ -417,12 +417,28 @@ load_prerequisites (const shared_ptr& rp, database& db) for (auto& rm: rpm) { - if (rm.location.empty () || - (!rp->internal && - rm.effective_role () == repository_role::prerequisite)) - continue; // Ignore entry for this repository. + if (rm.effective_role () == repository_role::prerequisite && !rp->internal) + continue; // Ignore the external repository prerequisite entry. - assert (rm.effective_role () != repository_role::base); + if (rm.effective_role () == repository_role::base) + { + // Update the base repository with manifest values. + // + rp->url = move (rm.url); + + if (rp->internal) + { + rp->email = move (rm.email); + rp->summary = move (rm.summary); + rp->description = move (rm.description); + } + + continue; + } + + // Load prerequisite or complement repository. + // + assert (!rm.location.empty ()); repository_location rl; @@ -498,24 +514,12 @@ load_prerequisites (const shared_ptr& rp, database& db) } load_packages (pr, db); - load_prerequisites (pr, db); + load_repositories (pr, db); } db.update (rp); } -static ostream& -operator<< (ostream& o, - const brep::dependency& d) // Ambiguity with bpkg::dependency. -{ - o << d.name (); - - if (d.constraint) - o << ' ' << *d.constraint; - - return o; -} - // Check if the package is available from the specified repository, // its prerequisite repositories, or one of their complements, // recursively. @@ -749,8 +753,8 @@ main (int argc, char* argv[]) throw; } - // Load the description of all the internal repositories from - // the configuration file. + // Load the description of all the internal repositories from the + // configuration file. // internal_repositories irs (load_repositories (path (argv[1]))); @@ -776,15 +780,16 @@ main (int argc, char* argv[]) load_packages (r, db); } - // On the second pass over the internal repositories we - // load their (not yet loaded) prerequisite repositories. + // On the second pass over the internal repositories we load their + // (not yet loaded) manifest values, complement, and prerequisite + // repositories. // for (const auto& ir: irs) { shared_ptr r ( db.load (ir.location.canonical_name ())); - load_prerequisites (r, db); + load_repositories (r, db); } session s; diff --git a/tests/loader/driver.cxx b/tests/loader/driver.cxx index 881a2db..f996ab7 100644 --- a/tests/loader/driver.cxx +++ b/tests/loader/driver.cxx @@ -117,6 +117,7 @@ main (int argc, char* argv[]) assert (sr->location.string () == "http://pkg.cppget.org/internal/1/stable"); assert (sr->display_name == "stable"); + assert (!sr->url); dir_path srp (cp.directory () / dir_path ("internal/1/stable")); assert (sr->local_path == srp.normalize ()); @@ -281,6 +282,7 @@ main (int argc, char* argv[]) assert (mr->location.string () == "http://pkg.cppget.org/internal/1/math"); assert (mr->display_name == "math"); + assert (!mr->url); dir_path mrp (cp.directory () / dir_path ("internal/1/math")); assert (mr->local_path == mrp.normalize ()); @@ -477,6 +479,7 @@ main (int argc, char* argv[]) assert (cr->location.string () == "http://pkg.cppget.org/external/1/misc"); assert (cr->display_name.empty ()); + assert (cr->url && *cr->url == "http://misc.cppget.org"); dir_path crp (cp.directory () / dir_path ("external/1/misc")); assert (cr->local_path == crp.normalize ()); @@ -531,6 +534,7 @@ main (int argc, char* argv[]) assert (tr->location.string () == "http://pkg.cppget.org/external/1/testing"); assert (tr->display_name.empty ()); + assert (tr->url && *tr->url == "http://test.cppget.org"); dir_path trp (cp.directory () / dir_path ("external/1/testing")); assert (tr->local_path == trp.normalize ()); @@ -563,6 +567,7 @@ main (int argc, char* argv[]) assert (gr->location.string () == "http://pkg.cppget.org/external/1/staging"); assert (gr->display_name.empty ()); + assert (gr->url && *gr->url == "http://stage.cppget.org"); dir_path grp (cp.directory () / dir_path ("external/1/staging")); assert (gr->local_path == grp.normalize ()); diff --git a/tests/loader/external/1/basics/repositories b/tests/loader/external/1/basics/repositories index 9a15f2b..57a1c7a 100644 --- a/tests/loader/external/1/basics/repositories +++ b/tests/loader/external/1/basics/repositories @@ -1,3 +1,4 @@ : 1 # Local repository manifest (this repository). # +url: http://basics.org diff --git a/tests/loader/external/1/misc/repositories b/tests/loader/external/1/misc/repositories index 93acdb3..1b98ebc 100644 --- a/tests/loader/external/1/misc/repositories +++ b/tests/loader/external/1/misc/repositories @@ -10,3 +10,4 @@ role: complement : # Local repository manifest (this repository). # +url: http://misc.cppget.org diff --git a/tests/loader/external/1/staging/repositories b/tests/loader/external/1/staging/repositories index 9a15f2b..8443ab8 100644 --- a/tests/loader/external/1/staging/repositories +++ b/tests/loader/external/1/staging/repositories @@ -1,3 +1,4 @@ : 1 # Local repository manifest (this repository). # +url: http://stage.cppget.org diff --git a/tests/loader/external/1/testing/repositories b/tests/loader/external/1/testing/repositories index 5f7246c..227d5ac 100644 --- a/tests/loader/external/1/testing/repositories +++ b/tests/loader/external/1/testing/repositories @@ -6,3 +6,4 @@ role: complement : # Local repository manifest (this repository). # +url: http://test.cppget.org -- cgit v1.1