33
def _check_diff(self, diff=DIFF_1, filename='test_file'):
34
old_tree = self.tree.basis_tree()
35
old_date = _patch_header_date(old_tree,
36
old_tree.inventory.path2id(filename),
38
new_date = _patch_header_date(self.tree,
39
self.tree.inventory.path2id(filename),
41
keys = { 'filename' : filename , 'old_date': old_date,
43
hdr = self.DIFF_HEADER % keys
45
self.assertEqual(self.capture('diff', retcode=1), hdr + diff + '\n')
47
def _check_shelf(self, idx, diff=DIFF_1, filename='test_file',
49
old_tree = self.tree.basis_tree()
50
old_date = _patch_header_date(old_tree,
51
old_tree.inventory.path2id(filename),
53
diff = diff % { 'filename' : filename, 'old_date': old_date,
55
shelf = open(os.path.join(self.tree.basedir,
56
'.shelf/shelves/default/' + idx)).read()
57
shelf = shelf[shelf.index('\n') + 1:] # skip the message
58
self.assertEqual(shelf, diff)
28
60
def test_shelf(self):
29
61
self.__test_loop(1)
54
90
# Make sure the file is actually back the way it was
55
91
self.assertEqual(file('test_file').read(), self.ORIGINAL)
57
# Check the shelf is right
58
shelf = open(os.path.join(tree.branch.base,
59
'.shelf/shelves/default/00')).read()
60
shelf = shelf[shelf.index('\n') + 1:] # skip the message
61
self.assertEqual(shelf, self.DIFF_1)
93
self._check_shelf('00', new_date=new_date)
64
96
self.run_bzr('unshelve', '--all', retcode=0)
66
# Check the diff is right again
67
self.assertEqual(self.capture('diff', retcode=1),
68
self.DIFF_HEADER + self.DIFF_1 + '\n')
70
100
# Check the shelved patch was backed up
71
shelf = open(os.path.join(tree.branch.base,
72
'.shelf/shelves/default/00~')).read()
73
shelf = shelf[shelf.index('\n') + 1:] # skip the message
74
self.assertEqual(shelf, self.DIFF_1)
101
self._check_shelf('00~', new_date=new_date)
76
103
# Make sure the file is back the way it should be
77
104
self.assertEqual(file('test_file').read(), self.MODIFIED)
79
106
def test_shelf_nothing_to_shelve(self):
81
tree = self.make_branch_and_tree('.')
82
self.__create_and_add_test_file(tree)
108
self.tree = self.make_branch_and_tree('.')
109
self.__create_and_add_test_file()
84
111
# Shelve the changes
85
112
self.run_bzr('shelve', '--all', retcode=3)
87
if os.path.exists(os.path.join(tree.branch.base,
114
if os.path.exists(os.path.join(self.tree.branch.base,
88
115
'.shelf/shelves/default/00')):
89
116
self.fail("Shelf exists, but it shouldn't")
91
def __create_and_add_test_file(self, tree, filename='test_file'):
92
f = open(filename, 'w')
118
def __create_and_add_test_file(self, filename='test_file'):
119
# write in binary mode because on win32 line-endings should be LF
120
f = open(filename, 'wb')
93
121
f.write(self.ORIGINAL)
95
tree.add(tree.relpath(os.path.join(os.getcwd(), filename)))
96
tree.commit(message='add %s' % filename)
123
self.tree.add(self.tree.relpath(os.path.join(os.getcwd(), filename)))
124
self.tree.commit(message='add %s' % filename)
98
126
def test_shelf_with_revision(self):
99
tree = self.make_branch_and_tree('.')
127
self.tree = self.make_branch_and_tree('.')
101
self.__create_and_add_test_file(tree)
129
self.__create_and_add_test_file()
103
131
# Modify the test file and commit it
104
132
self.build_tree_contents([('test_file', self.MODIFIED)])
105
tree.commit(message='update test_file')
133
self.tree.commit(message='update test_file')
107
135
# Shelve the changes
108
136
self.run_bzr('shelve', '--all', '-r', '1', retcode=0)
110
# Check the diff is right
111
self.assertEqual(self.capture('diff', retcode=1),
112
self.DIFF_HEADER + self.DIFF_2 + '\n')
138
self._check_diff(self.DIFF_2)
114
140
# Make sure the file is the way it should be
115
141
self.assertEqual(file('test_file').read(), self.ORIGINAL)
154
180
self.assertEqual(shown, shelf)
156
182
def test_shelf_show_multi(self):
157
tree = self.make_branch_and_tree('.')
158
self.__create_and_add_test_file(tree)
159
self.__test_show(tree, '00')
160
self.__test_show(tree, '01')
161
self.__test_show(tree, '02')
183
self.tree = self.make_branch_and_tree('.')
184
self.__create_and_add_test_file()
185
self.__test_show(self.tree, '00')
186
self.__test_show(self.tree, '01')
187
self.__test_show(self.tree, '02')
163
189
# Now check we can show a previously shelved patch
164
shelf = open(os.path.join(tree.branch.base,
190
shelf = open(os.path.join(self.tree.basedir,
165
191
'.shelf/shelves/default/00')).read()
166
192
self.assertTrue('patch 00' in shelf)
169
195
shown = self.capture('shelf show 00', retcode=0)
170
196
self.assertEqual(shown, shelf)
198
def test_shelf_show_unspecified(self):
199
self.tree = self.make_branch_and_tree('.')
200
self.__create_and_add_test_file()
201
self.__test_show(self.tree, '00')
202
self.__test_show(self.tree, '01')
203
self.__test_show(self.tree, '02')
205
# Check that not specifying at patch gets us the most recent
206
shelf = open(os.path.join(self.tree.basedir,
207
'.shelf/shelves/default/02')).read()
208
self.assertTrue('patch 02' in shelf)
210
# Check the shown output is right
211
shown = self.capture('shelf show', retcode=0)
212
self.assertEqual(shown, shelf)
172
214
def test_shelf_show_with_no_patch(self):
173
tree = self.make_branch_and_tree('.')
215
self.tree = self.make_branch_and_tree('.')
174
216
stderr = self.run_bzr_captured(['shelf', 'show', '00'], retcode=None)[1]
175
217
self.assertTrue("Patch '00' doesn't exist on shelf default!" in stderr)
177
219
def test_shelf_unshelve_failure(self):
178
tree = self.make_branch_and_tree('.')
220
self.tree = self.make_branch_and_tree('.')
180
self.__create_and_add_test_file(tree)
222
self.__create_and_add_test_file()
182
224
# Modify the test file
183
225
file('test_file', 'w').write(self.MODIFIED)
254
296
self.assertTrue(os.path.exists('.shelf/shelves/default/01~'))
257
list = self.capture('shelf ls', retcode=0).split('\n')
299
lines = self.capture('shelf ls', retcode=0).split('\n')
259
301
self.assertFalse(line.startswith(' 01'))
261
303
# Unshelve, if unshelve is confused by the backup it will fail
262
304
self.run_bzr('unshelve', '--all', retcode=0)
264
306
def test_shelf_delete(self):
265
tree = self.make_branch_and_tree('.')
307
self.tree = self.make_branch_and_tree('.')
267
self.__create_and_add_test_file(tree)
268
self.__create_and_add_test_file(tree, filename='test_file2')
309
self.__create_and_add_test_file()
310
self.__create_and_add_test_file(filename='test_file2')
270
312
# Modify the test files
271
file('test_file', 'w').write(self.MODIFIED)
272
file('test_file2', 'w').write(self.MODIFIED)
313
# write in binary mode because on win32 line-endings should be LF
314
f = file('test_file', 'wb')
315
f.write(self.MODIFIED)
317
f = file('test_file2', 'wb')
318
f.write(self.MODIFIED)
320
new_date = _patch_header_date(self.tree,
321
self.tree.inventory.path2id('test_file'), 'test_file')
274
323
# Shelve the changes
275
324
self.run_bzr('shelve', '--all', 'test_file', retcode=0)
276
325
self.run_bzr('shelve', '--all', 'test_file2', retcode=0)
327
self._check_shelf('00', new_date=new_date)
279
330
self.run_bzr('shelf', 'delete', '00', retcode=0)
281
# We should now have 01 but not 00
332
# We should now have 01 but not 00, but we should have 00~
282
333
self.assertFalse(os.path.exists('.shelf/shelves/default/00'))
334
self.assertTrue(os.path.exists('.shelf/shelves/default/00~'))
283
335
self.assertTrue(os.path.exists('.shelf/shelves/default/01'))
337
# Check the backup is right
338
self._check_shelf('00~', new_date=new_date)
286
list = self.capture('shelf ls', retcode=0).split('\n')
341
lines = self.capture('shelf ls', retcode=0).split('\n')
288
343
self.assertFalse(line.startswith(' 00'))
290
345
# Unshelve should unshelve 01
349
404
# Shelve should work now
350
405
self.run_bzr('shelve', '--all', retcode=0)
352
def test_shelf_p0_patch(self):
353
tree = self.make_branch_and_tree('.')
407
def test_shelf_p1_patch(self):
408
self.tree = self.make_branch_and_tree('.')
355
self.__create_and_add_test_file(tree)
410
self.__create_and_add_test_file()
357
412
# Run a benign shelf command to setup .shelf for us
358
413
self.run_bzr('shelf', 'ls', retcode=0)
415
old_tree = self.tree.basis_tree()
416
old_date = _patch_header_date(old_tree,
417
old_tree.inventory.path2id('test_file'),
419
new_date = _patch_header_date(self.tree,
420
self.tree.inventory.path2id('test_file'),
360
422
# Fake a -p0 shelved patch
362
diff = diff.replace('a/', '')
363
diff = diff.replace('b/', '')
423
diff = self.DIFF_1 % { 'filename' : 'test_file', 'old_date': old_date,
424
'new_date' : new_date}
425
diff = diff.replace('--- ', '--- a/')
426
diff = diff.replace('+++ ', '+++ b/')
364
427
open('.shelf/shelves/default/00', 'w').write(diff)
366
429
# This should work
367
430
self.run_bzr('unshelve', '--all', retcode=0)
369
# Check the diff is right
370
self.assertEqual(self.capture('diff', retcode=1),
371
self.DIFF_HEADER + self.DIFF_1 + '\n')
373
434
def test_shelf_shelve_in_subdir(self):
374
tree = self.make_branch_and_tree('.')
376
self.__create_and_add_test_file(tree)
435
self.tree = self.make_branch_and_tree('.')
439
self.tree.add(subdir)
442
self.__create_and_add_test_file()
378
444
# Modify the test file
379
file('test_file', 'w').write(self.MODIFIED)
445
# write in binary mode because on win32 line-endings should be LF
446
f = file('test_file', 'wb')
447
f.write(self.MODIFIED)
381
450
# Shelve the changes
382
451
self.run_bzr('shelve', '--all', retcode=0)
388
457
# Unshelve, should succeed
389
458
self.run_bzr('unshelve', '--all', retcode=0)
391
# Check the diff is right
392
self.assertEqual(self.capture('diff', retcode=1),
393
self.DIFF_HEADER + self.DIFF_1 + '\n')
460
self._check_diff(filename='subdir/test_file')
462
# Make sure relative filenames work ok
463
self.run_bzr('shelve', 'test_file', '--all', retcode=0)
465
def test_shelf_shelf_bogus_subcommand(self):
466
self.tree = self.make_branch_and_tree('.')
467
self.run_bzr('shelf', 'foo', retcode=3) # <- retcode == 3
469
def test_shelf_OOO_unshelve(self):
470
self.tree = self.make_branch_and_tree('.')
472
for i in range(1, 5):
473
self.__create_and_add_test_file(filename='test_file%d' % i)
475
# Modify the test files
476
for i in range(1, 5):
477
file('test_file%d' % i, 'w').write(self.MODIFIED)
480
for i in range(1, 5):
481
self.run_bzr('shelve', '--all', 'test_file%d' % i, retcode=0)
483
# Check shelving worked
484
for i in range(1, 5):
485
self.assertEqual(file('test_file%d' % i).read(), self.ORIGINAL)
487
# We should now have 00-03
488
for i in range(0, 4):
489
self.assertTrue(os.path.exists('.shelf/shelves/default/0%d' % i))
492
self.run_bzr('unshelve', '--all', '00', retcode=0)
493
self.assertEqual(file('test_file1').read(), self.MODIFIED)
496
lines = self.capture('shelf ls', retcode=0).split('\n')
498
self.assertFalse(line.startswith(' 00'))
500
# Check we can reshelve once we've unshelved out of order, should be 04
501
self.assertFalse(os.path.exists('.shelf/shelves/default/04'))
502
self.run_bzr('shelve', '--all')
503
self.assertTrue(os.path.exists('.shelf/shelves/default/04'))
506
text = self.capture('shelf ls', retcode=0)
507
for line in text.split('\n'):
508
self.assertFalse(line.startswith(' 00'))
510
# We now have 01,02,03,04
512
self.run_bzr('unshelve', '--all', '02', retcode=0)
513
self.assertEqual(file('test_file3').read(), self.MODIFIED)
515
# Unshelve the default, this is the reshelved 00, hence modifies file 1
516
self.run_bzr('unshelve', '--all', retcode=0)
517
self.assertEqual(file('test_file1').read(), self.MODIFIED)
519
def test_shelf_switch_basic(self):
520
self.tree = self.make_branch_and_tree('.')
521
self.__create_and_add_test_file()
523
# This should go to "default"
524
file('test_file', 'w').write(self.MODIFIED)
525
self.run_bzr('shelve', '--all', 'test_file', retcode=0)
528
self.run_bzr('shelf', 'switch', 'other', retcode=0)
529
file('test_file', 'w').write(self.MODIFIED)
530
self.run_bzr('shelve', '--all', 'test_file', retcode=0)
533
self.assertTrue(os.path.exists('.shelf/shelves/default/00'))
534
self.assertFalse(os.path.exists('.shelf/shelves/default/01'))
535
self.assertTrue(os.path.exists('.shelf/shelves/other/00'))
538
self.run_bzr('shelf', 'switch', 'default', retcode=0)
539
file('test_file', 'w').write(self.MODIFIED)
540
self.run_bzr('shelve', '--all', 'test_file', retcode=0)
543
self.assertTrue(os.path.exists('.shelf/shelves/default/01'))
544
self.assertFalse(os.path.exists('.shelf/shelves/other/01'))
546
def test_shelf_bad_patch_arg(self):
547
self.tree = self.make_branch_and_tree('.')
549
# Check the bad arg handling
550
stdout, error = self.run_bzr_captured(['unshelve', '01'], retcode=3)
551
self.assertTrue("Patch '01' doesn't exist on shelf" in error)
553
stdout, error = self.run_bzr_captured(['unshelve', 'foo'], retcode=3)
554
self.assertTrue("Invalid patch name 'foo'" in error)
556
# Hex and is cracky, so it shouldn't work
557
stdout, error = self.run_bzr_captured(['unshelve', '0x00'], retcode=3)
558
self.assertTrue("Invalid patch name '0x00'" in error)
560
def test_color_hunk_selector(self):
561
"""Make sure NoColor is raised iff terminal.has_ansi_colors is False"""
562
hs = ShelveHunkSelector([])
563
hs = UnshelveHunkSelector([])
564
from bzrlib.plugins.bzrtools import terminal
565
old_has_ansi_colors = terminal.has_ansi_colors
566
terminal.has_ansi_colors = lambda: False
568
self.assertRaises(NoColor, ShelveHunkSelector, [], True)
569
self.assertRaises(NoColor, UnshelveHunkSelector, [], True)
570
terminal.has_ansi_colors = lambda: True
571
hs = ShelveHunkSelector([], color=True)
572
hs = UnshelveHunkSelector([], color=True)
574
terminal.has_ansi_colors = old_has_ansi_colors
576
def test_no_color(self):
577
"""Ensure --no-color switch can be passed"""
578
self.tree = self.make_branch_and_tree('.')
582
self.tree.add(subdir)
585
self.__create_and_add_test_file()
587
# Modify the test file
588
# write in binary mode because on win32 line-endings should be LF
589
f = file('test_file', 'wb')
590
f.write(self.MODIFIED)
592
stdout, error = self.run_bzr_captured(['shelve', '--all',
594
stdout, error = self.run_bzr_captured(['unshelve', '--all',