annotate Lib/lib-old/cmpcache.py @ 25838:8540887bcec6 2.2

Backport of 2.183: Fix memory leak in add_subclass() found by NealN with valgrind.
author Guido van Rossum <guido@python.org>
date Fri, 18 Oct 2002 13:42:21 +0000
parents 9d43129c8c55
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11698
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
1 """Efficiently compare files, boolean outcome only (equal / not equal).
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
2
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
3 Tricks (used in this order):
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
4 - Use the statcache module to avoid statting files more than once
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
5 - Files with identical type, size & mtime are assumed to be clones
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
6 - Files with different type or size cannot be identical
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
7 - We keep a cache of outcomes of earlier comparisons
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
8 - We don't fork a process to run 'cmp' but read the files ourselves
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
9 """
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
10
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
11 import os
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
12 from stat import *
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
13 import statcache
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
14
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
15
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
16 # The cache.
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
17 #
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
18 cache = {}
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
19
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
20
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
21 def cmp(f1, f2, shallow=1):
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
22 """Compare two files, use the cache if possible.
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
23 May raise os.error if a stat or open of either fails.
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
24 Return 1 for identical files, 0 for different.
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
25 Raise exceptions if either file could not be statted, read, etc."""
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
26 s1, s2 = sig(statcache.stat(f1)), sig(statcache.stat(f2))
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
27 if not S_ISREG(s1[0]) or not S_ISREG(s2[0]):
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
28 # Either is a not a plain file -- always report as different
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
29 return 0
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
30 if shallow and s1 == s2:
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
31 # type, size & mtime match -- report same
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
32 return 1
15540
9d43129c8c55 Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents: 11698
diff changeset
33 if s1[:2] != s2[:2]: # Types or sizes differ, don't bother
11698
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
34 # types or sizes differ -- report different
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
35 return 0
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
36 # same type and size -- look in the cache
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
37 key = f1 + ' ' + f2
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
38 if cache.has_key(key):
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
39 cs1, cs2, outcome = cache[key]
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
40 # cache hit
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
41 if s1 == cs1 and s2 == cs2:
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
42 # cached signatures match
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
43 return outcome
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
44 # stale cached signature(s)
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
45 # really compare
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
46 outcome = do_cmp(f1, f2)
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
47 cache[key] = s1, s2, outcome
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
48 return outcome
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
49
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
50 def sig(st):
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
51 """Return signature (i.e., type, size, mtime) from raw stat data."""
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
52 return S_IFMT(st[ST_MODE]), st[ST_SIZE], st[ST_MTIME]
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
53
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
54 def do_cmp(f1, f2):
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
55 """Compare two files, really."""
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
56 #print ' cmp', f1, f2 # XXX remove when debugged
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
57 bufsize = 8*1024 # Could be tuned
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
58 fp1 = open(f1, 'rb')
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
59 fp2 = open(f2, 'rb')
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
60 while 1:
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
61 b1 = fp1.read(bufsize)
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
62 b2 = fp2.read(bufsize)
15540
9d43129c8c55 Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents: 11698
diff changeset
63 if b1 != b2: return 0
11698
dacaa34dfca4 These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
64 if not b1: return 1