Update to 2.7.3
[profile/ivi/python.git] / Tools / scripts / checkpyc.py
1 #! /usr/bin/env python
2 # Check that all ".pyc" files exist and are up-to-date
3 # Uses module 'os'
4
5 import sys
6 import os
7 from stat import ST_MTIME
8 import imp
9
10 def main():
11     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:
20         print 'Using MAGIC word', repr(MAGIC)
21     for dirname in sys.path:
22         try:
23             names = os.listdir(dirname)
24         except os.error:
25             print 'Cannot list directory', repr(dirname)
26             continue
27         if not silent:
28             print 'Checking ', repr(dirname), '...'
29         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:
36                     print 'Cannot stat', repr(name)
37                     continue
38                 if verbose:
39                     print 'Check', repr(name), '...'
40                 name_c = name + 'c'
41                 try:
42                     f = open(name_c, 'r')
43                 except IOError:
44                     print 'Cannot open', repr(name_c)
45                     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',
51                     print repr(name_c)
52                     continue
53                 mtime = get_long(mtime_str)
54                 if mtime == 0 or mtime == -1:
55                     print 'Bad ".pyc" file', repr(name_c)
56                 elif mtime <> st[ST_MTIME]:
57                     print 'Out-of-date ".pyc" file',
58                     print repr(name_c)
59
60 def get_long(s):
61     if len(s) <> 4:
62         return -1
63     return ord(s[0]) + (ord(s[1])<<8) + (ord(s[2])<<16) + (ord(s[3])<<24)
64
65 if __name__ == '__main__':
66     main()