cros_extract_deps: manually filter out packages that are obsolete in the portage tree
Currently, the emerge command doesn't respect --emptytree option when
compute the depgraph. Thus some deps in the graph has the package version
of installed packgages, not the one reflected by the ebuilds.
This CL fixes it by manually filtering out packages whose actions are 'uninstall'.
TEST=run `cros_extract_deps <old package>` and verify that the dep
graph output no longer contains old package
BUG=chromium:938605
Change-Id: I2ce47dc0906db9b7244a9b98b0958b1a1afebc46
Reviewed-on: https://chromium-review.googlesource.com/1535390
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: Ned Nguyen <nednguyen@google.com>
Reviewed-by: Ned Nguyen <nednguyen@google.com>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/scripts/cros_extract_deps.py b/scripts/cros_extract_deps.py
index 36abff5..39af0a2 100644
--- a/scripts/cros_extract_deps.py
+++ b/scripts/cros_extract_deps.py
@@ -243,6 +243,25 @@
return opts
+def FilterObsoleteDeps(package_deps):
+ """Remove all the packages that are to be uninstalled from |package_deps|.
+
+ Returns:
+ None since this method mutates |package_deps| directly.
+ """
+ obsolete_package_deps = []
+ for k, v in package_deps.iteritems():
+ if v['action'] in ('merge', 'nomerge'):
+ continue
+ elif v['action'] == 'uninstall':
+ obsolete_package_deps.append(k)
+ else:
+ assert False, (
+ 'Unrecognized action. Package dep data: %s' % v)
+ for p in obsolete_package_deps:
+ del package_deps[p]
+
+
def ExtractDeps(sysroot, package_list, formatting='deps'):
"""Returns the set of dependencies for the packages in package_list.
@@ -272,6 +291,14 @@
deps.Initialize(lib_argv)
deps_tree, _deps_info = deps.GenDependencyTree()
flattened_deps = FlattenDepTree(deps_tree, get_cpe=(formatting == 'cpe'))
+
+ # Workaround: since emerge doesn't honor the --emptytree flag, for now we need
+ # to manually filter out packages that are obsolete (meant to be
+ # uninstalled by emerge)
+ # TODO(crbug.com/938605): remove this work around once
+ # https://bugs.gentoo.org/681308 is addressed.
+ FilterObsoleteDeps(flattened_deps)
+
if formatting == 'cpe':
flattened_deps = GenerateCPEList(flattened_deps, sysroot)
return flattened_deps