diff options
Diffstat (limited to 'bpkg/pkg-status.cxx')
-rw-r--r-- | bpkg/pkg-status.cxx | 86 |
1 files changed, 61 insertions, 25 deletions
diff --git a/bpkg/pkg-status.cxx b/bpkg/pkg-status.cxx index 1396b1a..0cb4168 100644 --- a/bpkg/pkg-status.cxx +++ b/bpkg/pkg-status.cxx @@ -58,31 +58,44 @@ namespace bpkg // Now look for available packages. // + bool available; // At least one vailable package (stub or not). vector<shared_ptr<available_package>> aps; { + shared_ptr<repository> rep (db.load<repository> ("")); // Root. + using query = query<available_package>; query q (query::id.name == n); - // If the user specified the version, then only look for that specific - // version (we still do it since there might be other revisions). - // - if (!v.empty ()) - q = q && compare_version_eq (query::id.version, v, v.revision != 0); - - // And if we found an existing package, then only look for versions - // greater than what already exists. - // - if (p != nullptr) - q = q && query::id.version > p->version; - - q += order_by_version_desc (query::id.version); + available = + filter_one (rep, db.query<available_package> (q)).first != nullptr; - // Only consider packages that are in repositories that were explicitly - // added to the configuration and their complements, recursively. - // - aps = filter (db.load<repository> (""), - db.query<available_package> (q)); + if (available) + { + // If the user specified the version, then only look for that + // specific version (we still do it since there might be other + // revisions). + // + if (!v.empty ()) + q = q && + compare_version_eq (query::id.version, v, v.revision != 0); + + // And if we found an existing package, then only look for versions + // greater than what already exists. Note that for a system wildcard + // version we will always show all available versions (since it's + // 0). + // + if (p != nullptr) + q = q && query::id.version > p->version; + + q += order_by_version_desc (query::id.version); + + // Only consider packages that are in repositories that were + // explicitly added to the configuration and their complements, + // recursively. + // + aps = filter (rep, db.query<available_package> (q)); + } } if (multi) @@ -101,10 +114,13 @@ namespace bpkg { cout << p->state; + if (p->substate != package_substate::none) + cout << ',' << p->substate; + // Also print the version of the package unless the user specified it. // if (v != p->version) - cout << " " << p->version; + cout << ' ' << p->version_string (); if (p->hold_package) cout << " hold_package"; @@ -115,19 +131,39 @@ namespace bpkg found = true; } - if (!aps.empty ()) + if (available) { cout << (found ? "; " : "") << "available"; - // If the user specified the version, then there might only be one - // entry in which case it is useless to repeat it. + // The idea is that in the future we will try to auto-discover a + // system version and then print that. For now we just say "maybe + // available from the system" but only if no version was specified by + // the user. We will later compare it if the user did specify the + // version. // - if (v.empty () || aps.size () > 1 || aps[0]->version != v) + bool sys (v.empty ()); + + if (!aps.empty ()) { - for (shared_ptr<available_package> ap: aps) - cout << ' ' << ap->version; + // If the user specified the version, then there might only be one + // entry in which case it is useless to repeat it. But we do want + // to print it if there is also a system one. + // + if (sys || v.empty () || aps.size () > 1 || aps[0]->version != v) + { + for (shared_ptr<available_package> ap: aps) + { + if (ap->stub ()) + break; // All the rest are stubs so bail out. + + cout << ' ' << ap->version; + } + } } + if (sys) + cout << " sys:?"; + found = true; } |