This is done using one dpkg-query call
---
src/dpkg.ml | 33 ++++++++++++++++++++++++---------
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/src/dpkg.ml b/src/dpkg.ml
index c4a4316..1dfb92c 100644
--- a/src/dpkg.ml
+++ b/src/dpkg.ml
@@ -94,16 +94,31 @@ let dpkg_get_package_database_mtime () =
(lstat "/var/lib/dpkg/status").st_mtime
let dpkg_get_all_requires pkgs =
+ let dpkg_requires = Hashtbl.create 13 in
+ (* Prepare dpkg_requires hashtbl with depends, pre-depends from all
+ packages. Strip version information and discard alternative
+ dependencies *)
+ let cmd = sprintf "\
+ %s --show --showformat='${Package} ${Depends} ${Pre-Depends}\n' | \
+ sed -e 's/ *([^)]*) */ /g' \
+ -e 's/ *, */ /g' \
+ -e 's/ *| *[^ ]* */ /g'"
+ Config.dpkg_query in
+ let lines = run_command_get_lines cmd in
+ List.iter (
+ fun line ->
+ match string_split " " line with
+ | [] -> ()
+ | pkgname :: [] -> ()
+ | pkgname :: deps -> Hashtbl.add dpkg_requires pkgname deps
+ ) lines;
+
let get pkgs =
- let cmd = sprintf "\
- %s --show --showformat='${Depends} ${Pre-Depends} ' %s |
- sed -e 's/([^)]*)//g' -e 's/,//g' -e 's/ \\+/\\n/g' |
- sort -u"
- Config.dpkg_query
- (quoted_list (List.map dpkg_package_name (PackageSet.elements pkgs))) in
- let lines = run_command_get_lines cmd in
- let lines = filter_map dpkg_package_of_string lines in
- PackageSet.union pkgs (package_set_of_list lines)
+ let pkgnames = List.map dpkg_package_name (PackageSet.elements pkgs) in
+ let deps = List.map (Hashtbl.find_all dpkg_requires) pkgnames in
+ let deps = List.flatten (List.flatten deps) in
+ let deps = filter_map dpkg_package_of_string deps in
+ PackageSet.union pkgs (package_set_of_list deps)
in
(* The command above only gets one level of dependencies. We need
* to keep iterating until we reach a fixpoint.
--
1.9.0