--- portage-orig/pym/portage.py 2004-04-08 12:21:06.699076112 +0900 +++ portage/pym/portage.py 2004-04-08 13:11:32.074149192 +0900 @@ -2472,7 +2472,11 @@ try: dstat=os.lstat(dest) except: - dstat=os.lstat(os.path.dirname(dest)) + try: + dstat=os.lstat(os.path.dirname(dest)) + # Parent directory does not exist + except: + return None destexists=0 if destexists: @@ -2516,8 +2520,6 @@ import errno if e[0]!=errno.EXDEV: # Some random error. - print "!!! Failed to move",src,"to",dest - print "!!!",e return None # Invalid cross-device-link 'bind' mounted or actually Cross-Device if renamefailed: @@ -2532,8 +2534,6 @@ os.rename(dest+"#new",dest) didcopy=1 except Exception, e: - print '!!! copy',src,'->',dest,'failed.' - print "!!!",e return None else: #we don't yet handle special, so we need to fall back to /bin/mv @@ -6023,16 +6023,6 @@ elif S_ISDIR(mymode): # we are merging a directory if mydmode!=None: - # destination exists - if not os.access(mydest, os.W_OK): - pkgstuff = pkgsplit(self.pkg) - writemsg("\n!!! Cannot write to '"+mydest+"'.\n") - writemsg("!!! Please check permissions and directories for broken symlinks.\n") - writemsg("!!! You may start the merge process again by using ebuild:\n") - writemsg("!!! ebuild "+self.settings["PORTDIR"]+"/"+self.cat+"/"+pkgstuff[0]+"/"+self.pkg+".ebuild merge\n") - writemsg("!!! And finish by running this: env-update\n\n") - return 1 - if S_ISLNK(mydmode) or S_ISDIR(mydmode): # a symlink to an existing directory will work for us; keep it: print "---",mydest+"/" @@ -6048,10 +6038,14 @@ print ">>>",mydest+"/" else: #destination doesn't exist - os.mkdir(mydest) - os.chmod(mydest,mystat[0]) - os.chown(mydest,mystat[4],mystat[5]) - print ">>>",mydest+"/" + try: + os.mkdir(mydest) + os.chmod(mydest,mystat[0]) + os.chown(mydest,mystat[4],mystat[5]) + print ">>>",mydest+"/" + except OSError: + #Don't die here. Die when real files are attempted to be copied. + print "!!!",mydest+"/" outfile.write("dir "+myrealdest+"\n") # recurse and merge this directory if self.mergeme(srcroot,destroot,outfile,secondhand,offset+x+"/",cfgfiledict,thismtime): @@ -6119,8 +6113,21 @@ if moveme: mymtime=movefile(mysrc,mydest,thismtime,mystat, mysettings=self.settings) if mymtime == None: - sys.exit(1) - zing=">>>" + #If it's a ".keep" file, simply report the failure. + if os.path.basename(mydest)==".keep": + zing="!!!" + #Otherwise directory permissions, + #mounts, whatever are preventing it. + else: + pkgstuff = pkgsplit(self.pkg) + writemsg("\n!!! Cannot write to '"+mydest+"'.\n") + writemsg("!!! Please check permissions and directories for broken symlinks.\n") + writemsg("!!! You may start the merge process again by using ebuild:\n") + writemsg("!!! ebuild "+self.settings["PORTDIR"]+"/"+self.cat+"/"+pkgstuff[0]+"/"+self.pkg+".ebuild merge\n") + writemsg("!!! And finish by running this: env-update\n\n") + sys.exit(1) + else: + zing=">>>" else: mymtime=thismtime # We need to touch the destination so that on --update the