|
86
|
1 # Copyright (C) 2009 Canonical Ltd |
|
|
2 # |
|
|
3 # This program is free software; you can redistribute it and/or modify |
|
|
4 # it under the terms of the GNU General Public License as published by |
|
|
5 # the Free Software Foundation; either version 2 of the License, or |
|
|
6 # (at your option) any later version. |
|
|
7 # |
|
|
8 # This program is distributed in the hope that it will be useful, |
|
|
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
11 # GNU General Public License for more details. |
|
|
12 # |
|
|
13 # You should have received a copy of the GNU General Public License |
|
|
14 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
15 |
|
|
16 """Test FilterProcessor""" |
|
|
17 from io import BytesIO |
|
|
18 |
|
|
19 from unittest import TestCase |
|
|
20 |
|
|
21 from fastimport import ( |
|
|
22 parser, |
|
|
23 ) |
|
|
24 |
|
|
25 from fastimport.processors import ( |
|
|
26 filter_processor, |
|
|
27 ) |
|
|
28 |
|
|
29 |
|
|
30 # A sample input stream containing all (top level) import commands |
|
|
31 _SAMPLE_ALL = \ |
|
|
32 b"""blob |
|
|
33 mark :1 |
|
|
34 data 4 |
|
|
35 foo |
|
|
36 commit refs/heads/master |
|
|
37 mark :2 |
|
|
38 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
39 data 14 |
|
|
40 Initial import |
|
|
41 M 644 :1 COPYING |
|
|
42 checkpoint |
|
|
43 progress first import done |
|
|
44 reset refs/remote/origin/master |
|
|
45 from :2 |
|
|
46 tag v0.1 |
|
|
47 from :2 |
|
|
48 tagger Joe <joe@example.com> 1234567890 +1000 |
|
|
49 data 12 |
|
|
50 release v0.1 |
|
|
51 """ |
|
|
52 |
|
|
53 |
|
|
54 # A sample input stream creating the following tree: |
|
|
55 # |
|
|
56 # NEWS |
|
|
57 # doc/README.txt |
|
|
58 # doc/index.txt |
|
|
59 _SAMPLE_WITH_DIR = \ |
|
|
60 b"""blob |
|
|
61 mark :1 |
|
|
62 data 9 |
|
|
63 Welcome! |
|
|
64 commit refs/heads/master |
|
|
65 mark :100 |
|
|
66 committer a <b@c> 1234798653 +0000 |
|
|
67 data 4 |
|
|
68 test |
|
|
69 M 644 :1 doc/README.txt |
|
|
70 blob |
|
|
71 mark :2 |
|
|
72 data 17 |
|
|
73 Life |
|
|
74 is |
|
|
75 good ... |
|
|
76 commit refs/heads/master |
|
|
77 mark :101 |
|
|
78 committer a <b@c> 1234798653 +0000 |
|
|
79 data 8 |
|
|
80 test |
|
|
81 ing |
|
|
82 from :100 |
|
|
83 M 644 :2 NEWS |
|
|
84 blob |
|
|
85 mark :3 |
|
|
86 data 19 |
|
|
87 Welcome! |
|
|
88 my friend |
|
|
89 blob |
|
|
90 mark :4 |
|
|
91 data 11 |
|
|
92 == Docs == |
|
|
93 commit refs/heads/master |
|
|
94 mark :102 |
|
|
95 committer d <b@c> 1234798653 +0000 |
|
|
96 data 8 |
|
|
97 test |
|
|
98 ing |
|
|
99 from :101 |
|
|
100 M 644 :3 doc/README.txt |
|
|
101 M 644 :4 doc/index.txt |
|
|
102 """ |
|
|
103 |
|
|
104 class TestCaseWithFiltering(TestCase): |
|
|
105 |
|
|
106 def assertFiltering(self, input_stream, params, expected): |
|
|
107 outf = BytesIO() |
|
|
108 proc = filter_processor.FilterProcessor( |
|
|
109 params=params) |
|
|
110 proc.outf = outf |
|
|
111 s = BytesIO(input_stream) |
|
|
112 p = parser.ImportParser(s) |
|
|
113 proc.process(p.iter_commands) |
|
|
114 out = outf.getvalue() |
|
|
115 self.assertEqual(expected, out) |
|
|
116 |
|
|
117 class TestNoFiltering(TestCaseWithFiltering): |
|
|
118 |
|
|
119 def test_params_not_given(self): |
|
|
120 self.assertFiltering(_SAMPLE_ALL, None, _SAMPLE_ALL) |
|
|
121 |
|
|
122 def test_params_are_none(self): |
|
|
123 params = {b'include_paths': None, b'exclude_paths': None} |
|
|
124 self.assertFiltering(_SAMPLE_ALL, params, _SAMPLE_ALL) |
|
|
125 |
|
|
126 |
|
|
127 class TestIncludePaths(TestCaseWithFiltering): |
|
|
128 |
|
|
129 def test_file_in_root(self): |
|
|
130 # Things to note: |
|
|
131 # * only referenced blobs are retained |
|
|
132 # * from clause is dropped from the first command |
|
|
133 params = {b'include_paths': [b'NEWS']} |
|
|
134 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
135 b"""blob |
|
|
136 mark :2 |
|
|
137 data 17 |
|
|
138 Life |
|
|
139 is |
|
|
140 good ... |
|
|
141 commit refs/heads/master |
|
|
142 mark :101 |
|
|
143 committer a <b@c> 1234798653 +0000 |
|
|
144 data 8 |
|
|
145 test |
|
|
146 ing |
|
|
147 M 644 :2 NEWS |
|
|
148 """) |
|
|
149 |
|
|
150 def test_file_in_subdir(self): |
|
|
151 # Additional things to note: |
|
|
152 # * new root: path is now index.txt, not doc/index.txt |
|
|
153 # * other files changed in matching commits are excluded |
|
|
154 params = {b'include_paths': [b'doc/index.txt']} |
|
|
155 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
156 b"""blob |
|
|
157 mark :4 |
|
|
158 data 11 |
|
|
159 == Docs == |
|
|
160 commit refs/heads/master |
|
|
161 mark :102 |
|
|
162 committer d <b@c> 1234798653 +0000 |
|
|
163 data 8 |
|
|
164 test |
|
|
165 ing |
|
|
166 M 644 :4 index.txt |
|
|
167 """) |
|
|
168 |
|
|
169 def test_file_with_changes(self): |
|
|
170 # Additional things to note: |
|
|
171 # * from updated to reference parents in the output |
|
|
172 params = {b'include_paths': [b'doc/README.txt']} |
|
|
173 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
174 b"""blob |
|
|
175 mark :1 |
|
|
176 data 9 |
|
|
177 Welcome! |
|
|
178 commit refs/heads/master |
|
|
179 mark :100 |
|
|
180 committer a <b@c> 1234798653 +0000 |
|
|
181 data 4 |
|
|
182 test |
|
|
183 M 644 :1 README.txt |
|
|
184 blob |
|
|
185 mark :3 |
|
|
186 data 19 |
|
|
187 Welcome! |
|
|
188 my friend |
|
|
189 commit refs/heads/master |
|
|
190 mark :102 |
|
|
191 committer d <b@c> 1234798653 +0000 |
|
|
192 data 8 |
|
|
193 test |
|
|
194 ing |
|
|
195 from :100 |
|
|
196 M 644 :3 README.txt |
|
|
197 """) |
|
|
198 |
|
|
199 def test_subdir(self): |
|
|
200 params = {b'include_paths': [b'doc/']} |
|
|
201 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
202 b"""blob |
|
|
203 mark :1 |
|
|
204 data 9 |
|
|
205 Welcome! |
|
|
206 commit refs/heads/master |
|
|
207 mark :100 |
|
|
208 committer a <b@c> 1234798653 +0000 |
|
|
209 data 4 |
|
|
210 test |
|
|
211 M 644 :1 README.txt |
|
|
212 blob |
|
|
213 mark :3 |
|
|
214 data 19 |
|
|
215 Welcome! |
|
|
216 my friend |
|
|
217 blob |
|
|
218 mark :4 |
|
|
219 data 11 |
|
|
220 == Docs == |
|
|
221 commit refs/heads/master |
|
|
222 mark :102 |
|
|
223 committer d <b@c> 1234798653 +0000 |
|
|
224 data 8 |
|
|
225 test |
|
|
226 ing |
|
|
227 from :100 |
|
|
228 M 644 :3 README.txt |
|
|
229 M 644 :4 index.txt |
|
|
230 """) |
|
|
231 |
|
|
232 def test_multiple_files_in_subdir(self): |
|
|
233 # The new root should be the subdrectory |
|
|
234 params = {b'include_paths': [b'doc/README.txt', b'doc/index.txt']} |
|
|
235 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
236 b"""blob |
|
|
237 mark :1 |
|
|
238 data 9 |
|
|
239 Welcome! |
|
|
240 commit refs/heads/master |
|
|
241 mark :100 |
|
|
242 committer a <b@c> 1234798653 +0000 |
|
|
243 data 4 |
|
|
244 test |
|
|
245 M 644 :1 README.txt |
|
|
246 blob |
|
|
247 mark :3 |
|
|
248 data 19 |
|
|
249 Welcome! |
|
|
250 my friend |
|
|
251 blob |
|
|
252 mark :4 |
|
|
253 data 11 |
|
|
254 == Docs == |
|
|
255 commit refs/heads/master |
|
|
256 mark :102 |
|
|
257 committer d <b@c> 1234798653 +0000 |
|
|
258 data 8 |
|
|
259 test |
|
|
260 ing |
|
|
261 from :100 |
|
|
262 M 644 :3 README.txt |
|
|
263 M 644 :4 index.txt |
|
|
264 """) |
|
|
265 |
|
|
266 |
|
|
267 class TestExcludePaths(TestCaseWithFiltering): |
|
|
268 |
|
|
269 def test_file_in_root(self): |
|
|
270 params = {b'exclude_paths': [b'NEWS']} |
|
|
271 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
272 b"""blob |
|
|
273 mark :1 |
|
|
274 data 9 |
|
|
275 Welcome! |
|
|
276 commit refs/heads/master |
|
|
277 mark :100 |
|
|
278 committer a <b@c> 1234798653 +0000 |
|
|
279 data 4 |
|
|
280 test |
|
|
281 M 644 :1 doc/README.txt |
|
|
282 blob |
|
|
283 mark :3 |
|
|
284 data 19 |
|
|
285 Welcome! |
|
|
286 my friend |
|
|
287 blob |
|
|
288 mark :4 |
|
|
289 data 11 |
|
|
290 == Docs == |
|
|
291 commit refs/heads/master |
|
|
292 mark :102 |
|
|
293 committer d <b@c> 1234798653 +0000 |
|
|
294 data 8 |
|
|
295 test |
|
|
296 ing |
|
|
297 from :100 |
|
|
298 M 644 :3 doc/README.txt |
|
|
299 M 644 :4 doc/index.txt |
|
|
300 """) |
|
|
301 |
|
|
302 def test_file_in_subdir(self): |
|
|
303 params = {b'exclude_paths': [b'doc/README.txt']} |
|
|
304 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
305 b"""blob |
|
|
306 mark :2 |
|
|
307 data 17 |
|
|
308 Life |
|
|
309 is |
|
|
310 good ... |
|
|
311 commit refs/heads/master |
|
|
312 mark :101 |
|
|
313 committer a <b@c> 1234798653 +0000 |
|
|
314 data 8 |
|
|
315 test |
|
|
316 ing |
|
|
317 M 644 :2 NEWS |
|
|
318 blob |
|
|
319 mark :4 |
|
|
320 data 11 |
|
|
321 == Docs == |
|
|
322 commit refs/heads/master |
|
|
323 mark :102 |
|
|
324 committer d <b@c> 1234798653 +0000 |
|
|
325 data 8 |
|
|
326 test |
|
|
327 ing |
|
|
328 from :101 |
|
|
329 M 644 :4 doc/index.txt |
|
|
330 """) |
|
|
331 |
|
|
332 def test_subdir(self): |
|
|
333 params = {b'exclude_paths': [b'doc/']} |
|
|
334 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
335 b"""blob |
|
|
336 mark :2 |
|
|
337 data 17 |
|
|
338 Life |
|
|
339 is |
|
|
340 good ... |
|
|
341 commit refs/heads/master |
|
|
342 mark :101 |
|
|
343 committer a <b@c> 1234798653 +0000 |
|
|
344 data 8 |
|
|
345 test |
|
|
346 ing |
|
|
347 M 644 :2 NEWS |
|
|
348 """) |
|
|
349 |
|
|
350 def test_multple_files(self): |
|
|
351 params = {b'exclude_paths': [b'doc/index.txt', b'NEWS']} |
|
|
352 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
353 b"""blob |
|
|
354 mark :1 |
|
|
355 data 9 |
|
|
356 Welcome! |
|
|
357 commit refs/heads/master |
|
|
358 mark :100 |
|
|
359 committer a <b@c> 1234798653 +0000 |
|
|
360 data 4 |
|
|
361 test |
|
|
362 M 644 :1 doc/README.txt |
|
|
363 blob |
|
|
364 mark :3 |
|
|
365 data 19 |
|
|
366 Welcome! |
|
|
367 my friend |
|
|
368 commit refs/heads/master |
|
|
369 mark :102 |
|
|
370 committer d <b@c> 1234798653 +0000 |
|
|
371 data 8 |
|
|
372 test |
|
|
373 ing |
|
|
374 from :100 |
|
|
375 M 644 :3 doc/README.txt |
|
|
376 """) |
|
|
377 |
|
|
378 |
|
|
379 class TestIncludeAndExcludePaths(TestCaseWithFiltering): |
|
|
380 |
|
|
381 def test_included_dir_and_excluded_file(self): |
|
|
382 params = {b'include_paths': [b'doc/'], b'exclude_paths': [b'doc/index.txt']} |
|
|
383 self.assertFiltering(_SAMPLE_WITH_DIR, params, \ |
|
|
384 b"""blob |
|
|
385 mark :1 |
|
|
386 data 9 |
|
|
387 Welcome! |
|
|
388 commit refs/heads/master |
|
|
389 mark :100 |
|
|
390 committer a <b@c> 1234798653 +0000 |
|
|
391 data 4 |
|
|
392 test |
|
|
393 M 644 :1 README.txt |
|
|
394 blob |
|
|
395 mark :3 |
|
|
396 data 19 |
|
|
397 Welcome! |
|
|
398 my friend |
|
|
399 commit refs/heads/master |
|
|
400 mark :102 |
|
|
401 committer d <b@c> 1234798653 +0000 |
|
|
402 data 8 |
|
|
403 test |
|
|
404 ing |
|
|
405 from :100 |
|
|
406 M 644 :3 README.txt |
|
|
407 """) |
|
|
408 |
|
|
409 |
|
|
410 # A sample input stream creating the following tree: |
|
|
411 # |
|
|
412 # NEWS |
|
|
413 # doc/README.txt |
|
|
414 # doc/index.txt |
|
|
415 # |
|
|
416 # It then renames doc/README.txt => doc/README |
|
|
417 _SAMPLE_WITH_RENAME_INSIDE = _SAMPLE_WITH_DIR + \ |
|
|
418 b"""commit refs/heads/master |
|
|
419 mark :103 |
|
|
420 committer d <b@c> 1234798653 +0000 |
|
|
421 data 10 |
|
|
422 move intro |
|
|
423 from :102 |
|
|
424 R doc/README.txt doc/README |
|
|
425 """ |
|
|
426 |
|
|
427 # A sample input stream creating the following tree: |
|
|
428 # |
|
|
429 # NEWS |
|
|
430 # doc/README.txt |
|
|
431 # doc/index.txt |
|
|
432 # |
|
|
433 # It then renames doc/README.txt => README |
|
|
434 _SAMPLE_WITH_RENAME_TO_OUTSIDE = _SAMPLE_WITH_DIR + \ |
|
|
435 b"""commit refs/heads/master |
|
|
436 mark :103 |
|
|
437 committer d <b@c> 1234798653 +0000 |
|
|
438 data 10 |
|
|
439 move intro |
|
|
440 from :102 |
|
|
441 R doc/README.txt README |
|
|
442 """ |
|
|
443 |
|
|
444 # A sample input stream creating the following tree: |
|
|
445 # |
|
|
446 # NEWS |
|
|
447 # doc/README.txt |
|
|
448 # doc/index.txt |
|
|
449 # |
|
|
450 # It then renames NEWS => doc/NEWS |
|
|
451 _SAMPLE_WITH_RENAME_TO_INSIDE = _SAMPLE_WITH_DIR + \ |
|
|
452 b"""commit refs/heads/master |
|
|
453 mark :103 |
|
|
454 committer d <b@c> 1234798653 +0000 |
|
|
455 data 10 |
|
|
456 move intro |
|
|
457 from :102 |
|
|
458 R NEWS doc/NEWS |
|
|
459 """ |
|
|
460 |
|
|
461 class TestIncludePathsWithRenames(TestCaseWithFiltering): |
|
|
462 |
|
|
463 def test_rename_all_inside(self): |
|
|
464 # These rename commands ought to be kept but adjusted for the new root |
|
|
465 params = {b'include_paths': [b'doc/']} |
|
|
466 self.assertFiltering(_SAMPLE_WITH_RENAME_INSIDE, params, \ |
|
|
467 b"""blob |
|
|
468 mark :1 |
|
|
469 data 9 |
|
|
470 Welcome! |
|
|
471 commit refs/heads/master |
|
|
472 mark :100 |
|
|
473 committer a <b@c> 1234798653 +0000 |
|
|
474 data 4 |
|
|
475 test |
|
|
476 M 644 :1 README.txt |
|
|
477 blob |
|
|
478 mark :3 |
|
|
479 data 19 |
|
|
480 Welcome! |
|
|
481 my friend |
|
|
482 blob |
|
|
483 mark :4 |
|
|
484 data 11 |
|
|
485 == Docs == |
|
|
486 commit refs/heads/master |
|
|
487 mark :102 |
|
|
488 committer d <b@c> 1234798653 +0000 |
|
|
489 data 8 |
|
|
490 test |
|
|
491 ing |
|
|
492 from :100 |
|
|
493 M 644 :3 README.txt |
|
|
494 M 644 :4 index.txt |
|
|
495 commit refs/heads/master |
|
|
496 mark :103 |
|
|
497 committer d <b@c> 1234798653 +0000 |
|
|
498 data 10 |
|
|
499 move intro |
|
|
500 from :102 |
|
|
501 R README.txt README |
|
|
502 """) |
|
|
503 |
|
|
504 def test_rename_to_outside(self): |
|
|
505 # These rename commands become deletes |
|
|
506 params = {b'include_paths': [b'doc/']} |
|
|
507 self.assertFiltering(_SAMPLE_WITH_RENAME_TO_OUTSIDE, params, \ |
|
|
508 b"""blob |
|
|
509 mark :1 |
|
|
510 data 9 |
|
|
511 Welcome! |
|
|
512 commit refs/heads/master |
|
|
513 mark :100 |
|
|
514 committer a <b@c> 1234798653 +0000 |
|
|
515 data 4 |
|
|
516 test |
|
|
517 M 644 :1 README.txt |
|
|
518 blob |
|
|
519 mark :3 |
|
|
520 data 19 |
|
|
521 Welcome! |
|
|
522 my friend |
|
|
523 blob |
|
|
524 mark :4 |
|
|
525 data 11 |
|
|
526 == Docs == |
|
|
527 commit refs/heads/master |
|
|
528 mark :102 |
|
|
529 committer d <b@c> 1234798653 +0000 |
|
|
530 data 8 |
|
|
531 test |
|
|
532 ing |
|
|
533 from :100 |
|
|
534 M 644 :3 README.txt |
|
|
535 M 644 :4 index.txt |
|
|
536 commit refs/heads/master |
|
|
537 mark :103 |
|
|
538 committer d <b@c> 1234798653 +0000 |
|
|
539 data 10 |
|
|
540 move intro |
|
|
541 from :102 |
|
|
542 D README.txt |
|
|
543 """) |
|
|
544 |
|
|
545 def test_rename_to_inside(self): |
|
|
546 # This ought to create a new file but doesn't yet |
|
|
547 params = {b'include_paths': [b'doc/']} |
|
|
548 self.assertFiltering(_SAMPLE_WITH_RENAME_TO_INSIDE, params, \ |
|
|
549 b"""blob |
|
|
550 mark :1 |
|
|
551 data 9 |
|
|
552 Welcome! |
|
|
553 commit refs/heads/master |
|
|
554 mark :100 |
|
|
555 committer a <b@c> 1234798653 +0000 |
|
|
556 data 4 |
|
|
557 test |
|
|
558 M 644 :1 README.txt |
|
|
559 blob |
|
|
560 mark :3 |
|
|
561 data 19 |
|
|
562 Welcome! |
|
|
563 my friend |
|
|
564 blob |
|
|
565 mark :4 |
|
|
566 data 11 |
|
|
567 == Docs == |
|
|
568 commit refs/heads/master |
|
|
569 mark :102 |
|
|
570 committer d <b@c> 1234798653 +0000 |
|
|
571 data 8 |
|
|
572 test |
|
|
573 ing |
|
|
574 from :100 |
|
|
575 M 644 :3 README.txt |
|
|
576 M 644 :4 index.txt |
|
|
577 """) |
|
|
578 |
|
|
579 |
|
|
580 # A sample input stream creating the following tree: |
|
|
581 # |
|
|
582 # NEWS |
|
|
583 # doc/README.txt |
|
|
584 # doc/index.txt |
|
|
585 # |
|
|
586 # It then copies doc/README.txt => doc/README |
|
|
587 _SAMPLE_WITH_COPY_INSIDE = _SAMPLE_WITH_DIR + \ |
|
|
588 b"""commit refs/heads/master |
|
|
589 mark :103 |
|
|
590 committer d <b@c> 1234798653 +0000 |
|
|
591 data 10 |
|
|
592 move intro |
|
|
593 from :102 |
|
|
594 C doc/README.txt doc/README |
|
|
595 """ |
|
|
596 |
|
|
597 # A sample input stream creating the following tree: |
|
|
598 # |
|
|
599 # NEWS |
|
|
600 # doc/README.txt |
|
|
601 # doc/index.txt |
|
|
602 # |
|
|
603 # It then copies doc/README.txt => README |
|
|
604 _SAMPLE_WITH_COPY_TO_OUTSIDE = _SAMPLE_WITH_DIR + \ |
|
|
605 b"""commit refs/heads/master |
|
|
606 mark :103 |
|
|
607 committer d <b@c> 1234798653 +0000 |
|
|
608 data 10 |
|
|
609 move intro |
|
|
610 from :102 |
|
|
611 C doc/README.txt README |
|
|
612 """ |
|
|
613 |
|
|
614 # A sample input stream creating the following tree: |
|
|
615 # |
|
|
616 # NEWS |
|
|
617 # doc/README.txt |
|
|
618 # doc/index.txt |
|
|
619 # |
|
|
620 # It then copies NEWS => doc/NEWS |
|
|
621 _SAMPLE_WITH_COPY_TO_INSIDE = _SAMPLE_WITH_DIR + \ |
|
|
622 b"""commit refs/heads/master |
|
|
623 mark :103 |
|
|
624 committer d <b@c> 1234798653 +0000 |
|
|
625 data 10 |
|
|
626 move intro |
|
|
627 from :102 |
|
|
628 C NEWS doc/NEWS |
|
|
629 """ |
|
|
630 |
|
|
631 |
|
|
632 class TestIncludePathsWithCopies(TestCaseWithFiltering): |
|
|
633 |
|
|
634 def test_copy_all_inside(self): |
|
|
635 # These copy commands ought to be kept but adjusted for the new root |
|
|
636 params = {b'include_paths': [b'doc/']} |
|
|
637 self.assertFiltering(_SAMPLE_WITH_COPY_INSIDE, params, \ |
|
|
638 b"""blob |
|
|
639 mark :1 |
|
|
640 data 9 |
|
|
641 Welcome! |
|
|
642 commit refs/heads/master |
|
|
643 mark :100 |
|
|
644 committer a <b@c> 1234798653 +0000 |
|
|
645 data 4 |
|
|
646 test |
|
|
647 M 644 :1 README.txt |
|
|
648 blob |
|
|
649 mark :3 |
|
|
650 data 19 |
|
|
651 Welcome! |
|
|
652 my friend |
|
|
653 blob |
|
|
654 mark :4 |
|
|
655 data 11 |
|
|
656 == Docs == |
|
|
657 commit refs/heads/master |
|
|
658 mark :102 |
|
|
659 committer d <b@c> 1234798653 +0000 |
|
|
660 data 8 |
|
|
661 test |
|
|
662 ing |
|
|
663 from :100 |
|
|
664 M 644 :3 README.txt |
|
|
665 M 644 :4 index.txt |
|
|
666 commit refs/heads/master |
|
|
667 mark :103 |
|
|
668 committer d <b@c> 1234798653 +0000 |
|
|
669 data 10 |
|
|
670 move intro |
|
|
671 from :102 |
|
|
672 C README.txt README |
|
|
673 """) |
|
|
674 |
|
|
675 def test_copy_to_outside(self): |
|
|
676 # This can be ignored |
|
|
677 params = {b'include_paths': [b'doc/']} |
|
|
678 self.assertFiltering(_SAMPLE_WITH_COPY_TO_OUTSIDE, params, \ |
|
|
679 b"""blob |
|
|
680 mark :1 |
|
|
681 data 9 |
|
|
682 Welcome! |
|
|
683 commit refs/heads/master |
|
|
684 mark :100 |
|
|
685 committer a <b@c> 1234798653 +0000 |
|
|
686 data 4 |
|
|
687 test |
|
|
688 M 644 :1 README.txt |
|
|
689 blob |
|
|
690 mark :3 |
|
|
691 data 19 |
|
|
692 Welcome! |
|
|
693 my friend |
|
|
694 blob |
|
|
695 mark :4 |
|
|
696 data 11 |
|
|
697 == Docs == |
|
|
698 commit refs/heads/master |
|
|
699 mark :102 |
|
|
700 committer d <b@c> 1234798653 +0000 |
|
|
701 data 8 |
|
|
702 test |
|
|
703 ing |
|
|
704 from :100 |
|
|
705 M 644 :3 README.txt |
|
|
706 M 644 :4 index.txt |
|
|
707 """) |
|
|
708 |
|
|
709 def test_copy_to_inside(self): |
|
|
710 # This ought to create a new file but doesn't yet |
|
|
711 params = {b'include_paths': [b'doc/']} |
|
|
712 self.assertFiltering(_SAMPLE_WITH_COPY_TO_INSIDE, params, \ |
|
|
713 b"""blob |
|
|
714 mark :1 |
|
|
715 data 9 |
|
|
716 Welcome! |
|
|
717 commit refs/heads/master |
|
|
718 mark :100 |
|
|
719 committer a <b@c> 1234798653 +0000 |
|
|
720 data 4 |
|
|
721 test |
|
|
722 M 644 :1 README.txt |
|
|
723 blob |
|
|
724 mark :3 |
|
|
725 data 19 |
|
|
726 Welcome! |
|
|
727 my friend |
|
|
728 blob |
|
|
729 mark :4 |
|
|
730 data 11 |
|
|
731 == Docs == |
|
|
732 commit refs/heads/master |
|
|
733 mark :102 |
|
|
734 committer d <b@c> 1234798653 +0000 |
|
|
735 data 8 |
|
|
736 test |
|
|
737 ing |
|
|
738 from :100 |
|
|
739 M 644 :3 README.txt |
|
|
740 M 644 :4 index.txt |
|
|
741 """) |
|
|
742 |
|
|
743 |
|
|
744 # A sample input stream with deleteall's creating the following tree: |
|
|
745 # |
|
|
746 # NEWS |
|
|
747 # doc/README.txt |
|
|
748 # doc/index.txt |
|
|
749 _SAMPLE_WITH_DELETEALL = \ |
|
|
750 b"""blob |
|
|
751 mark :1 |
|
|
752 data 9 |
|
|
753 Welcome! |
|
|
754 commit refs/heads/master |
|
|
755 mark :100 |
|
|
756 committer a <b@c> 1234798653 +0000 |
|
|
757 data 4 |
|
|
758 test |
|
|
759 deleteall |
|
|
760 M 644 :1 doc/README.txt |
|
|
761 blob |
|
|
762 mark :3 |
|
|
763 data 19 |
|
|
764 Welcome! |
|
|
765 my friend |
|
|
766 blob |
|
|
767 mark :4 |
|
|
768 data 11 |
|
|
769 == Docs == |
|
|
770 commit refs/heads/master |
|
|
771 mark :102 |
|
|
772 committer d <b@c> 1234798653 +0000 |
|
|
773 data 8 |
|
|
774 test |
|
|
775 ing |
|
|
776 from :100 |
|
|
777 deleteall |
|
|
778 M 644 :3 doc/README.txt |
|
|
779 M 644 :4 doc/index.txt |
|
|
780 """ |
|
|
781 |
|
|
782 |
|
|
783 class TestIncludePathsWithDeleteAll(TestCaseWithFiltering): |
|
|
784 |
|
|
785 def test_deleteall(self): |
|
|
786 params = {b'include_paths': [b'doc/index.txt']} |
|
|
787 self.assertFiltering(_SAMPLE_WITH_DELETEALL, params, \ |
|
|
788 b"""blob |
|
|
789 mark :4 |
|
|
790 data 11 |
|
|
791 == Docs == |
|
|
792 commit refs/heads/master |
|
|
793 mark :102 |
|
|
794 committer d <b@c> 1234798653 +0000 |
|
|
795 data 8 |
|
|
796 test |
|
|
797 ing |
|
|
798 from :100 |
|
|
799 deleteall |
|
|
800 M 644 :4 index.txt |
|
|
801 """) |
|
|
802 |
|
|
803 |
|
|
804 _SAMPLE_WITH_TAGS = _SAMPLE_WITH_DIR + \ |
|
|
805 b"""tag v0.1 |
|
|
806 from :100 |
|
|
807 tagger d <b@c> 1234798653 +0000 |
|
|
808 data 12 |
|
|
809 release v0.1 |
|
|
810 tag v0.2 |
|
|
811 from :102 |
|
|
812 tagger d <b@c> 1234798653 +0000 |
|
|
813 data 12 |
|
|
814 release v0.2 |
|
|
815 """ |
|
|
816 |
|
|
817 class TestIncludePathsWithTags(TestCaseWithFiltering): |
|
|
818 |
|
|
819 def test_tag_retention(self): |
|
|
820 # If a tag references a commit with a parent we kept, |
|
|
821 # keep the tag but adjust 'from' accordingly. |
|
|
822 # Otherwise, delete the tag command. |
|
|
823 params = {b'include_paths': [b'NEWS']} |
|
|
824 self.assertFiltering(_SAMPLE_WITH_TAGS, params, \ |
|
|
825 b"""blob |
|
|
826 mark :2 |
|
|
827 data 17 |
|
|
828 Life |
|
|
829 is |
|
|
830 good ... |
|
|
831 commit refs/heads/master |
|
|
832 mark :101 |
|
|
833 committer a <b@c> 1234798653 +0000 |
|
|
834 data 8 |
|
|
835 test |
|
|
836 ing |
|
|
837 M 644 :2 NEWS |
|
|
838 tag v0.2 |
|
|
839 from :101 |
|
|
840 tagger d <b@c> 1234798653 +0000 |
|
|
841 data 12 |
|
|
842 release v0.2 |
|
|
843 """) |
|
|
844 |
|
|
845 |
|
|
846 _SAMPLE_WITH_RESETS = _SAMPLE_WITH_DIR + \ |
|
|
847 b"""reset refs/heads/foo |
|
|
848 reset refs/heads/bar |
|
|
849 from :102 |
|
|
850 """ |
|
|
851 |
|
|
852 class TestIncludePathsWithResets(TestCaseWithFiltering): |
|
|
853 |
|
|
854 def test_reset_retention(self): |
|
|
855 # Resets init'ing a branch (without a from) are passed through. |
|
|
856 # If a reset references a commit with a parent we kept, |
|
|
857 # keep the reset but adjust 'from' accordingly. |
|
|
858 params = {b'include_paths': [b'NEWS']} |
|
|
859 self.assertFiltering(_SAMPLE_WITH_RESETS, params, \ |
|
|
860 b"""blob |
|
|
861 mark :2 |
|
|
862 data 17 |
|
|
863 Life |
|
|
864 is |
|
|
865 good ... |
|
|
866 commit refs/heads/master |
|
|
867 mark :101 |
|
|
868 committer a <b@c> 1234798653 +0000 |
|
|
869 data 8 |
|
|
870 test |
|
|
871 ing |
|
|
872 M 644 :2 NEWS |
|
|
873 reset refs/heads/foo |
|
|
874 reset refs/heads/bar |
|
|
875 from :101 |
|
|
876 """) |
|
|
877 |
|
|
878 |
|
|
879 # A sample input stream containing empty commit |
|
|
880 _SAMPLE_EMPTY_COMMIT = \ |
|
|
881 b"""blob |
|
|
882 mark :1 |
|
|
883 data 4 |
|
|
884 foo |
|
|
885 commit refs/heads/master |
|
|
886 mark :2 |
|
|
887 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
888 data 14 |
|
|
889 Initial import |
|
|
890 M 644 :1 COPYING |
|
|
891 commit refs/heads/master |
|
|
892 mark :3 |
|
|
893 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
894 data 12 |
|
|
895 empty commit |
|
|
896 """ |
|
|
897 |
|
|
898 # A sample input stream containing unresolved from and merge references |
|
|
899 _SAMPLE_FROM_MERGE_COMMIT = \ |
|
|
900 b"""blob |
|
|
901 mark :1 |
|
|
902 data 4 |
|
|
903 foo |
|
|
904 commit refs/heads/master |
|
|
905 mark :3 |
|
|
906 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
907 data 6 |
|
|
908 import |
|
|
909 M 644 :1 COPYING |
|
|
910 blob |
|
|
911 mark :2 |
|
|
912 data 4 |
|
|
913 bar |
|
|
914 commit refs/heads/master |
|
|
915 mark :4 |
|
|
916 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
917 data 19 |
|
|
918 unknown from commit |
|
|
919 from :999 |
|
|
920 M 644 :2 data/DATA |
|
|
921 blob |
|
|
922 mark :99 |
|
|
923 data 4 |
|
|
924 bar |
|
|
925 commit refs/heads/master |
|
|
926 mark :5 |
|
|
927 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
928 data 12 |
|
|
929 merge commit |
|
|
930 from :3 |
|
|
931 merge :4 |
|
|
932 merge :1001 |
|
|
933 M 644 :99 data/DATA2 |
|
|
934 """ |
|
|
935 |
|
|
936 class TestSquashEmptyCommitsFlag(TestCaseWithFiltering): |
|
|
937 |
|
|
938 def test_squash_empty_commit(self): |
|
|
939 params = {b'include_paths': None, b'exclude_paths': None} |
|
|
940 self.assertFiltering(_SAMPLE_EMPTY_COMMIT, params, \ |
|
|
941 b"""blob |
|
|
942 mark :1 |
|
|
943 data 4 |
|
|
944 foo |
|
|
945 commit refs/heads/master |
|
|
946 mark :2 |
|
|
947 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
948 data 14 |
|
|
949 Initial import |
|
|
950 M 644 :1 COPYING |
|
|
951 """) |
|
|
952 |
|
|
953 def test_keep_empty_commit(self): |
|
|
954 params = {b'include_paths': None, b'exclude_paths': None, b'squash_empty_commits': False} |
|
|
955 self.assertFiltering(_SAMPLE_EMPTY_COMMIT, params, _SAMPLE_EMPTY_COMMIT) |
|
|
956 |
|
|
957 def test_squash_unresolved_references(self): |
|
|
958 params = {b'include_paths': None, b'exclude_paths': None} |
|
|
959 self.assertFiltering(_SAMPLE_FROM_MERGE_COMMIT, params, \ |
|
|
960 b"""blob |
|
|
961 mark :1 |
|
|
962 data 4 |
|
|
963 foo |
|
|
964 commit refs/heads/master |
|
|
965 mark :3 |
|
|
966 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
967 data 6 |
|
|
968 import |
|
|
969 M 644 :1 COPYING |
|
|
970 blob |
|
|
971 mark :2 |
|
|
972 data 4 |
|
|
973 bar |
|
|
974 commit refs/heads/master |
|
|
975 mark :4 |
|
|
976 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
977 data 19 |
|
|
978 unknown from commit |
|
|
979 from :999 |
|
|
980 M 644 :2 data/DATA |
|
|
981 blob |
|
|
982 mark :99 |
|
|
983 data 4 |
|
|
984 bar |
|
|
985 commit refs/heads/master |
|
|
986 mark :5 |
|
|
987 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
988 data 12 |
|
|
989 merge commit |
|
|
990 from :3 |
|
|
991 merge :4 |
|
|
992 merge :1001 |
|
|
993 M 644 :99 data/DATA2 |
|
|
994 """) |
|
|
995 |
|
|
996 def test_keep_unresolved_from_and_merge(self): |
|
|
997 params = {b'include_paths': None, b'exclude_paths': None, b'squash_empty_commits': False} |
|
|
998 self.assertFiltering(_SAMPLE_FROM_MERGE_COMMIT, params, _SAMPLE_FROM_MERGE_COMMIT) |
|
|
999 |
|
|
1000 def test_with_excludes(self): |
|
|
1001 params = {b'include_paths': None, |
|
|
1002 b'exclude_paths': [b'data/DATA'], |
|
|
1003 b'squash_empty_commits': False} |
|
|
1004 self.assertFiltering(_SAMPLE_FROM_MERGE_COMMIT, params, \ |
|
|
1005 b"""blob |
|
|
1006 mark :1 |
|
|
1007 data 4 |
|
|
1008 foo |
|
|
1009 commit refs/heads/master |
|
|
1010 mark :3 |
|
|
1011 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
1012 data 6 |
|
|
1013 import |
|
|
1014 M 644 :1 COPYING |
|
|
1015 commit refs/heads/master |
|
|
1016 mark :4 |
|
|
1017 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
1018 data 19 |
|
|
1019 unknown from commit |
|
|
1020 from :999 |
|
|
1021 blob |
|
|
1022 mark :99 |
|
|
1023 data 4 |
|
|
1024 bar |
|
|
1025 commit refs/heads/master |
|
|
1026 mark :5 |
|
|
1027 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
1028 data 12 |
|
|
1029 merge commit |
|
|
1030 from :3 |
|
|
1031 merge :4 |
|
|
1032 merge :1001 |
|
|
1033 M 644 :99 data/DATA2 |
|
|
1034 """) |
|
|
1035 |
|
|
1036 def test_with_file_includes(self): |
|
|
1037 params = {b'include_paths': [b'COPYING', b'data/DATA2'], |
|
|
1038 b'exclude_paths': None, |
|
|
1039 b'squash_empty_commits': False} |
|
|
1040 self.assertFiltering(_SAMPLE_FROM_MERGE_COMMIT, params, \ |
|
|
1041 b"""blob |
|
|
1042 mark :1 |
|
|
1043 data 4 |
|
|
1044 foo |
|
|
1045 commit refs/heads/master |
|
|
1046 mark :3 |
|
|
1047 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
1048 data 6 |
|
|
1049 import |
|
|
1050 M 644 :1 COPYING |
|
|
1051 commit refs/heads/master |
|
|
1052 mark :4 |
|
|
1053 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
1054 data 19 |
|
|
1055 unknown from commit |
|
|
1056 from :999 |
|
|
1057 blob |
|
|
1058 mark :99 |
|
|
1059 data 4 |
|
|
1060 bar |
|
|
1061 commit refs/heads/master |
|
|
1062 mark :5 |
|
|
1063 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
1064 data 12 |
|
|
1065 merge commit |
|
|
1066 from :3 |
|
|
1067 merge :4 |
|
|
1068 merge :1001 |
|
|
1069 M 644 :99 data/DATA2 |
|
|
1070 """ |
|
|
1071 ) |
|
|
1072 |
|
|
1073 def test_with_directory_includes(self): |
|
|
1074 params = {b'include_paths': [b'data/'], |
|
|
1075 b'exclude_paths': None, |
|
|
1076 b'squash_empty_commits': False} |
|
|
1077 self.assertFiltering(_SAMPLE_FROM_MERGE_COMMIT, params, \ |
|
|
1078 b"""commit refs/heads/master |
|
|
1079 mark :3 |
|
|
1080 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
1081 data 6 |
|
|
1082 import |
|
|
1083 blob |
|
|
1084 mark :2 |
|
|
1085 data 4 |
|
|
1086 bar |
|
|
1087 commit refs/heads/master |
|
|
1088 mark :4 |
|
|
1089 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
1090 data 19 |
|
|
1091 unknown from commit |
|
|
1092 from :999 |
|
|
1093 M 644 :2 DATA |
|
|
1094 blob |
|
|
1095 mark :99 |
|
|
1096 data 4 |
|
|
1097 bar |
|
|
1098 commit refs/heads/master |
|
|
1099 mark :5 |
|
|
1100 committer Joe <joe@example.com> 1234567890 +1000 |
|
|
1101 data 12 |
|
|
1102 merge commit |
|
|
1103 from :3 |
|
|
1104 merge :4 |
|
|
1105 merge :1001 |
|
|
1106 M 644 :99 DATA2 |
|
|
1107 """) |