From 95b33a342fd332ff845d471587fcdd91394c8505 Mon Sep 17 00:00:00 2001 From: Thomas Nagy Date: Fri, 15 Jun 2012 19:02:32 +0200 Subject: [PATCH] Win32 fixes for Python 2.5 and 3.2 --- waflib/ConfigSet.py | 2 +- waflib/extras/win32_opts.py | 44 ++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/waflib/ConfigSet.py b/waflib/ConfigSet.py index 052c053b..2675e7a8 100644 --- a/waflib/ConfigSet.py +++ b/waflib/ConfigSet.py @@ -296,7 +296,7 @@ class ConfigSet(object): :type filename: string """ tbl = self.table - code = Utils.readf(filename) + code = Utils.readf(filename, m='rU') for m in re_imp.finditer(code): g = m.group tbl[g(2)] = eval(g(3)) diff --git a/waflib/extras/win32_opts.py b/waflib/extras/win32_opts.py index d449ed39..ab85c112 100644 --- a/waflib/extras/win32_opts.py +++ b/waflib/extras/win32_opts.py @@ -12,6 +12,13 @@ try: import cPickle except: import pickle as cPickle from waflib import Utils, Build, Context, Node, Logs +try: + TP = '%s\\*'.decode('ascii') +except AttributeError: + TP = '%s\\*' + +print(type(TP)) + if Utils.is_win32: from waflib.extras import md5_tstamp import ctypes, ctypes.wintypes @@ -41,7 +48,7 @@ if Utils.is_win32: else: # an opportunity to list the files and the timestamps at once findData = ctypes.wintypes.WIN32_FIND_DATAW() - find = FindFirstFile(u'%s\\*' % self.parent.abspath(), ctypes.byref(findData)) + find = FindFirstFile(TP % self.parent.abspath(), ctypes.byref(findData)) if find == INVALID_HANDLE_VALUE: cache[id(self.parent)] = {} @@ -58,27 +65,34 @@ if Utils.is_win32: lst_files[str(findData.cFileName)] = d if not FindNextFile(find, ctypes.byref(findData)): break - except Exception, e: + except Exception as e: cache[id(self.parent)] = {} raise IOError('Not a file') finally: FindClose(find) t = lst_files[self.name] - filename = self.abspath() - if filename in Build.hashes_md5_tstamp: - if Build.hashes_md5_tstamp[filename][0] == t: - return Build.hashes_md5_tstamp[filename][1] - m = Utils.md5() + fname = self.abspath() + if fname in Build.hashes_md5_tstamp: + if Build.hashes_md5_tstamp[fname][0] == t: + return Build.hashes_md5_tstamp[fname][1] - with open(filename, 'rb') as f: - read = 1 - while read: - read = f.read(100000) - m.update(read) + try: + fd = os.open(fname, os.O_BINARY | os.O_RDONLY | os.O_NOINHERIT) + except OSError: + raise IOError('Cannot read from %r' % fname) + f = os.fdopen(fd, 'rb') + m = Utils.md5() + rb = 1 + try: + while rb: + rb = f.read(200000) + m.update(rb) + finally: + f.close() # ensure that the cache is overwritten - Build.hashes_md5_tstamp[filename] = (t, m.digest()) + Build.hashes_md5_tstamp[fname] = (t, m.digest()) return m.digest() Node.Node.cached_hash_file = cached_hash_file @@ -113,7 +127,7 @@ if Utils.is_win32: curpath = self.parent.abspath() findData = ctypes.wintypes.WIN32_FIND_DATAW() - find = FindFirstFile(u'%s\\*' % curpath, ctypes.byref(findData)) + find = FindFirstFile(TP % curpath, ctypes.byref(findData)) if find == INVALID_HANDLE_VALUE: Logs.error("invalid win32 handle isfile_cached %r" % self.abspath()) @@ -127,7 +141,7 @@ if Utils.is_win32: c1.append(str(findData.cFileName)) if not FindNextFile(find, ctypes.byref(findData)): break - except Exception, e: + except Exception as e: Logs.error('exception while listing a folder %r %r' % (self.abspath(), e)) return os.path.isfile(self.abspath()) finally: