repoman: handle PermissionDenied from digestgen
authorZac Medico <zmedico@gentoo.org>
Fri, 17 Jun 2011 22:35:29 +0000 (15:35 -0700)
committerZac Medico <zmedico@gentoo.org>
Fri, 17 Jun 2011 22:35:29 +0000 (15:35 -0700)
This will fix bug #371987.

bin/repoman
pym/portage/checksum.py

index 164a1278d9a3db083b12ecfd68a0a7c226900322..487cc67a48092b2cff56039131f441a1fbe6a378 100755 (executable)
@@ -1095,8 +1095,13 @@ for x in scanlist:
                                portage._doebuild_manifest_exempt_depend -= 1
 
                repoman_settings["O"] = checkdir
-               generated_manifest = digestgen(
-                       mysettings=repoman_settings, myportdb=portdb)
+               try:
+                       generated_manifest = digestgen(
+                               mysettings=repoman_settings, myportdb=portdb)
+               except portage.exception.PermissionDenied as e:
+                       generated_manifest = False
+                       writemsg_level("!!! Permission denied: '%s'\n" % (e,),
+                               level=logging.ERROR, noiselevel=-1)
 
                if not generated_manifest:
                        print("Unable to generate manifest.")
index f640fd9f1d9e4e6058c4f1f5dffdbf8d29d74a5f..eeb5995bba0b5080630c2e66daa1a384270b090d 100644 (file)
@@ -29,8 +29,19 @@ def _generate_hash_function(hashtype, hashobject, origin="unknown"):
                @type filename: String
                @return: The hash and size of the data
                """
-               f = open(_unicode_encode(filename,
-                       encoding=_encodings['fs'], errors='strict'), 'rb')
+               try:
+                       f = open(_unicode_encode(filename,
+                               encoding=_encodings['fs'], errors='strict'), 'rb')
+               except IOError as e:
+                       func_call = "open('%s')" % filename
+                       if e.errno == errno.EPERM:
+                               raise portage.exception.OperationNotPermitted(func_call)
+                       elif e.errno == errno.EACCES:
+                               raise portage.exception.PermissionDenied(func_call)
+                       elif e.errno == errno.ENOENT:
+                               raise portage.exception.FileNotFound(filename)
+                       else:
+                               raise
                blocksize = HASHING_BLOCKSIZE
                data = f.read(blocksize)
                size = 0