Make movefile() tolerant to EPERM errors that can be raised from utime()
authorZac Medico <zmedico@gentoo.org>
Sun, 13 Apr 2008 22:07:18 +0000 (22:07 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 13 Apr 2008 22:07:18 +0000 (22:07 -0000)
calls. Instead of failing, use stat() to return the mtime if possible.
(trunk r9863:9865)

svn path=/main/branches/2.1.2/; revision=9875

pym/portage.py

index 8b0c123e5ceb4117850e1aedfc0b9c221a6966f9..482ab8ff2a855be71f5a745bdafd69a3902be1fc 100644 (file)
@@ -5208,11 +5208,22 @@ def movefile(src,dest,newmtime=None,sstat=None,mysettings=None):
                        print "!!!",e
                        return None
 
-       if newmtime:
-               os.utime(dest,(newmtime,newmtime))
-       else:
-               os.utime(dest, (sstat[stat.ST_ATIME], sstat[stat.ST_MTIME]))
-               newmtime=sstat[stat.ST_MTIME]
+       try:
+               if newmtime is not None:
+                       os.utime(dest, (newmtime, newmtime))
+               else:
+                       os.utime(dest, (sstat.st_atime, sstat.st_mtime))
+                       newmtime = long(sstat.st_mtime)
+       except OSError:
+               # The utime can fail here with EPERM even though the move succeeded.
+               # Instead of failing, use stat to return the mtime if possible.
+               try:
+                       newmtime = long(os.stat(dest).st_mtime)
+               except OSError, e:
+                       writemsg("!!! Failed to stat in movefile()\n", noiselevel=-1)
+                       writemsg("!!! %s\n" % dest, noiselevel=-1)
+                       writemsg("!!! %s\n" % str(e), noiselevel=-1)
+                       return None
 
        if bsd_chflags:
                # Restore the flags we saved before moving