checkpyc.py revision a635b9a6ffac357f1e296f6c6954b5e6280e6eea
1#! /usr/local/bin/python
2# Check that all ".pyc" files exist and are up-to-date
3# Uses module 'os'
4
5import sys
6import os
7from stat import ST_MTIME
8
9def main():
10	silent = 0
11	verbose = 0
12	if sys.argv[1:]:
13		if sys.argv[1] == '-v':
14			verbose = 1
15		elif sys.argv[1] == '-s':
16			silent = 1
17	MAGIC = '\0\0\0\0'
18	try:
19		if sys.version[:5] >= '0.9.4':
20			MAGIC = '\224\224\224\0'
21	except:
22		pass
23	if not silent:
24		print 'Using MAGIC word', `MAGIC`
25	for dirname in sys.path:
26		try:
27			names = os.listdir(dirname)
28		except os.error:
29			print 'Cannot list directory', `dirname`
30			continue
31		if not silent:
32			print 'Checking', `dirname`, '...'
33		names.sort()
34		for name in names:
35			if name[-3:] == '.py':
36				name = os.path.join(dirname, name)
37				try:
38					st = os.stat(name)
39				except os.error:
40					print 'Cannot stat', `name`
41					continue
42				if verbose:
43					print 'Check', `name`, '...'
44				name_c = name + 'c'
45				try:
46					f = open(name_c, 'r')
47				except IOError:
48					print 'Cannot open', `name_c`
49					continue
50				magic_str = f.read(4)
51				mtime_str = f.read(4)
52				f.close()
53				if magic_str <> MAGIC:
54					print 'Bad MAGIC word in ".pyc" file',
55					print `name_c`
56					continue
57				mtime = get_long(mtime_str)
58				if mtime == 0 or mtime == -1:
59					print 'Bad ".pyc" file', `name_c`
60				elif mtime <> st[ST_MTIME]:
61					print 'Out-of-date ".pyc" file',
62					print `name_c`
63
64def get_long(s):
65	if len(s) <> 4:
66		return -1
67	return ord(s[0]) + (ord(s[1])<<8) + (ord(s[2])<<16) + (ord(s[3])<<24)
68
69main()
70