diff options
-rw-r--r-- | src/etc/inc/pkg-utils.inc | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/etc/inc/pkg-utils.inc b/src/etc/inc/pkg-utils.inc index 0e13e88..4090be1 100644 --- a/src/etc/inc/pkg-utils.inc +++ b/src/etc/inc/pkg-utils.inc @@ -372,11 +372,13 @@ function get_package_internal_name($package_data) { } // Get information about packages. -function get_pkg_info($pkgs = 'all', $only_local = false) { +function get_pkg_info($pkgs = 'all', $local_only = false, $installed_only = false) { + global $g, $input_errors; $out = ''; $err = ''; + $rc = 0; unset($pkg_filter); if (is_array($pkgs)) { @@ -385,7 +387,7 @@ function get_pkg_info($pkgs = 'all', $only_local = false) { } if ($pkgs == 'all') { - $pkgs = $g['pkg_prefix']; + $pkgs = $g['pkg_prefix'] . '*'; // Allows same prefix to work with both pkg search + pkg info } if (!function_exists('is_subsystem_dirty')) { @@ -394,21 +396,39 @@ function get_pkg_info($pkgs = 'all', $only_local = false) { /* Do not run remote operations if pkg has a lock */ if (is_subsystem_dirty('pkg')) { - $only_local = true; + $local_only = true; $lock = false; } else { $lock = true; } $extra_param = ""; - if ($only_local) { + if ($local_only) { $extra_param = "-U "; } if ($lock) { mark_subsystem_dirty('pkg'); } - $rc = pkg_exec("search {$extra_param}-R --raw-format json-compact " . $pkgs, $out, $err); + + 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. + */ + + $rc = pkg_exec("info -R --raw-format json-compact " . $pkgs, $out, $err); + } if ($lock) { clear_subsystem_dirty('pkg'); } @@ -488,7 +508,8 @@ function get_pkg_info($pkgs = 'all', $only_local = false) { function register_all_installed_packages() { global $g, $config, $pkg_interface; - $pkg_info = get_pkg_info('all', true); + $pkg_info = get_pkg_info('all', true, true); + foreach ($pkg_info as $pkg) { if (!isset($pkg['installed'])) { |