summaryrefslogtreecommitdiffstats
path: root/Tools/scripts/checkpyc.py
blob: 54396a309146b33400e4377567c437e6b9fcacd4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Check that all ".pyc" files exist and are up-to-date
# Uses module 'posix'

import sys
import posix
import path
from stat import ST_MTIME

def main():
	silent = 0
	verbose = 0
	if sys.argv[1:]:
		if sys.argv[1] == '-v':
			verbose = 1
		elif sys.argv[1] == '-s':
			silent = 1
	MAGIC = '\0\0\0\0'
	try:
		if sys.version[:5] >= '0.9.4':
			MAGIC = '\224\224\224\0'
	except:
		pass
	if not silent:
		print 'Using MAGIC word', `MAGIC`
	for dirname in sys.path:
		try:
			names = posix.listdir(dirname)
		except posix.error:
			print 'Cannot list directory', `dirname`
			continue
		if not silent:
			print 'Checking', `dirname`, '...'
		names.sort()
		for name in names:
			if name[-3:] == '.py':
				name = path.join(dirname, name)
				try:
					st = posix.stat(name)
				except posix.error:
					print 'Cannot stat', `name`
					continue
				if verbose:
					print 'Check', `name`, '...'
				name_c = name + 'c'
				try:
					f = open(name_c, 'r')
				except IOError:
					print 'Cannot open', `name_c`
					continue
				magic_str = f.read(4)
				mtime_str = f.read(4)
				f.close()
				if magic_str <> MAGIC:
					print 'Bad MAGIC word in ".pyc" file',
					print `name_c`
					continue
				mtime = get_long(mtime_str)
				if mtime == 0 or mtime == -1:
					print 'Bad ".pyc" file', `name_c`
				elif mtime <> st[ST_MTIME]:
					print 'Out-of-date ".pyc" file',
					print `name_c`

def get_long(s):
	if len(s) <> 4:
		return -1
	return ord(s[0]) + (ord(s[1])<<8) + (ord(s[2])<<16) + (ord(s[3])<<24)

main()