From 82f809d68e837bbca380902dbeba8aaac6e2e2ba Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Wed, 11 Jul 2007 00:33:04 +0000 Subject: For bug #184679, handle ENOTDIR by finding the non-directory parent and testing that for collision instead. svn path=/main/trunk/; revision=7220 --- pym/portage/dbapi/vartree.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index d91073705..93adc30a8 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -1440,7 +1440,8 @@ class dblink(object): stopmerge = False i=0 collisions = [] - + destroot = normalize_path(destroot).rstrip(os.path.sep) + \ + os.path.sep print green("*")+" checking "+str(len(mycontents))+" files for package collisions" for f in mycontents: nocheck = False @@ -1460,10 +1461,34 @@ class dblink(object): try: dest_lstat = os.lstat(dest_path) except EnvironmentError, e: - if e.errno != errno.ENOENT: + if e.errno == errno.ENOENT: + del e + continue + elif e.errno == errno.ENOTDIR: + del e + # A non-directory is in a location where this package + # expects to have a directory. + dest_lstat = None + parent_path = dest_path + while len(parent_path) > len(destroot): + parent_path = os.path.dirname(parent_path) + try: + dest_lstat = os.lstat(parent_path) + break + except EnvironmentError, e: + if e.errno != errno.ENOTDIR: + raise + del e + if not dest_lstat: + raise AssertionError( + "unable to find non-directory " + \ + "parent for '%s'" % parent_path) + dest_path = parent_path + f = os.path.sep + dest_path[len(destroot):] + if f in collisions: + continue + else: raise - del e - continue if f[0] != "/": f="/"+f isowned = False -- cgit v1.2.3-1-g7c22