diff options
author | Zac Medico <zmedico@gentoo.org> | 2009-12-13 03:54:38 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2009-12-13 03:54:38 +0000 |
commit | fec3573d246b14f0d1f57ee1febc7364c580ee7b (patch) | |
tree | d218dee59a478de8d964752e3a19bf95c0c3e62c /pym | |
parent | 98063d065e6e2dce4e86b31ec233a2837cf4fa5c (diff) | |
download | portage-fec3573d246b14f0d1f57ee1febc7364c580ee7b.tar.gz portage-fec3573d246b14f0d1f57ee1febc7364c580ee7b.tar.bz2 portage-fec3573d246b14f0d1f57ee1febc7364c580ee7b.zip |
In movefile mtime preservation code, simply round down to the nearest whole
second since python's float cannot preserve the st_mtim.tv_nsec field with
complete precision. Note that we have to use stat_obj[stat.ST_MTIME] here
because the float stat_obj.st_mtime rounds *up* sometimes. (trunk r15054)
svn path=/main/branches/2.1.7/; revision=15087
Diffstat (limited to 'pym')
-rw-r--r-- | pym/portage/__init__.py | 38 |
1 files changed, 9 insertions, 29 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index d3081373e..8b5e89bb7 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -7657,37 +7657,17 @@ def movefile(src, dest, newmtime=None, sstat=None, mysettings=None, if newmtime is not None: os.utime(dest, (newmtime, newmtime)) else: + newmtime = sstat[stat.ST_MTIME] if renamefailed: - # If rename succeeded then this is not necessary, since - # rename automatically preserves timestamps with complete - # precision. - if sstat[stat.ST_MTIME] == long(sstat.st_mtime): - newmtime = sstat.st_mtime - else: - # Prevent mtime from rounding up to the next second. - # Generate nanosecond resolution (9 decimal places) in - # order to ensure that the floating point representation - # is the highest value possible without rounding up. - int_mtime = sstat[stat.ST_MTIME] - mtime_str = "%i." % int_mtime - nonzero_digits = 0 - decimal_places = 9 - for i in range(decimal_places): - for digit in range(9, -1, -1): - digit_str = str(digit) - if int_mtime == long(float(mtime_str + digit_str)): - break - if digit > 0: - nonzero_digits += 1 - mtime_str += digit_str - - if nonzero_digits > 0: - newmtime = float(mtime_str) - else: - newmtime = int_mtime - + # If rename succeeded then timestamps are automatically + # preserved with complete precision because the source + # and destination inode are the same. Otherwise, round + # down to the nearest whole second since python's float + # st_mtime cannot be used to preserve the st_mtim.tv_nsec + # field with complete precision. Note that we have to use + # stat_obj[stat.ST_MTIME] here because the float + # stat_obj.st_mtime rounds *up* sometimes. os.utime(dest, (newmtime, newmtime)) - newmtime = sstat[stat.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. |