From 187badbd25b01e639a7a36fb128925d2c740985b Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Thu, 10 Dec 2009 00:09:53 +0000 Subject: 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 --- pym/portage/__init__.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 2876c6b8..d7917dc5 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. -- cgit v1.2.3-65-gdbad