summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2009-12-12 07:44:16 +0000
committerZac Medico <zmedico@gentoo.org>2009-12-12 07:44:16 +0000
commita55db3e249485b5d01e4a131e4f1b20d4418fc53 (patch)
tree25d7557b1136034258bf4a8951eff542a0ec8d7c
parent655a97d6c26826f05b9e48f25fd511fef600f701 (diff)
downloadportage-a55db3e249485b5d01e4a131e4f1b20d4418fc53.tar.gz
portage-a55db3e249485b5d01e4a131e4f1b20d4418fc53.tar.bz2
portage-a55db3e249485b5d01e4a131e4f1b20d4418fc53.zip
In movefile mtime rounding code, generate nanosecond resolution (9 decimal
places) in order to ensure that the floating point representation is the highest value possible without rounding up. svn path=/main/trunk/; revision=15046
-rw-r--r--pym/portage/__init__.py36
1 files changed, 15 insertions, 21 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index 062f38a39..646295fee 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -7671,29 +7671,23 @@ def movefile(src, dest, newmtime=None, sstat=None, mysettings=None,
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
- digits = 0
- max_digits = 9
- while digits < max_digits:
- if int_mtime == long(float(mtime_str + "9")):
- mtime_str += "9"
- digits += 1
- else:
- if digits < max_digits:
- another_digit = None
- for i in range(1, 9):
- i_str = str(i)
- if int_mtime != \
- long(float(mtime_str + i_str)):
- break
- else:
- another_digit = i_str
- if another_digit is not None:
- mtime_str += another_digit
- digits += 1
- break
- if digits > 0:
+ nonzero_digits = 0
+ decimal_places = 9
+ for i in range(max_digits):
+ 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