17385196 generate traceback when bypassing dependencies s12b93
authorYiteng Zhang <yiteng.zhang@oracle.com>
Wed, 17 Feb 2016 11:48:21 -0800
changeset 3302 20d410ef01eb
parent 3301 0fb7175c3a5f
child 3303 a58f3f2dfce2
17385196 generate traceback when bypassing dependencies 19850056 pkgdepend resolve -e traceback when its operand is bad
src/modules/flavor/elf.py
src/pkgdep.py
src/tests/cli/t_pkgdep.py
src/tests/cli/t_pkgdep_resolve.py
--- a/src/modules/flavor/elf.py	Mon Feb 01 16:04:27 2016 -0800
+++ b/src/modules/flavor/elf.py	Wed Feb 17 11:48:21 2016 -0800
@@ -21,7 +21,7 @@
 #
 
 #
-# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
 #
 
 import os
@@ -95,7 +95,7 @@
                 # may be due to the library search path being set outside the
                 # file that generates the dependency.
                 if err == self.ERROR and vars.is_satisfied() and \
-                    self.base_names[0] in delivered_base_names:
+                    self.base_names and self.base_names[0] in delivered_base_names:
                         self.err_type = self.WARNING
                         self.attrs["{0}.severity".format(self.DEPEND_DEBUG_PREFIX)] =\
                             "warning"
@@ -107,8 +107,11 @@
                         return err, vars
 
         def __repr__(self):
+                if self.base_names:
+                        return "ElfDep({0}, {1}, {2}, {3})".format(self.action,
+                            self.base_names[0], self.run_paths, self.pkg_vars)
                 return "ElfDep({0}, {1}, {2}, {3})".format(self.action,
-                    self.base_names[0], self.run_paths, self.pkg_vars)
+                    self.base_names, self.run_paths, self.pkg_vars)
 
 def expand_variables(paths, dyn_tok_conv):
         """Replace dynamic tokens, such as $PLATFORM, in the paths in the
--- a/src/pkgdep.py	Mon Feb 01 16:04:27 2016 -0800
+++ b/src/pkgdep.py	Wed Feb 17 11:48:21 2016 -0800
@@ -21,7 +21,7 @@
 #
 
 #
-# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
 #
 
 import errno
@@ -290,7 +290,7 @@
                                                         system_patterns.append(
                                                             l)
                         except EnvironmentError as e:
-                                if e.errno == errno.ENOENT:
+                                if e.errno in (errno.ENOENT, errno.EISDIR):
                                         error("{0}: '{1}'".format(
                                             e.args[1], e.filename),
                                             cmd="resolve")
--- a/src/tests/cli/t_pkgdep.py	Mon Feb 01 16:04:27 2016 -0800
+++ b/src/tests/cli/t_pkgdep.py	Wed Feb 17 11:48:21 2016 -0800
@@ -20,7 +20,7 @@
 # CDDL HEADER END
 #
 
-# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
 
 import testutils
 if __name__ == "__main__":
@@ -69,6 +69,10 @@
 file group=bin mode=0755 owner=root path=etc/libc.so.1
 """
 
+        test_bypass_manf = """\
+file NOHASH group=bin mode=0755 owner=root path=usr/xpg4/lib/libcurses.so.1 pkg.depend.bypass-generate=lib/libc.so.1
+"""
+
         test_64bit_manf = """\
 file NOHASH group=bin mode=0755 owner=root path=usr/bin/x64
 """
@@ -858,6 +862,11 @@
 depend fmri=__TBD pkg.debug.depend.file=libc.so.1 pkg.debug.depend.path=lib pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/xpg4/lib/libcurses.so.1 pkg.debug.depend.severity=warning pkg.debug.depend.type=elf type=require
 """
 
+        res_bypass = """\
+depend fmri=__TBD pkg.debug.depend.fullpath=usr/lib/libc.so.1 pkg.debug.depend.reason=usr/xpg4/lib/libcurses.so.1 pkg.debug.depend.type=elf type=require
+set name=pkg.debug.depend.bypassed value=lib/libc.so.1
+"""
+
         bug_16013_simple_a_dep_manf = """\
 set name=pkg.fmri value=pkg:/[email protected],5.11-0.151
 depend fmri=__TBD pkg.debug.depend.file=perl pkg.debug.depend.path=usr/bin pkg.debug.depend.reason=usr/bin/perl_app pkg.debug.depend.type=script type=require
@@ -3034,5 +3043,18 @@
 
                 self.check_res("", self.errout)
 
+        def test_bypass_full_paths(self):
+                """Test that when a match between the full paths of a dependency
+                and something specified in the pkg.depend.bypass-generate is
+                found, pkgdepend ignores the dependency as expected.
+                """
+
+                tp = self.make_manifest(self.test_bypass_manf)
+                self.make_elf([], "usr/xpg4/lib/libcurses.so.1")
+                self.pkgdepend_generate("-d {0} {1}".format(
+                    self.test_proto_dir, tp))
+                self.check_res("", self.errout)
+                self.check_res(self.res_bypass, self.output)
+
 if __name__ == "__main__":
         unittest.main()
--- a/src/tests/cli/t_pkgdep_resolve.py	Mon Feb 01 16:04:27 2016 -0800
+++ b/src/tests/cli/t_pkgdep_resolve.py	Wed Feb 17 11:48:21 2016 -0800
@@ -20,7 +20,7 @@
 # CDDL HEADER END
 #
 
-# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
 
 import testutils
 if __name__ == "__main__":
@@ -738,6 +738,10 @@
                     ex_path + "foobar", var_fmri_path, empty_path, m1_path),
                     exit=1)
 
+                # Check that if -e points at a directory, no traceback happens.
+                self.pkgdepend_resolve("-e {0} -E -m {1}".format(
+                    self.test_root, m1_path), exit=1)
+
         def test_resolve_permissions(self):
                 """Test that a manifest or constraint file that pkgdepend
                 resolve can't access doesn't cause a traceback."""