blob: bbaa3d1328fe52f2960a78a1fda10ddae104950d [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossum5378d5c1991-12-18 13:38:27 +00002# Check that all ".pyc" files exist and are up-to-date
Guido van Rossum9a6757d1992-03-30 11:15:26 +00003# Uses module 'os'
Guido van Rossum5378d5c1991-12-18 13:38:27 +00004
5import sys
Guido van Rossum9a6757d1992-03-30 11:15:26 +00006import os
Guido van Rossum5378d5c1991-12-18 13:38:27 +00007from stat import ST_MTIME
Brett Cannon53e600c2013-06-15 18:10:18 -04008import importlib.util
Guido van Rossum5378d5c1991-12-18 13:38:27 +00009
Florent Xiclunac7eaede2010-08-09 12:26:44 +000010# PEP 3147 compatibility (PYC Repository Directories)
Brett Cannon53e600c2013-06-15 18:10:18 -040011cache_from_source = (importlib.util.cache_from_source if sys.implementation.cache_tag
12 else lambda path: path + 'c')
Florent Xiclunac7eaede2010-08-09 12:26:44 +000013
14
Guido van Rossum5378d5c1991-12-18 13:38:27 +000015def main():
Florent Xiclunac7eaede2010-08-09 12:26:44 +000016 if len(sys.argv) > 1:
17 verbose = (sys.argv[1] == '-v')
18 silent = (sys.argv[1] == '-s')
19 else:
20 verbose = silent = False
Brett Cannon53e600c2013-06-15 18:10:18 -040021 MAGIC = importlib.util.MAGIC_NUMBER
Tim Peters70c43782001-01-17 08:48:39 +000022 if not silent:
Collin Winter6afaeb72007-08-03 17:06:41 +000023 print('Using MAGIC word', repr(MAGIC))
Tim Peters70c43782001-01-17 08:48:39 +000024 for dirname in sys.path:
25 try:
26 names = os.listdir(dirname)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +020027 except OSError:
Collin Winter6afaeb72007-08-03 17:06:41 +000028 print('Cannot list directory', repr(dirname))
Tim Peters70c43782001-01-17 08:48:39 +000029 continue
30 if not silent:
Collin Winter6afaeb72007-08-03 17:06:41 +000031 print('Checking ', repr(dirname), '...')
Florent Xiclunac7eaede2010-08-09 12:26:44 +000032 for name in sorted(names):
33 if name.endswith('.py'):
Tim Peters70c43782001-01-17 08:48:39 +000034 name = os.path.join(dirname, name)
35 try:
36 st = os.stat(name)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +020037 except OSError:
Collin Winter6afaeb72007-08-03 17:06:41 +000038 print('Cannot stat', repr(name))
Tim Peters70c43782001-01-17 08:48:39 +000039 continue
40 if verbose:
Collin Winter6afaeb72007-08-03 17:06:41 +000041 print('Check', repr(name), '...')
Florent Xiclunac7eaede2010-08-09 12:26:44 +000042 name_c = cache_from_source(name)
Tim Peters70c43782001-01-17 08:48:39 +000043 try:
Florent Xiclunac7eaede2010-08-09 12:26:44 +000044 with open(name_c, 'rb') as f:
45 magic_str = f.read(4)
46 mtime_str = f.read(4)
Tim Peters70c43782001-01-17 08:48:39 +000047 except IOError:
Collin Winter6afaeb72007-08-03 17:06:41 +000048 print('Cannot open', repr(name_c))
Tim Peters70c43782001-01-17 08:48:39 +000049 continue
Georg Brandl8efadf52008-05-16 15:23:30 +000050 if magic_str != MAGIC:
Collin Winter6afaeb72007-08-03 17:06:41 +000051 print('Bad MAGIC word in ".pyc" file', end=' ')
52 print(repr(name_c))
Tim Peters70c43782001-01-17 08:48:39 +000053 continue
54 mtime = get_long(mtime_str)
Florent Xiclunac7eaede2010-08-09 12:26:44 +000055 if mtime in {0, -1}:
Collin Winter6afaeb72007-08-03 17:06:41 +000056 print('Bad ".pyc" file', repr(name_c))
Georg Brandl8efadf52008-05-16 15:23:30 +000057 elif mtime != st[ST_MTIME]:
Collin Winter6afaeb72007-08-03 17:06:41 +000058 print('Out-of-date ".pyc" file', end=' ')
59 print(repr(name_c))
Guido van Rossum5378d5c1991-12-18 13:38:27 +000060
Florent Xiclunac7eaede2010-08-09 12:26:44 +000061
Guido van Rossum5378d5c1991-12-18 13:38:27 +000062def get_long(s):
Georg Brandl8efadf52008-05-16 15:23:30 +000063 if len(s) != 4:
Tim Peters70c43782001-01-17 08:48:39 +000064 return -1
Florent Xiclunac7eaede2010-08-09 12:26:44 +000065 return s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24)
66
Guido van Rossum5378d5c1991-12-18 13:38:27 +000067
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000068if __name__ == '__main__':
69 main()