Mercurial > cpython-lru_cache-weakref
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 |
| 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 |
