diff options
author | stilez <stilez@users.noreply.github.com> | 2017-01-25 06:36:32 +0000 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2017-01-30 13:33:26 -0200 |
commit | 1f9edebb4dce80939a0dba9e05341bace3f598e2 (patch) | |
tree | 68d27702a6f0f5816861c23356cf4fad7553d5ea | |
parent | 5e446a2510683917bb3c5079bb217211b16fd6a8 (diff) | |
download | pfsense-1f9edebb4dce80939a0dba9e05341bace3f598e2.zip pfsense-1f9edebb4dce80939a0dba9e05341bace3f598e2.tar.gz |
use wrapped version of pkg info -e instead
(cherry picked from commit e5f96a2cb3c0cad0c828148bd7b8d45c130a9b17)
-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 } |