blob: 8af76726ad648b23c5bec2abd3e893add28d6ce1 [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
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
Guido van Rossum19b23e51998-10-07 19:45:33 +00008import imp
Guido van Rossum5378d5c1991-12-18 13:38:27 +00009
10def main():
Tim Peters70c43782001-01-17 08:48:39 +000011 silent = 0
12 verbose = 0
13 if sys.argv[1:]:
14 if sys.argv[1] == '-v':
15 verbose = 1
16 elif sys.argv[1] == '-s':
17 silent = 1
18 MAGIC = imp.get_magic()
19 if not silent:
Walter Dörwald70a6b492004-02-12 17:35:32 +000020 print 'Using MAGIC word', repr(MAGIC)
Tim Peters70c43782001-01-17 08:48:39 +000021 for dirname in sys.path:
22 try:
23 names = os.listdir(dirname)
24 except os.error:
Walter Dörwald70a6b492004-02-12 17:35:32 +000025 print 'Cannot list directory', repr(dirname)
Tim Peters70c43782001-01-17 08:48:39 +000026 continue
27 if not silent:
Walter Dörwald70a6b492004-02-12 17:35:32 +000028 print 'Checking ', repr(dirname), '...'
Tim Peters70c43782001-01-17 08:48:39 +000029 names.sort()
30 for name in names:
31 if name[-3:] == '.py':
32 name = os.path.join(dirname, name)
33 try:
34 st = os.stat(name)
35 except os.error:
Walter Dörwald70a6b492004-02-12 17:35:32 +000036 print 'Cannot stat', repr(name)
Tim Peters70c43782001-01-17 08:48:39 +000037 continue
38 if verbose:
Walter Dörwald70a6b492004-02-12 17:35:32 +000039 print 'Check', repr(name), '...'
Tim Peters70c43782001-01-17 08:48:39 +000040 name_c = name + 'c'
41 try:
42 f = open(name_c, 'r')
43 except IOError:
Walter Dörwald70a6b492004-02-12 17:35:32 +000044 print 'Cannot open', repr(name_c)
Tim Peters70c43782001-01-17 08:48:39 +000045 continue
46 magic_str = f.read(4)
47 mtime_str = f.read(4)
48 f.close()
49 if magic_str <> MAGIC:
50 print 'Bad MAGIC word in ".pyc" file',
Walter Dörwald70a6b492004-02-12 17:35:32 +000051 print repr(name_c)
Tim Peters70c43782001-01-17 08:48:39 +000052 continue
53 mtime = get_long(mtime_str)
54 if mtime == 0 or mtime == -1:
Walter Dörwald70a6b492004-02-12 17:35:32 +000055 print 'Bad ".pyc" file', repr(name_c)
Tim Peters70c43782001-01-17 08:48:39 +000056 elif mtime <> st[ST_MTIME]:
57 print 'Out-of-date ".pyc" file',
Walter Dörwald70a6b492004-02-12 17:35:32 +000058 print repr(name_c)
Guido van Rossum5378d5c1991-12-18 13:38:27 +000059
60def get_long(s):
Tim Peters70c43782001-01-17 08:48:39 +000061 if len(s) <> 4:
62 return -1
63 return ord(s[0]) + (ord(s[1])<<8) + (ord(s[2])<<16) + (ord(s[3])<<24)
Guido van Rossum5378d5c1991-12-18 13:38:27 +000064
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000065if __name__ == '__main__':
66 main()