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