From 4a5ca6f9853938eec8b5e487dc6cb3728dfb6a15 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 22 Dec 2021 21:52:01 +0300 Subject: Adapt to package manifest dependency classes change --- libbrep/package.hxx | 25 +++++++++++--- libbrep/package.xml | 12 +++++++ load/load.cxx | 50 +++++++++++++-------------- mod/mod-package-version-details.cxx | 28 +++++++++++++--- mod/page.cxx | 67 +++++++++++++++++++++++++------------ 5 files changed, 124 insertions(+), 58 deletions(-) diff --git a/libbrep/package.hxx b/libbrep/package.hxx index 46e5292..d0ac23f 100644 --- a/libbrep/package.hxx +++ b/libbrep/package.hxx @@ -20,7 +20,7 @@ // #define LIBBREP_PACKAGE_SCHEMA_VERSION_BASE 21 -#pragma db model version(LIBBREP_PACKAGE_SCHEMA_VERSION_BASE, 23, closed) +#pragma db model version(LIBBREP_PACKAGE_SCHEMA_VERSION_BASE, 24, closed) namespace brep { @@ -159,23 +159,38 @@ namespace brep class dependency_alternative: public small_vector { public: + // While we currently don't use the reflect, prefer, accept, and require + // values, let's save them for completeness. + // optional enable; + optional reflect; + optional prefer; + optional accept; + optional require; dependency_alternative () = default; - dependency_alternative (optional e): enable (move (e)) {} + dependency_alternative (optional e, + butl::optional r, + butl::optional p, + butl::optional a, + butl::optional q) + : enable (std::move (e)), + reflect (std::move (r)), + prefer (std::move (p)), + accept (std::move (a)), + require (std::move (q)) {} }; #pragma db value class dependency_alternatives: public small_vector { public: - bool conditional; bool buildtime; string comment; dependency_alternatives () = default; - dependency_alternatives (bool d, bool b, string c) - : conditional (d), buildtime (b), comment (move (c)) {} + dependency_alternatives (bool b, string c) + : buildtime (b), comment (move (c)) {} }; using dependencies = vector; diff --git a/libbrep/package.xml b/libbrep/package.xml index 72e9c83..ee177a8 100644 --- a/libbrep/package.xml +++ b/libbrep/package.xml @@ -1,4 +1,16 @@ + + + + + + + + + + + + diff --git a/load/load.cxx b/load/load.cxx index 34e59a7..ad5379e 100644 --- a/load/load.cxx +++ b/load/load.cxx @@ -499,43 +499,41 @@ load_packages (const shared_ptr& rp, for (auto& das: pm.dependencies) { - // Ignore special build2 and bpkg dependencies. We may not have - // packages for them and also showing them for every package is - // probably not very helpful. - // - if (das.buildtime && !das.empty ()) - { - const auto& da (das.front ()); - - assert (da.size () == 1); // @@ DEP - - const package_name& n (da[0].name); - if (n == "build2" || n == "bpkg") - continue; - } - - tds.emplace_back (das.conditional, - das.buildtime, - move (das.comment)); - - dependency_alternatives& tdas (tds.back ()); + dependency_alternatives tdas (das.buildtime, move (das.comment)); for (auto& da: das) { - tdas.push_back (dependency_alternative (move (da.enable))); - dependency_alternative& tda (tdas.back ()); + dependency_alternative tda (move (da.enable), + move (da.reflect), + move (da.prefer), + move (da.accept), + move (da.require)); for (auto& d: da) { + package_name& n (d.name); + + // Ignore special build2 and bpkg dependencies. We may not have + // packages for them and also showing them for every package is + // probably not very helpful. + // + if (das.buildtime && (n == "build2" || n == "bpkg")) + continue; + // The package member will be assigned during dependency // resolution procedure. // - tda.push_back ( - dependency {move (d.name), - move (d.constraint), - nullptr /* package */}); + tda.push_back (dependency {move (n), + move (d.constraint), + nullptr /* package */}); } + + if (!tda.empty ()) + tdas.push_back (move (tda)); } + + if (!tdas.empty ()) + tds.push_back (move (tdas)); } small_vector ts; diff --git a/mod/mod-package-version-details.cxx b/mod/mod-package-version-details.cxx index f1a641b..4a1f0c1 100644 --- a/mod/mod-package-version-details.cxx +++ b/mod/mod-package-version-details.cxx @@ -325,9 +325,6 @@ handle (request& rq, response& rs) s << TR(CLASS="depends") << TH; - if (das.conditional) - s << '?'; - if (das.buildtime) s << '*'; @@ -340,9 +337,30 @@ handle (request& rq, response& rs) if (&da != &das[0]) s << " | "; - assert (da.size () == 1); // @@ DEP + // Should we enclose multiple dependencies into curly braces as in the + // manifest? Somehow feels redundant here, since there can't be any + // ambiguity (dependency group version constraint is already punched + // into the specific dependencies without constraints). + // + for (const dependency& d: da) + { + if (&d != &da[0]) + s << ' '; + + print_dependency (d); + } + + if (da.enable) + { + s << " ? ("; - print_dependency (da[0]); + if (full) + s << *da.enable; + else + s << "..."; + + s << ')'; + } } s << ~SPAN diff --git a/mod/page.cxx b/mod/page.cxx index 8d315e9..a73e336 100644 --- a/mod/page.cxx +++ b/mod/page.cxx @@ -421,47 +421,67 @@ namespace brep if (&das != &dependencies_[0]) s << ", "; - if (das.conditional) - s << "?"; - if (das.buildtime) s << "*"; - // Suppress package name duplicates. + // Suppress dependency alternative duplicates, like in + // `{foo bar} < 1.1 | {foo bar} > 1.5`. // - set names; - for (const dependency_alternative& da: das) + // Return the dependency package name space-separated list. + // + auto deps_list = [] (const dependency_alternative& da) { - assert (da.size () == 1); // @@ DEP + string r; + for (const dependency& d: da) + { + if (!r.empty ()) + r += ' '; - names.emplace (da[0].name); - } + r += d.name.string (); + } + + return r; + }; - bool mult (names.size () > 1); + set alternatives; + for (const dependency_alternative& da: das) + alternatives.insert (deps_list (da)); + + // Note that we may end up with a single package name in parenthesis, if + // its duplicates were suppresses. This, however, may be helpful, + // indicating that there some alternatives for the package. + // + bool mult (das.size () > 1 || + (das.size () == 1 && das[0].size () > 1)); if (mult) - s << "("; + s << '('; bool first (true); for (const dependency_alternative& da: das) { - assert (da.size () == 1); // @@ DEP + auto i (alternatives.find (deps_list (da))); - const dependency& d (da[0]); + if (i == alternatives.end ()) + continue; - const package_name& n (d.name); - if (names.find (n) != names.end ()) - { - names.erase (n); + alternatives.erase (i); - if (first) - first = false; - else - s << " | "; + if (!first) + s << " | "; + else + first = false; + + for (const dependency& d: da) + { + if (&d != &da[0]) + s << ' '; // Try to display the dependency as a link if it is resolved. // Otherwise display it as plain text. // + const package_name& n (d.name); + if (d.package != nullptr) { shared_ptr p (d.package.load ()); @@ -487,10 +507,13 @@ namespace brep else s << n; } + + if (da.enable) + s << " ?"; } if (mult) - s << ")"; + s << ')'; } s << ~SPAN -- cgit v1.1