diff options
Diffstat (limited to 'src/etc')
-rw-r--r-- | src/etc/inc/pkg-utils.inc | 36 |
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 } |