Bug #192341 - When the chflags command does not exit successfully,
authorZac Medico <zmedico@gentoo.org>
Wed, 26 Sep 2007 17:03:18 +0000 (17:03 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 26 Sep 2007 17:03:18 +0000 (17:03 -0000)
try to generate an informative error. First, use stat or lstat to
try and generate an ENOENT error.  It the path exists, verify that
the chflags binary exists and raise CommandNotFound if necessary.
Finally, simply generate an EPERM OSError with the output of the
command since we're not sure exactly why it failed or what the
real errno was.

svn path=/main/trunk/; revision=7834

pym/portage/__init__.py

index db377fda56e64193c7e438b18fcfac1ee3539139..7a2fa0855c06efb85875aaf64712a4dd033121bb 100644 (file)
@@ -47,11 +47,20 @@ if os.uname()[0] in ["FreeBSD"]:
        def _chflags(path, flags, opts=""):
                cmd = "chflags %s %o '%s'" % (opts, flags, path)
                status, output = commands.getstatusoutput(cmd)
-               retval = os.WEXITSTATUS(status)
-               if os.WIFEXITED(status) and retval == os.EX_OK:
+               if os.WIFEXITED(status) and os.WEXITSTATUS(status) == os.EX_OK:
                        return
-               e = OSError(retval, output)
-               e.errno = retval
+               # Try to generate an ENOENT error if appropriate.
+               if "h" in opts:
+                       os.lstat(path)
+               else:
+                       os.stat(path)
+               # Make sure the binary exists.
+               if not portage.process.find_binary("chflags"):
+                       raise portage.exception.CommandNotFound("chflags")
+               # Now we're not sure exactly why it failed or what
+               # the real errno was, so just report EPERM.
+               e = OSError(errno.EPERM, output)
+               e.errno = errno.EPERM
                e.filename = path
                e.message = output
                raise e