summaryrefslogtreecommitdiffstats
path: root/src/etc
diff options
context:
space:
mode:
Diffstat (limited to 'src/etc')
-rw-r--r--src/etc/inc/pkg-utils.inc36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/etc/inc/pkg-utils.inc b/src/etc/inc/pkg-utils.inc
index 6420925..7f6ddac 100644
--- a/src/etc/inc/pkg-utils.inc
+++ b/src/etc/inc/pkg-utils.inc
@@ -428,11 +428,37 @@ function get_pkg_info($pkgs = 'all', $local_only = false, $installed_only = fals
*/
// pkg info errors if none match, unlike pkg search, so test it will work beforehand...
- $tmp1 = $tmp2 = '';
- $tmprc = pkg_exec("info -e -R --raw-format json-compact " . $pkgs, $tmp1, $tmp2);
-
- if ($tmprc == 0) {
- // ok, packages match, so pkg info can be safely called
+ if (
+
+ $extra_param = "";
+ if ($local_only) {
+ $extra_param = "-U ";
+ }
+
+ if ($lock) {
+ mark_subsystem_dirty('pkg');
+ }
+
+ if (!$installed_only) {
+ // repo catalog search (either remote or local_only)
+ $rc = pkg_exec("search {$extra_param}-R --raw-format json-compact " . $pkgs, $out, $err);
+ }
+ if ($installed_only || ($local_only && $rc != 0)) {
+ /* use pkg info if (1) installed pkg search or (2) local catalog copy search requested + failed.
+ *
+ * The local repo catalog copy may be cleared if a previous call to pkg search couldn't get the
+ * remote repo catalog.
+ *
+ * If the calling code would have accepted local copy info (which isn't assumed up to date) then it
+ * makes sense to fall back on pkg info to at least return the known info about installed pkgs (pkg
+ * info should still work), instead of failing and returning no info at all. For example, this
+ * enables offline view + management of installed pkgs.
+ */
+
+ // pkg info errors if none match, unlike pkg search, so test it will work beforehand
+ // is_package_installed() is a wrapper for pkg info -e <pattern> which is what we need here.
+ if (is_package_installed($pkgs)) {
+ // ok, 1 or more packages match, so pkg info can be safely called to get the pkg list
$rc = pkg_exec("info -R --raw-format json-compact " . $pkgs, $out, $err);
} // else we already have empty values for $out etc which are correct if none matched
}
OpenPOWER on IntegriCloud