@@ -13,19 +13,24 @@ def setUp(self):
13
13
self .name = os_helper .TESTFN
14
14
self .name_same = os_helper .TESTFN + '-same'
15
15
self .name_diff = os_helper .TESTFN + '-diff'
16
+ self .name_same_shallow = os_helper .TESTFN + '-same-shallow'
16
17
data = 'Contents of file go here.\n '
17
18
for name in [self .name , self .name_same , self .name_diff ]:
18
19
with open (name , 'w' , encoding = "utf-8" ) as output :
19
20
output .write (data )
20
21
21
22
with open (self .name_diff , 'a+' , encoding = "utf-8" ) as output :
22
23
output .write ('An extra line.\n ' )
24
+ with open (self .name_same_shallow , 'wb' ) as output :
25
+ # same file size; but different content (i.e. all zero)
26
+ output .write (bytes (len (data .encode ())))
23
27
self .dir = tempfile .gettempdir ()
24
28
25
29
def tearDown (self ):
26
30
os .unlink (self .name )
27
31
os .unlink (self .name_same )
28
32
os .unlink (self .name_diff )
33
+ os .unlink (self .name_same_shallow )
29
34
30
35
def test_matching (self ):
31
36
self .assertTrue (filecmp .cmp (self .name , self .name ),
@@ -36,12 +41,17 @@ def test_matching(self):
36
41
"Comparing file to identical file fails" )
37
42
self .assertTrue (filecmp .cmp (self .name , self .name_same , shallow = False ),
38
43
"Comparing file to identical file fails" )
44
+ self .assertTrue (filecmp .cmp (self .name , self .name_same_shallow ),
45
+ "Shallow identical files should be considered equal" )
39
46
40
47
def test_different (self ):
41
48
self .assertFalse (filecmp .cmp (self .name , self .name_diff ),
42
49
"Mismatched files compare as equal" )
43
50
self .assertFalse (filecmp .cmp (self .name , self .dir ),
44
51
"File and directory compare as equal" )
52
+ self .assertFalse (filecmp .cmp (self .name , self .name_same_shallow ,
53
+ shallow = False ),
54
+ "Mismatched file to shallow identical file compares as equal" )
45
55
46
56
def test_cache_clear (self ):
47
57
first_compare = filecmp .cmp (self .name , self .name_same , shallow = False )
@@ -56,14 +66,17 @@ def setUp(self):
56
66
self .dir = os .path .join (tmpdir , 'dir' )
57
67
self .dir_same = os .path .join (tmpdir , 'dir-same' )
58
68
self .dir_diff = os .path .join (tmpdir , 'dir-diff' )
69
+ self .dir_diff_file = os .path .join (tmpdir , 'dir-diff-file' )
70
+ self .dir_same_shallow = os .path .join (tmpdir , 'dir-same-shallow' )
59
71
60
72
# Another dir is created under dir_same, but it has a name from the
61
73
# ignored list so it should not affect testing results.
62
74
self .dir_ignored = os .path .join (self .dir_same , '.hg' )
63
75
64
76
self .caseinsensitive = os .path .normcase ('A' ) == os .path .normcase ('a' )
65
77
data = 'Contents of file go here.\n '
66
- for dir in (self .dir , self .dir_same , self .dir_diff , self .dir_ignored ):
78
+ for dir in (self .dir , self .dir_same , self .dir_same_shallow ,
79
+ self .dir_diff , self .dir_ignored , self .dir_diff_file ):
67
80
shutil .rmtree (dir , True )
68
81
os .mkdir (dir )
69
82
subdir_path = os .path .join (dir , 'subdir' )
@@ -72,14 +85,24 @@ def setUp(self):
72
85
fn = 'FiLe' # Verify case-insensitive comparison
73
86
else :
74
87
fn = 'file'
75
- with open (os .path .join (dir , fn ), 'w' , encoding = "utf-8" ) as output :
76
- output .write (data )
88
+ if dir is self .dir_same_shallow :
89
+ with open (os .path .join (dir , fn ) , 'wb' ) as output :
90
+ # same file size; but different content (i.e. all zero)
91
+ output .write (bytes (len (data .encode ())))
92
+ else :
93
+ with open (os .path .join (dir , fn ), 'w' , encoding = "utf-8" ) as output :
94
+ output .write (data )
77
95
78
96
with open (os .path .join (self .dir_diff , 'file2' ), 'w' , encoding = "utf-8" ) as output :
79
97
output .write ('An extra file.\n ' )
80
98
99
+ # Add different file2
100
+ with open (os .path .join (self .dir_diff_file , 'file2' ), 'w' , encoding = "utf-8" ) as output :
101
+ output .write ('Different contents.\n ' )
102
+
81
103
def tearDown (self ):
82
- for dir in (self .dir , self .dir_same , self .dir_diff ):
104
+ for dir in (self .dir , self .dir_same , self .dir_diff ,
105
+ self .dir_same_shallow , self .dir_diff_file ):
83
106
shutil .rmtree (dir )
84
107
85
108
def test_default_ignores (self ):
@@ -102,11 +125,7 @@ def test_cmpfiles(self):
102
125
shallow = False ),
103
126
"Comparing directory to same fails" )
104
127
105
- # Add different file2
106
- with open (os .path .join (self .dir , 'file2' ), 'w' , encoding = "utf-8" ) as output :
107
- output .write ('Different contents.\n ' )
108
-
109
- self .assertFalse (filecmp .cmpfiles (self .dir , self .dir_same ,
128
+ self .assertFalse (filecmp .cmpfiles (self .dir , self .dir_diff_file ,
110
129
['file' , 'file2' ]) ==
111
130
(['file' ], ['file2' ], []),
112
131
"Comparing mismatched directories fails" )
@@ -116,11 +135,22 @@ def _assert_lists(self, actual, expected):
116
135
"""Assert that two lists are equal, up to ordering."""
117
136
self .assertEqual (sorted (actual ), sorted (expected ))
118
137
138
+ def test_dircmp_identical_directories (self ):
139
+ self ._assert_dircmp_identical_directories ()
140
+ self ._assert_dircmp_identical_directories (shallow = False )
141
+
142
+ def test_dircmp_different_file (self ):
143
+ self ._assert_dircmp_different_file ()
144
+ self ._assert_dircmp_different_file (shallow = False )
119
145
120
- def test_dircmp (self ):
146
+ def test_dircmp_different_directories (self ):
147
+ self ._assert_dircmp_different_directories ()
148
+ self ._assert_dircmp_different_directories (shallow = False )
149
+
150
+ def _assert_dircmp_identical_directories (self , ** options ):
121
151
# Check attributes for comparison of two identical directories
122
152
left_dir , right_dir = self .dir , self .dir_same
123
- d = filecmp .dircmp (left_dir , right_dir )
153
+ d = filecmp .dircmp (left_dir , right_dir , ** options )
124
154
self .assertEqual (d .left , left_dir )
125
155
self .assertEqual (d .right , right_dir )
126
156
if self .caseinsensitive :
@@ -142,9 +172,10 @@ def test_dircmp(self):
142
172
]
143
173
self ._assert_report (d .report , expected_report )
144
174
175
+ def _assert_dircmp_different_directories (self , ** options ):
145
176
# Check attributes for comparison of two different directories (right)
146
177
left_dir , right_dir = self .dir , self .dir_diff
147
- d = filecmp .dircmp (left_dir , right_dir )
178
+ d = filecmp .dircmp (left_dir , right_dir , ** options )
148
179
self .assertEqual (d .left , left_dir )
149
180
self .assertEqual (d .right , right_dir )
150
181
self ._assert_lists (d .left_list , ['file' , 'subdir' ])
@@ -164,12 +195,8 @@ def test_dircmp(self):
164
195
self ._assert_report (d .report , expected_report )
165
196
166
197
# Check attributes for comparison of two different directories (left)
167
- left_dir , right_dir = self .dir , self .dir_diff
168
- shutil .move (
169
- os .path .join (self .dir_diff , 'file2' ),
170
- os .path .join (self .dir , 'file2' )
171
- )
172
- d = filecmp .dircmp (left_dir , right_dir )
198
+ left_dir , right_dir = self .dir_diff , self .dir
199
+ d = filecmp .dircmp (left_dir , right_dir , ** options )
173
200
self .assertEqual (d .left , left_dir )
174
201
self .assertEqual (d .right , right_dir )
175
202
self ._assert_lists (d .left_list , ['file' , 'file2' , 'subdir' ])
@@ -180,27 +207,51 @@ def test_dircmp(self):
180
207
self .assertEqual (d .same_files , ['file' ])
181
208
self .assertEqual (d .diff_files , [])
182
209
expected_report = [
183
- "diff {} {}" .format (self .dir , self .dir_diff ),
184
- "Only in {} : ['file2']" .format (self .dir ),
210
+ "diff {} {}" .format (self .dir_diff , self .dir ),
211
+ "Only in {} : ['file2']" .format (self .dir_diff ),
185
212
"Identical files : ['file']" ,
186
213
"Common subdirectories : ['subdir']" ,
187
214
]
188
215
self ._assert_report (d .report , expected_report )
189
216
190
- # Add different file2
191
- with open ( os . path . join ( self . dir_diff , 'file2' ), 'w' , encoding = "utf-8" ) as output :
192
- output . write ( 'Different contents. \n ' )
193
- d = filecmp .dircmp (self .dir , self .dir_diff )
217
+
218
+ def _assert_dircmp_different_file ( self , ** options ) :
219
+ # A different file2
220
+ d = filecmp .dircmp (self .dir_diff , self .dir_diff_file , ** options )
194
221
self .assertEqual (d .same_files , ['file' ])
195
222
self .assertEqual (d .diff_files , ['file2' ])
196
223
expected_report = [
197
- "diff {} {}" .format (self .dir , self .dir_diff ),
224
+ "diff {} {}" .format (self .dir_diff , self .dir_diff_file ),
198
225
"Identical files : ['file']" ,
199
226
"Differing files : ['file2']" ,
200
227
"Common subdirectories : ['subdir']" ,
201
228
]
202
229
self ._assert_report (d .report , expected_report )
203
230
231
+ def test_dircmp_no_shallow_different_file (self ):
232
+ # A non shallow different file2
233
+ d = filecmp .dircmp (self .dir , self .dir_same_shallow , shallow = False )
234
+ self .assertEqual (d .same_files , [])
235
+ self .assertEqual (d .diff_files , ['file' ])
236
+ expected_report = [
237
+ "diff {} {}" .format (self .dir , self .dir_same_shallow ),
238
+ "Differing files : ['file']" ,
239
+ "Common subdirectories : ['subdir']" ,
240
+ ]
241
+ self ._assert_report (d .report , expected_report )
242
+
243
+ def test_dircmp_shallow_same_file (self ):
244
+ # A non shallow different file2
245
+ d = filecmp .dircmp (self .dir , self .dir_same_shallow )
246
+ self .assertEqual (d .same_files , ['file' ])
247
+ self .assertEqual (d .diff_files , [])
248
+ expected_report = [
249
+ "diff {} {}" .format (self .dir , self .dir_same_shallow ),
250
+ "Identical files : ['file']" ,
251
+ "Common subdirectories : ['subdir']" ,
252
+ ]
253
+ self ._assert_report (d .report , expected_report )
254
+
204
255
def test_dircmp_subdirs_type (self ):
205
256
"""Check that dircmp.subdirs respects subclassing."""
206
257
class MyDirCmp (filecmp .dircmp ):
0 commit comments