From: Fabian Groffen Date: Sat, 17 Jan 2009 16:58:20 +0000 (-0000) Subject: Merged from trunk -r12520:12524 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=b1925f82d0b234cc6b6cff461980aa645a319b65;p=portage.git Merged from trunk -r12520:12524 | 12521 | Bug #255101 - Fix 'Permission denied' error handling in | | zmedico | NewsManager.getUnreadItems(). If there's no permission to | | | lock the unread file, skip the lock and try to read the file | | | anyway. | | 12522 | Revert chown behavior change from the previous commit, so | | zmedico | that chown will not be called on a pre-existing file. | | 12523 | Identify which package has unused local USE descriptions, in | | zmedico | case more than one package is being scanned. Thanks to | | | Thomas Sachau for reporting. | | 12524 | Fix false positive in the 'unused local USE-description' | | zmedico | warning. Thanks to Alexis Ballier for | | | reporting. | svn path=/main/branches/prefix/; revision=12527 --- diff --git a/bin/repoman b/bin/repoman index c788f1f68..7a4728e7e 100755 --- a/bin/repoman +++ b/bin/repoman @@ -1369,11 +1369,11 @@ for x in scanlist: default_use = [] for myflag in myaux["IUSE"].split(): flag_name = myflag.lstrip("+-") + used_useflags.add(flag_name) if myflag != flag_name: default_use.append(myflag) if flag_name not in uselist: myuse.append(flag_name) - used_useflags.update(myuse) # uselist checks - metadata for mypos in range(len(myuse)-1,-1,-1): @@ -1586,7 +1586,8 @@ for x in scanlist: for myflag in muselist.difference(used_useflags): stats["metadata.warning"] += 1 fails["metadata.warning"].append( - "unused local USE-description: '%s'" % myflag) + "%s/metadata.xml: unused local USE-description: '%s'" % \ + (x, myflag)) if options.mode == "manifest": sys.exit(dofail) diff --git a/pym/portage/locks.py b/pym/portage/locks.py index 659ad3d4b..912b2a32f 100644 --- a/pym/portage/locks.py +++ b/pym/portage/locks.py @@ -9,7 +9,7 @@ __all__ = ["lockdir", "unlockdir", "lockfile", "unlockfile", \ import errno, os, stat, time, types from portage.exception import DirectoryNotFound, FileNotFound, \ - InvalidData, TryAgain + InvalidData, TryAgain, OperationNotPermitted, PermissionDenied from portage.data import portage_gid from portage.output import EOutput from portage.util import writemsg @@ -56,22 +56,36 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, if type(mypath) == types.StringType: if not os.path.exists(os.path.dirname(mypath)): raise DirectoryNotFound(os.path.dirname(mypath)) - if not os.path.exists(lockfilename): - old_mask=os.umask(000) - myfd = os.open(lockfilename, os.O_CREAT|os.O_RDWR,0660) + preexisting = os.path.exists(lockfilename) + old_mask = os.umask(000) + try: try: - if os.stat(lockfilename).st_gid != portage_gid: - os.chown(lockfilename,os.getuid(),portage_gid) + myfd = os.open(lockfilename, os.O_CREAT|os.O_RDWR, 0660) except OSError, e: - if e[0] == 2: # No such file or directory - return lockfile(mypath, wantnewlockfile=wantnewlockfile, - unlinkfile=unlinkfile, waiting_msg=waiting_msg, - flags=flags) + func_call = "open('%s')" % lockfilename + if e.errno == OperationNotPermitted.errno: + raise OperationNotPermitted(func_call) + elif e.errno == PermissionDenied.errno: + raise PermissionDenied(func_call) else: - writemsg("Cannot chown a lockfile. This could cause inconvenience later.\n"); + raise + + if not preexisting: + try: + if os.stat(lockfilename).st_gid != portage_gid: + os.chown(lockfilename, -1, portage_gid) + except OSError, e: + if e.errno == errno.ENOENT: # No such file or directory + return lockfile(mypath, + wantnewlockfile=wantnewlockfile, + unlinkfile=unlinkfile, waiting_msg=waiting_msg, + flags=flags) + else: + writemsg("Cannot chown a lockfile. This could " + \ + "cause inconvenience later.\n") + + finally: os.umask(old_mask) - else: - myfd = os.open(lockfilename, os.O_CREAT|os.O_RDWR,0660) elif type(mypath) == types.IntType: myfd = mypath diff --git a/pym/portage/news.py b/pym/portage/news.py index 90dd3a065..b20fd422e 100644 --- a/pym/portage/news.py +++ b/pym/portage/news.py @@ -157,7 +157,7 @@ class NewsManager(object): try: unread_lock = lockfile(unread_filename, wantnewlockfile=1) except (InvalidLocation, OperationNotPermitted, PermissionDenied): - return 0 + pass try: try: return len(grabfile(unread_filename))