summaryrefslogtreecommitdiffstats
path: root/Lib/compileall.py
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2009-02-10 02:10:16 (GMT)
committerBrett Cannon <bcannon@gmail.com>2009-02-10 02:10:16 (GMT)
commitbefb14fe2741fb583a059b2b6891c8692c61a5ba (patch)
treeeb920260fc263a81f753d3f25225f82a855924db /Lib/compileall.py
parent6691772ff6ce5dbad9f088a0aeef3aed149900a3 (diff)
downloadcpython-befb14fe2741fb583a059b2b6891c8692c61a5ba.zip
cpython-befb14fe2741fb583a059b2b6891c8692c61a5ba.tar.gz
cpython-befb14fe2741fb583a059b2b6891c8692c61a5ba.tar.bz2
Merged revisions 69481 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r69481 | brett.cannon | 2009-02-09 18:07:38 -0800 (Mon, 09 Feb 2009) | 4 lines compileall used the ctime of bytecode and source to determine if the bytecode should be recreated. This created a timing hole. Fixed by just doing what import does; check the mtime and magic number. ........
Diffstat (limited to 'Lib/compileall.py')
-rw-r--r--Lib/compileall.py22
1 files changed, 15 insertions, 7 deletions
diff --git a/Lib/compileall.py b/Lib/compileall.py
index 541eecf..8c678e4 100644
--- a/Lib/compileall.py
+++ b/Lib/compileall.py
@@ -11,10 +11,11 @@ packages -- for now, you'll have to deal with packages separately.)
See module py_compile for details of the actual byte-compilation.
"""
-
import os
import sys
import py_compile
+import struct
+import imp
__all__ = ["compile_dir","compile_path"]
@@ -54,11 +55,17 @@ def compile_dir(dir, maxlevels=10, ddir=None,
if os.path.isfile(fullname):
head, tail = name[:-3], name[-3:]
if tail == '.py':
- cfile = fullname + (__debug__ and 'c' or 'o')
- ftime = os.stat(fullname).st_mtime
- try: ctime = os.stat(cfile).st_mtime
- except os.error: ctime = 0
- if (ctime > ftime) and not force: continue
+ if not force:
+ try:
+ mtime = os.stat(fullname).st_mtime
+ expect = struct.pack('<4sl', imp.get_magic(), mtime)
+ cfile = fullname + (__debug__ and 'c' or 'o')
+ with open(cfile, 'rb') as chandle:
+ actual = chandle.read(8)
+ if expect == actual:
+ continue
+ except IOError:
+ pass
if not quiet:
print('Compiling', fullname, '...')
try:
@@ -86,7 +93,8 @@ def compile_dir(dir, maxlevels=10, ddir=None,
name != os.curdir and name != os.pardir and \
os.path.isdir(fullname) and \
not os.path.islink(fullname):
- if not compile_dir(fullname, maxlevels - 1, dfile, force, rx, quiet):
+ if not compile_dir(fullname, maxlevels - 1, dfile, force, rx,
+ quiet):
success = 0
return success