Mercurial > cpython-lru_cache-weakref
annotate Lib/lib-old/cmp.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 - 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
|
5 - Files with different type or size cannot be identical |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
6 - We keep a cache of outcomes of earlier comparisons |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
7 - 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
|
8 """ |
|
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 import os |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
11 |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
12 cache = {} |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
13 |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
14 def cmp(f1, f2, shallow=1): |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
15 """Compare two files, use the cache if possible. |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
16 Return 1 for identical files, 0 for different. |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
17 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
|
18 s1, s2 = sig(os.stat(f1)), sig(os.stat(f2)) |
|
15540
9d43129c8c55
Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents:
11698
diff
changeset
|
19 if s1[0] != 8 or s2[0] != 8: |
|
11698
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
20 # 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
|
21 return 0 |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
22 if shallow and s1 == s2: |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
23 # type, size & mtime match -- report same |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
24 return 1 |
|
15540
9d43129c8c55
Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents:
11698
diff
changeset
|
25 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
|
26 # types or sizes differ -- report different |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
27 return 0 |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
28 # same type and size -- look in the cache |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
29 key = (f1, f2) |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
30 try: |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
31 cs1, cs2, outcome = cache[key] |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
32 # cache hit |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
33 if s1 == cs1 and s2 == cs2: |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
34 # cached signatures match |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
35 return outcome |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
36 # stale cached signature(s) |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
37 except KeyError: |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
38 # cache miss |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
39 pass |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
40 # really compare |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
41 outcome = do_cmp(f1, f2) |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
42 cache[key] = s1, s2, outcome |
|
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 |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
45 def sig(st): |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
46 """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
|
47 0-5: st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
48 6-9: st_size, st_atime, st_mtime, st_ctime""" |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
49 type = st[0] / 4096 |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
50 size = st[6] |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
51 mtime = st[8] |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
52 return type, size, 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 bufsize = 8*1024 # Could be tuned |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
57 fp1 = open(f1, 'rb') |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
58 fp2 = open(f2, 'rb') |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
59 while 1: |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
60 b1 = fp1.read(bufsize) |
|
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
61 b2 = fp2.read(bufsize) |
|
15540
9d43129c8c55
Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents:
11698
diff
changeset
|
62 if b1 != b2: return 0 |
|
11698
dacaa34dfca4
These modules are now declared obsolete.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
63 if not b1: return 1 |
