annotate Lib/filecmp.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents bfd53dcb02ff
children
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:
54168
fbb33390b254 Use PEP 8 and true booleans.
Georg Brandl <georg@python.org>
parents: 52260
diff changeset
7 cmp(f1, f2, shallow=True) -> int
13126
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) -> ([], [], [])
84124
bfd53dcb02ff Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
Ned Deily <nad@acm.org>
parents: 81449
diff changeset
9 clear_cache()
13126
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
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 os
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 stat
45738
740b5808c57a Move itertools izip() code to builtins as zip(). Complete the renaming.
Raymond Hettinger <python@rcn.com>
parents: 45736
diff changeset
15 from itertools import filterfalse
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
84124
bfd53dcb02ff Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
Ned Deily <nad@acm.org>
parents: 81449
diff changeset
17 __all__ = ['clear_cache', 'cmp', 'dircmp', 'cmpfiles', 'DEFAULT_IGNORES']
16072
bae889f44cd1 more __all__ updates
Skip Montanaro <skip@pobox.com>
parents: 15867
diff changeset
18
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 _cache = {}
54168
fbb33390b254 Use PEP 8 and true booleans.
Georg Brandl <georg@python.org>
parents: 52260
diff changeset
20 BUFSIZE = 8*1024
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
81449
a1efab48d8f8 Close #15442: Expand the list of default directories ignored by filecmp.dircmp and expose it as a module attribute
Eli Bendersky <eliben@gmail.com>
parents: 80843
diff changeset
22 DEFAULT_IGNORES = [
a1efab48d8f8 Close #15442: Expand the list of default directories ignored by filecmp.dircmp and expose it as a module attribute
Eli Bendersky <eliben@gmail.com>
parents: 80843
diff changeset
23 'RCS', 'CVS', 'tags', '.git', '.hg', '.bzr', '_darcs', '__pycache__']
a1efab48d8f8 Close #15442: Expand the list of default directories ignored by filecmp.dircmp and expose it as a module attribute
Eli Bendersky <eliben@gmail.com>
parents: 80843
diff changeset
24
84124
bfd53dcb02ff Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
Ned Deily <nad@acm.org>
parents: 81449
diff changeset
25 def clear_cache():
bfd53dcb02ff Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
Ned Deily <nad@acm.org>
parents: 81449
diff changeset
26 """Clear the filecmp cache."""
bfd53dcb02ff Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
Ned Deily <nad@acm.org>
parents: 81449
diff changeset
27 _cache.clear()
81449
a1efab48d8f8 Close #15442: Expand the list of default directories ignored by filecmp.dircmp and expose it as a module attribute
Eli Bendersky <eliben@gmail.com>
parents: 80843
diff changeset
28
54168
fbb33390b254 Use PEP 8 and true booleans.
Georg Brandl <georg@python.org>
parents: 52260
diff changeset
29 def cmp(f1, f2, shallow=True):
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 """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
31
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
32 Arguments:
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
33
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
34 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
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 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
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 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
39 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
40
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
41 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
42
22830
a9dd5e6d6805 Convert a pile of obvious "yes/no" functions to return bool.
Tim Peters <tim.peters@gmail.com>
parents: 16072
diff changeset
43 True if the files are the same, False otherwise.
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 This function uses a cache for past comparisons and the results,
84124
bfd53dcb02ff Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
Ned Deily <nad@acm.org>
parents: 81449
diff changeset
46 with a cache invalidation mechanism relying on stale signatures
bfd53dcb02ff Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
Ned Deily <nad@acm.org>
parents: 81449
diff changeset
47 or by explicitly calling clear_cache().
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
48
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
49 """
27731
c1ecdde32f86 Add DeprecationWarning when use_statcache argument is supplied
Andrew M. Kuchling <amk@amk.ca>
parents: 27724
diff changeset
50
27724
3982f117679e [Bug #680494] filecmp.py uses obsolete statcache module.
Andrew M. Kuchling <amk@amk.ca>
parents: 23634
diff changeset
51 s1 = _sig(os.stat(f1))
3982f117679e [Bug #680494] filecmp.py uses obsolete statcache module.
Andrew M. Kuchling <amk@amk.ca>
parents: 23634
diff changeset
52 s2 = _sig(os.stat(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
53 if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG:
22830
a9dd5e6d6805 Convert a pile of obvious "yes/no" functions to return bool.
Tim Peters <tim.peters@gmail.com>
parents: 16072
diff changeset
54 return False
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
55 if shallow and s1 == s2:
22830
a9dd5e6d6805 Convert a pile of obvious "yes/no" functions to return bool.
Tim Peters <tim.peters@gmail.com>
parents: 16072
diff changeset
56 return True
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
57 if s1[1] != s2[1]:
22830
a9dd5e6d6805 Convert a pile of obvious "yes/no" functions to return bool.
Tim Peters <tim.peters@gmail.com>
parents: 16072
diff changeset
58 return False
11411
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
70977
2bacaf6a80c4 Issue 11802: filecmp cache was growing without bound.
Raymond Hettinger <python@rcn.com>
parents: 54553
diff changeset
60 outcome = _cache.get((f1, f2, s1, s2))
2bacaf6a80c4 Issue 11802: filecmp cache was growing without bound.
Raymond Hettinger <python@rcn.com>
parents: 54553
diff changeset
61 if outcome is None:
2bacaf6a80c4 Issue 11802: filecmp cache was growing without bound.
Raymond Hettinger <python@rcn.com>
parents: 54553
diff changeset
62 outcome = _do_cmp(f1, f2)
2bacaf6a80c4 Issue 11802: filecmp cache was growing without bound.
Raymond Hettinger <python@rcn.com>
parents: 54553
diff changeset
63 if len(_cache) > 100: # limit the maximum size of the cache
84124
bfd53dcb02ff Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
Ned Deily <nad@acm.org>
parents: 81449
diff changeset
64 clear_cache()
70977
2bacaf6a80c4 Issue 11802: filecmp cache was growing without bound.
Raymond Hettinger <python@rcn.com>
parents: 54553
diff changeset
65 _cache[f1, f2, s1, s2] = outcome
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
66 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
67
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 def _sig(st):
23625
65cf478950ff Replaced obsolete stat module constants with equivalent attributes
Raymond Hettinger <python@rcn.com>
parents: 22830
diff changeset
69 return (stat.S_IFMT(st.st_mode),
65cf478950ff Replaced obsolete stat module constants with equivalent attributes
Raymond Hettinger <python@rcn.com>
parents: 22830
diff changeset
70 st.st_size,
65cf478950ff Replaced obsolete stat module constants with equivalent attributes
Raymond Hettinger <python@rcn.com>
parents: 22830
diff changeset
71 st.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
72
24138ec3f396 New module by Moshe Zadka (submitted on Sept. 25). This unifies the
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 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
74 bufsize = BUFSIZE
54553
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54168
diff changeset
75 with open(f1, 'rb') as fp1, open(f2, 'rb') as fp2:
52260
c6688e9156b5 Merged revisions 70507-70508 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48730
diff changeset
76 while True:
c6688e9156b5 Merged revisions 70507-70508 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48730
diff changeset
77 b1 = fp1.read(bufsize)
c6688e9156b5 Merged revisions 70507-70508 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48730
diff changeset
78 b2 = fp2.read(bufsize)
c6688e9156b5 Merged revisions 70507-70508 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48730
diff changeset
79 if b1 != b2:
c6688e9156b5 Merged revisions 70507-70508 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48730
diff changeset
80 return False
c6688e9156b5 Merged revisions 70507-70508 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48730
diff changeset
81 if not b1:
c6688e9156b5 Merged revisions 70507-70508 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48730
diff changeset
82 return True
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
83
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
84 # 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
85 #
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
86 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
87 """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
88
54168
fbb33390b254 Use PEP 8 and true booleans.
Georg Brandl <georg@python.org>
parents: 52260
diff changeset
89 dircmp(a, b, ignore=None, hide=None)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
90 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
91 IGNORE is a list of names to ignore,
81449
a1efab48d8f8 Close #15442: Expand the list of default directories ignored by filecmp.dircmp and expose it as a module attribute
Eli Bendersky <eliben@gmail.com>
parents: 80843
diff changeset
92 defaults to DEFAULT_IGNORES.
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
93 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
94 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
95
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
96 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
97 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
98 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
99 or
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
100 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
101 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
102 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
103 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
104
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
105 Attributes:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
106 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
107 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
108 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
109 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
110 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
111 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
112 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
113 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
114 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
115 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
116 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
117 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
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
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
120 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
121 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
122 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
123 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
124 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
125 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
126 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
127 if ignore is None:
81449
a1efab48d8f8 Close #15442: Expand the list of default directories ignored by filecmp.dircmp and expose it as a module attribute
Eli Bendersky <eliben@gmail.com>
parents: 80843
diff changeset
128 self.ignore = DEFAULT_IGNORES
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
129 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
130 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
131
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
132 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
133 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
134 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
135 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
136 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
137 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
138 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
139
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
140 def phase1(self): # Compute common names
45738
740b5808c57a Move itertools izip() code to builtins as zip(). Complete the renaming.
Raymond Hettinger <python@rcn.com>
parents: 45736
diff changeset
141 a = dict(zip(map(os.path.normcase, self.left_list), self.left_list))
740b5808c57a Move itertools izip() code to builtins as zip(). Complete the renaming.
Raymond Hettinger <python@rcn.com>
parents: 45736
diff changeset
142 b = dict(zip(map(os.path.normcase, self.right_list), self.right_list))
45734
e09bc1c5295b Issue 2186 and 2187. Move filter from itertools to builtins.
Raymond Hettinger <python@rcn.com>
parents: 44542
diff changeset
143 self.common = list(map(a.__getitem__, filter(b.__contains__, a)))
45736
7752a57f9c49 Rename ifilterfalse() to filterfalse() and izip_longest() to zip_longest().
Raymond Hettinger <python@rcn.com>
parents: 45735
diff changeset
144 self.left_only = list(map(a.__getitem__, filterfalse(b.__contains__, a)))
7752a57f9c49 Rename ifilterfalse() to filterfalse() and izip_longest() to zip_longest().
Raymond Hettinger <python@rcn.com>
parents: 45735
diff changeset
145 self.right_only = list(map(b.__getitem__, filterfalse(a.__contains__, b)))
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
146
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
147 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
148 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
149 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
150 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
151
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
152 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
153 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
154 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
155
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
156 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
157 try:
27724
3982f117679e [Bug #680494] filecmp.py uses obsolete statcache module.
Andrew M. Kuchling <amk@amk.ca>
parents: 23634
diff changeset
158 a_stat = os.stat(a_path)
80843
091e68e08c3c Cleanup filecmp: starting from 3.3 os.error is alias for OSError
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 70977
diff changeset
159 except OSError as why:
44542
d0465e782b01 Fix more exception slicing.
Georg Brandl <georg@python.org>
parents: 43020
diff changeset
160 # print('Can\'t stat', a_path, ':', why.args[1])
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
161 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
162 try:
27724
3982f117679e [Bug #680494] filecmp.py uses obsolete statcache module.
Andrew M. Kuchling <amk@amk.ca>
parents: 23634
diff changeset
163 b_stat = os.stat(b_path)
80843
091e68e08c3c Cleanup filecmp: starting from 3.3 os.error is alias for OSError
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 70977
diff changeset
164 except OSError as why:
44542
d0465e782b01 Fix more exception slicing.
Georg Brandl <georg@python.org>
parents: 43020
diff changeset
165 # print('Can\'t stat', b_path, ':', why.args[1])
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
166 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
167
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
168 if ok:
23625
65cf478950ff Replaced obsolete stat module constants with equivalent attributes
Raymond Hettinger <python@rcn.com>
parents: 22830
diff changeset
169 a_type = stat.S_IFMT(a_stat.st_mode)
65cf478950ff Replaced obsolete stat module constants with equivalent attributes
Raymond Hettinger <python@rcn.com>
parents: 22830
diff changeset
170 b_type = stat.S_IFMT(b_stat.st_mode)
15543
785155e2cfca Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents: 15469
diff changeset
171 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
172 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
173 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
174 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
175 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
176 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
177 else:
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.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
179 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
180 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
181
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
182 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
183 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
184 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
185
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
186 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
187 # 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
188 # 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
189 # 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
190 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
191 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
192 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
193 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
194 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
195
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
196 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
197 self.phase4()
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
198 for sd in self.subdirs.values():
23634
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 23625
diff changeset
199 sd.phase4_closure()
13126
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 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
202 # Output format is purposely lousy
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
203 print('diff', self.left, self.right)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
204 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
205 self.left_only.sort()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
206 print('Only in', self.left, ':', self.left_only)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
207 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
208 self.right_only.sort()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
209 print('Only in', self.right, ':', self.right_only)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
210 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
211 self.same_files.sort()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
212 print('Identical files :', self.same_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
213 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
214 self.diff_files.sort()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
215 print('Differing files :', self.diff_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
216 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
217 self.funny_files.sort()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
218 print('Trouble with common files :', self.funny_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
219 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
220 self.common_dirs.sort()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
221 print('Common subdirectories :', self.common_dirs)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
222 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
223 self.common_funny.sort()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
224 print('Common funny cases :', self.common_funny)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
225
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
226 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
227 self.report()
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
228 for sd in self.subdirs.values():
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
229 print()
23634
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 23625
diff changeset
230 sd.report()
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
231
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
232 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
233 self.report()
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
234 for sd in self.subdirs.values():
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
235 print()
23634
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 23625
diff changeset
236 sd.report_full_closure()
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
237
28084
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
238 methodmap = dict(subdirs=phase4,
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
239 same_files=phase3, diff_files=phase3, funny_files=phase3,
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
240 common_dirs = phase2, common_files=phase2, common_funny=phase2,
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
241 common=phase1, left_only=phase1, right_only=phase1,
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
242 left_list=phase0, right_list=phase0)
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
243
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
244 def __getattr__(self, attr):
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
245 if attr not in self.methodmap:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42142
diff changeset
246 raise AttributeError(attr)
28084
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
247 self.methodmap[attr](self)
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
248 return getattr(self, attr)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
249
54168
fbb33390b254 Use PEP 8 and true booleans.
Georg Brandl <georg@python.org>
parents: 52260
diff changeset
250 def cmpfiles(a, b, common, shallow=True):
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
251 """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
252
13316
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
253 a, b -- directory names
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
254 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
255 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
256
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
257 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
258 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
259 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
260 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
261
13316
fd78bc5f2b2c cmpfiles(): Added shallow and use_statcache parameters, with same meanings
Fred Drake <fdrake@acm.org>
parents: 13126
diff changeset
262 """
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
263 res = ([], [], [])
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
264 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
265 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
266 bx = os.path.join(b, x)
27724
3982f117679e [Bug #680494] filecmp.py uses obsolete statcache module.
Andrew M. Kuchling <amk@amk.ca>
parents: 23634
diff changeset
267 res[_cmp(ax, bx, shallow)].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
268 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
269
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 # 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
272 # Return:
15867
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15543
diff changeset
273 # 0 for equal
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15543
diff changeset
274 # 1 for different
f5a3d98a35bc Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15543
diff changeset
275 # 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
276 #
28084
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
277 def _cmp(a, b, sh, abs=abs, cmp=cmp):
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
278 try:
27724
3982f117679e [Bug #680494] filecmp.py uses obsolete statcache module.
Andrew M. Kuchling <amk@amk.ca>
parents: 23634
diff changeset
279 return not abs(cmp(a, b, sh))
80843
091e68e08c3c Cleanup filecmp: starting from 3.3 os.error is alias for OSError
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 70977
diff changeset
280 except OSError:
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 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
282
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
283
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
284 # 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
285 #
28084
44ba1572518f Module review:
Raymond Hettinger <python@rcn.com>
parents: 27731
diff changeset
286 def _filter(flist, skip):
45736
7752a57f9c49 Rename ifilterfalse() to filterfalse() and izip_longest() to zip_longest().
Raymond Hettinger <python@rcn.com>
parents: 45735
diff changeset
287 return list(filterfalse(skip.__contains__, flist))
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
288
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
289
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
290 # 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
291 #
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
292 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
293 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
294 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
295 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
296 if len(args) != 2:
27731
c1ecdde32f86 Add DeprecationWarning when use_statcache argument is supplied
Andrew M. Kuchling <amk@amk.ca>
parents: 27724
diff changeset
297 raise getopt.GetoptError('need exactly two args', None)
13126
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
298 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
299 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
300 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
301 else:
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
302 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
303
78ad4f64adc5 Whoops! We just discovered that Gordon's revamp of this module was
Guido van Rossum <guido@python.org>
parents: 12080
diff changeset
304 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
305 demo()