annotate Lib/filecmp.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 bae889f44cd1
children a9dd5e6d6805
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
1 """Utilities for comparing files and directories.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
2
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
3 Classes:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
4 dircmp
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
6 Functions:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
7 cmp(f1, f2, shallow=1, use_statcache=0) -> int
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
8 cmpfiles(a, b, common) -> ([], [], [])
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
9
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
10 """
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
11
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
12 import os
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
13 import stat
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
14 import statcache
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
16072
bae889f44cd1 more __all__ updates
Skip Montanaro <skip@pobox.com>
parents: 15867
diff changeset
16 __all__ = ["cmp","dircmp","cmpfiles"]
bae889f44cd1 more __all__ updates
Skip Montanaro <skip@pobox.com>
parents: 15867
diff changeset
17
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 _cache = {}
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 BUFSIZE=8*1024
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
13316
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
21 def cmp(f1, f2, shallow=1, use_statcache=0):
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
22 """Compare two files.
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
24 Arguments:
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
26 f1 -- First file name
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
27
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
28 f2 -- Second file name
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
30 shallow -- Just check stat signature (do not read the files).
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
31 defaults to 1.
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
33 use_statcache -- Do not stat() each file directly: go through
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
34 the statcache module for more efficiency.
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
36 Return value:
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
37
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
38 integer -- 1 if the files are the same, 0 otherwise.
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
39
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
40 This function uses a cache for past comparisons and the results,
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
41 with a cache invalidation mechanism relying on stale signatures.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
42 Of course, if 'use_statcache' is true, this mechanism is defeated,
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
43 and the cache will never grow stale.
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
45 """
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
46 if use_statcache:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
47 stat_function = statcache.stat
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
48 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
49 stat_function = os.stat
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
50 s1 = _sig(stat_function(f1))
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
51 s2 = _sig(stat_function(f2))
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
52 if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
53 return 0
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
54 if shallow and s1 == s2:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
55 return 1
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
56 if s1[1] != s2[1]:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
57 return 0
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
58
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
59 result = _cache.get((f1, f2))
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
60 if result and (s1, s2) == result[:2]:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
61 return result[2]
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
62 outcome = _do_cmp(f1, f2)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
63 _cache[f1, f2] = s1, s2, outcome
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
64 return outcome
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
65
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 def _sig(st):
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
67 return (stat.S_IFMT(st[stat.ST_MODE]),
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
68 st[stat.ST_SIZE],
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
69 st[stat.ST_MTIME])
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
70
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 def _do_cmp(f1, f2):
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
72 bufsize = BUFSIZE
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
73 fp1 = open(f1, 'rb')
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
74 fp2 = open(f2, 'rb')
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
75 while 1:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
76 b1 = fp1.read(bufsize)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
77 b2 = fp2.read(bufsize)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
78 if b1 != b2:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
79 return 0
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
80 if not b1:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
81 return 1
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
82
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
83 # Directory comparison class.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
84 #
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
85 class dircmp:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
86 """A class that manages the comparison of 2 directories.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
87
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
88 dircmp(a,b,ignore=None,hide=None)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
89 A and B are directories.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
90 IGNORE is a list of names to ignore,
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
91 defaults to ['RCS', 'CVS', 'tags'].
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
92 HIDE is a list of names to hide,
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
93 defaults to [os.curdir, os.pardir].
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
94
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
95 High level usage:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
96 x = dircmp(dir1, dir2)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
97 x.report() -> prints a report on the differences between dir1 and dir2
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
98 or
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
99 x.report_partial_closure() -> prints report on differences between dir1
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
100 and dir2, and reports on common immediate subdirectories.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
101 x.report_full_closure() -> like report_partial_closure,
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
102 but fully recursive.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
103
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
104 Attributes:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
105 left_list, right_list: The files in dir1 and dir2,
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
106 filtered by hide and ignore.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
107 common: a list of names in both dir1 and dir2.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
108 left_only, right_only: names only in dir1, dir2.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
109 common_dirs: subdirectories in both dir1 and dir2.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
110 common_files: files in both dir1 and dir2.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
111 common_funny: names in both dir1 and dir2 where the type differs between
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
112 dir1 and dir2, or the name is not stat-able.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
113 same_files: list of identical files.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
114 diff_files: list of filenames which differ.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
115 funny_files: list of files which could not be compared.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
116 subdirs: a dictionary of dircmp objects, keyed by names in common_dirs.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
117 """
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
118
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
119 def __init__(self, a, b, ignore=None, hide=None): # Initialize
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
120 self.left = a
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
121 self.right = b
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
122 if hide is None:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
123 self.hide = [os.curdir, os.pardir] # Names never to be shown
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
124 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
125 self.hide = hide
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
126 if ignore is None:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
127 self.ignore = ['RCS', 'CVS', 'tags'] # Names ignored in comparison
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
128 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
129 self.ignore = ignore
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
130
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
131 def phase0(self): # Compare everything except common subdirectories
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
132 self.left_list = _filter(os.listdir(self.left),
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
133 self.hide+self.ignore)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
134 self.right_list = _filter(os.listdir(self.right),
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
135 self.hide+self.ignore)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
136 self.left_list.sort()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
137 self.right_list.sort()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
138
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
139 __p4_attrs = ('subdirs',)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
140 __p3_attrs = ('same_files', 'diff_files', 'funny_files')
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
141 __p2_attrs = ('common_dirs', 'common_files', 'common_funny')
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
142 __p1_attrs = ('common', 'left_only', 'right_only')
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
143 __p0_attrs = ('left_list', 'right_list')
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
144
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
145 def __getattr__(self, attr):
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
146 if attr in self.__p4_attrs:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
147 self.phase4()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
148 elif attr in self.__p3_attrs:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
149 self.phase3()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
150 elif attr in self.__p2_attrs:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
151 self.phase2()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
152 elif attr in self.__p1_attrs:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
153 self.phase1()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
154 elif attr in self.__p0_attrs:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
155 self.phase0()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
156 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
157 raise AttributeError, attr
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
158 return getattr(self, attr)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
159
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
160 def phase1(self): # Compute common names
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
161 a_only, b_only = [], []
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
162 common = {}
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
163 b = {}
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
164 for fnm in self.right_list:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
165 b[fnm] = 1
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
166 for x in self.left_list:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
167 if b.get(x, 0):
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
168 common[x] = 1
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
169 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
170 a_only.append(x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
171 for x in self.right_list:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
172 if common.get(x, 0):
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
173 pass
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
174 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
175 b_only.append(x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
176 self.common = common.keys()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
177 self.left_only = a_only
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
178 self.right_only = b_only
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
179
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
180 def phase2(self): # Distinguish files, directories, funnies
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
181 self.common_dirs = []
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
182 self.common_files = []
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
183 self.common_funny = []
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
184
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
185 for x in self.common:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
186 a_path = os.path.join(self.left, x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
187 b_path = os.path.join(self.right, x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
188
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
189 ok = 1
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
190 try:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
191 a_stat = statcache.stat(a_path)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
192 except os.error, why:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
193 # print 'Can\'t stat', a_path, ':', why[1]
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
194 ok = 0
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
195 try:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
196 b_stat = statcache.stat(b_path)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
197 except os.error, why:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
198 # print 'Can\'t stat', b_path, ':', why[1]
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
199 ok = 0
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
200
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
201 if ok:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
202 a_type = stat.S_IFMT(a_stat[stat.ST_MODE])
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
203 b_type = stat.S_IFMT(b_stat[stat.ST_MODE])
15543
785155e2cfca Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents: 15469
diff changeset
204 if a_type != b_type:
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
205 self.common_funny.append(x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
206 elif stat.S_ISDIR(a_type):
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
207 self.common_dirs.append(x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
208 elif stat.S_ISREG(a_type):
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
209 self.common_files.append(x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
210 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
211 self.common_funny.append(x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
212 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
213 self.common_funny.append(x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
214
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
215 def phase3(self): # Find out differences between common files
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
216 xx = cmpfiles(self.left, self.right, self.common_files)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
217 self.same_files, self.diff_files, self.funny_files = xx
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
218
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
219 def phase4(self): # Find out differences between common subdirectories
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
220 # A new dircmp object is created for each common subdirectory,
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
221 # these are stored in a dictionary indexed by filename.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
222 # The hide and ignore properties are inherited from the parent
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
223 self.subdirs = {}
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
224 for x in self.common_dirs:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
225 a_x = os.path.join(self.left, x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
226 b_x = os.path.join(self.right, x)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
227 self.subdirs[x] = dircmp(a_x, b_x, self.ignore, self.hide)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
228
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
229 def phase4_closure(self): # Recursively call phase4() on subdirectories
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
230 self.phase4()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
231 for x in self.subdirs.keys():
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
232 self.subdirs[x].phase4_closure()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
233
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
234 def report(self): # Print a report on the differences between a and b
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
235 # Output format is purposely lousy
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
236 print 'diff', self.left, self.right
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
237 if self.left_only:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
238 self.left_only.sort()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
239 print 'Only in', self.left, ':', self.left_only
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
240 if self.right_only:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
241 self.right_only.sort()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
242 print 'Only in', self.right, ':', self.right_only
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
243 if self.same_files:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
244 self.same_files.sort()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
245 print 'Identical files :', self.same_files
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
246 if self.diff_files:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
247 self.diff_files.sort()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
248 print 'Differing files :', self.diff_files
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
249 if self.funny_files:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
250 self.funny_files.sort()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
251 print 'Trouble with common files :', self.funny_files
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
252 if self.common_dirs:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
253 self.common_dirs.sort()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
254 print 'Common subdirectories :', self.common_dirs
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
255 if self.common_funny:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
256 self.common_funny.sort()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
257 print 'Common funny cases :', self.common_funny
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
258
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
259 def report_partial_closure(self): # Print reports on self and on subdirs
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
260 self.report()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
261 for x in self.subdirs.keys():
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
262 print
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
263 self.subdirs[x].report()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
264
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
265 def report_full_closure(self): # Report on self and subdirs recursively
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
266 self.report()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
267 for x in self.subdirs.keys():
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
268 print
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
269 self.subdirs[x].report_full_closure()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
270
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
271
13316
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
272 def cmpfiles(a, b, common, shallow=1, use_statcache=0):
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
273 """Compare common files in two directories.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
274
13316
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
275 a, b -- directory names
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
276 common -- list of file names found in both directories
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
277 shallow -- if true, do comparison based solely on stat() information
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
278 use_statcache -- if true, use statcache.stat() instead of os.stat()
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
279
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
280 Returns a tuple of three lists:
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
281 files that compare equal
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
282 files that are different
13316
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
283 filenames that aren't regular files.
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
284
13316
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
285 """
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
286 res = ([], [], [])
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
287 for x in common:
13316
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
288 ax = os.path.join(a, x)
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
289 bx = os.path.join(b, x)
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
290 res[_cmp(ax, bx, shallow, use_statcache)].append(x)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
291 return res
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
292
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
293
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
294 # Compare two files.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
295 # Return:
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15543
diff changeset
296 # 0 for equal
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15543
diff changeset
297 # 1 for different
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15543
diff changeset
298 # 2 for funny cases (can't stat, etc.)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
299 #
15469
ac220c31ddd7 Call of _cmp had wrong number of paramereters.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13316
diff changeset
300 def _cmp(a, b, sh, st):
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
301 try:
15469
ac220c31ddd7 Call of _cmp had wrong number of paramereters.
Moshe Zadka <moshez@math.huji.ac.il>
parents: 13316
diff changeset
302 return not abs(cmp(a, b, sh, st))
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
303 except os.error:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
304 return 2
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
305
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
306
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
307 # Return a copy with items that occur in skip removed.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
308 #
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
309 def _filter(list, skip):
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
310 result = []
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
311 for item in list:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
312 if item not in skip: result.append(item)
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
313 return result
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
314
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
315
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
316 # Demonstration and testing.
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
317 #
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
318 def demo():
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
319 import sys
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
320 import getopt
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
321 options, args = getopt.getopt(sys.argv[1:], 'r')
15543
785155e2cfca Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents: 15469
diff changeset
322 if len(args) != 2:
785155e2cfca Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents: 15469
diff changeset
323 raise getopt.error, 'need exactly two args'
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
324 dd = dircmp(args[0], args[1])
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
325 if ('-r', '') in options:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
326 dd.report_full_closure()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
327 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
328 dd.report()
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
329
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
330 if __name__ == '__main__':
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
331 demo()