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
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 - 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