Home | History | Annotate | Download | only in scripts
      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()
     67