diff options
author | Zac Medico <zmedico@gentoo.org> | 2009-12-10 00:09:53 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2009-12-10 00:09:53 +0000 |
commit | 187badbd25b01e639a7a36fb128925d2c740985b (patch) | |
tree | aa4acf29a1956a7a7e6ed72ceefc720ec5b34053 | |
parent | ded920f3592e35452217857ab562bc99d1c9317d (diff) | |
download | portage-187badbd25b01e639a7a36fb128925d2c740985b.tar.gz portage-187badbd25b01e639a7a36fb128925d2c740985b.tar.bz2 portage-187badbd25b01e639a7a36fb128925d2c740985b.zip |
Detect cases when long(stat_obj.st_mtime) != stat_obj[stat.ST_MTIME] due to
rounding up, and truncate digits as necessary to preserve the integral seconds
portion of the mtime.
svn path=/main/trunk/; revision=14996
-rw-r--r-- | pym/portage/__init__.py | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 2876c6b8c..d7917dc5f 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -7640,7 +7640,25 @@ def movefile(src, dest, newmtime=None, sstat=None, mysettings=None, # If rename succeeded then this is not necessary, since # rename automatically preserves timestamps with complete # precision. - os.utime(dest, (sstat.st_atime, sstat.st_mtime)) + if sstat[stat.ST_MTIME] == long(sstat.st_mtime): + newmtime = sstat.st_mtime + else: + # Prevent mtime from rounding up to the next second. + int_mtime = sstat[stat.ST_MTIME] + mtime_str = "%i.9999999" % int_mtime + min_len = len(str(int_mtime)) + 2 + while True: + mtime_str = mtime_str[:-1] + newmtime = float(mtime_str) + if int_mtime == long(newmtime): + break + elif len(mtime_str) <= min_len: + # This shouldn't happen, but let's make sure + # we can never have an infinite loop. + newmtime = int_mtime + break + + os.utime(dest, (newmtime, newmtime)) newmtime = sstat[stat.ST_MTIME] except OSError: # The utime can fail here with EPERM even though the move succeeded. |