69
74
def test_unexpected_prompt_failure(self):
70
self.thisFailsStrictLockCheck()
71
75
tree = self.create_shelvable_tree()
76
tree.lock_tree_write()
77
self.addCleanup(tree.unlock)
72
78
shelver = ExpectShelver(tree, tree.basis_tree())
73
79
e = self.assertRaises(AssertionError, shelver.run)
74
80
self.assertEqual('Unexpected prompt: Shelve? [yNfq?]', str(e))
76
82
def test_wrong_prompt_failure(self):
77
self.thisFailsStrictLockCheck()
78
83
tree = self.create_shelvable_tree()
84
tree.lock_tree_write()
85
self.addCleanup(tree.unlock)
79
86
shelver = ExpectShelver(tree, tree.basis_tree())
80
87
shelver.expect('foo', 'y')
81
88
e = self.assertRaises(AssertionError, shelver.run)
82
89
self.assertEqual('Wrong prompt: Shelve? [yNfq?]', str(e))
84
91
def test_shelve_not_diff(self):
85
self.thisFailsStrictLockCheck()
86
92
tree = self.create_shelvable_tree()
93
tree.lock_tree_write()
94
self.addCleanup(tree.unlock)
87
95
shelver = ExpectShelver(tree, tree.basis_tree())
88
96
shelver.expect('Shelve? [yNfq?]', 'n')
89
97
shelver.expect('Shelve? [yNfq?]', 'n')
92
100
self.assertFileEqual(LINES_ZY, 'tree/foo')
94
102
def test_shelve_diff_no(self):
95
self.thisFailsStrictLockCheck()
96
103
tree = self.create_shelvable_tree()
104
tree.lock_tree_write()
105
self.addCleanup(tree.unlock)
97
106
shelver = ExpectShelver(tree, tree.basis_tree())
98
107
shelver.expect('Shelve? [yNfq?]', 'y')
99
108
shelver.expect('Shelve? [yNfq?]', 'y')
102
111
self.assertFileEqual(LINES_ZY, 'tree/foo')
104
113
def test_shelve_diff(self):
105
self.thisFailsStrictLockCheck()
106
114
tree = self.create_shelvable_tree()
115
tree.lock_tree_write()
116
self.addCleanup(tree.unlock)
107
117
shelver = ExpectShelver(tree, tree.basis_tree())
108
118
shelver.expect('Shelve? [yNfq?]', 'y')
109
119
shelver.expect('Shelve? [yNfq?]', 'y')
112
122
self.assertFileEqual(LINES_AJ, 'tree/foo')
114
124
def test_shelve_one_diff(self):
115
self.thisFailsStrictLockCheck()
116
125
tree = self.create_shelvable_tree()
126
tree.lock_tree_write()
127
self.addCleanup(tree.unlock)
117
128
shelver = ExpectShelver(tree, tree.basis_tree())
118
129
shelver.expect('Shelve? [yNfq?]', 'y')
119
130
shelver.expect('Shelve? [yNfq?]', 'n')
122
133
self.assertFileEqual(LINES_AY, 'tree/foo')
124
135
def test_shelve_binary_change(self):
125
self.thisFailsStrictLockCheck()
126
136
tree = self.create_shelvable_tree()
127
137
self.build_tree_contents([('tree/foo', '\x00')])
138
tree.lock_tree_write()
139
self.addCleanup(tree.unlock)
128
140
shelver = ExpectShelver(tree, tree.basis_tree())
129
141
shelver.expect('Shelve binary changes? [yNfq?]', 'y')
130
142
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
132
144
self.assertFileEqual(LINES_AJ, 'tree/foo')
134
146
def test_shelve_rename(self):
135
self.thisFailsStrictLockCheck()
136
147
tree = self.create_shelvable_tree()
137
148
tree.rename_one('foo', 'bar')
149
tree.lock_tree_write()
150
self.addCleanup(tree.unlock)
138
151
shelver = ExpectShelver(tree, tree.basis_tree())
139
152
shelver.expect('Shelve renaming "foo" => "bar"? [yNfq?]', 'y')
140
153
shelver.expect('Shelve? [yNfq?]', 'y')
144
157
self.assertFileEqual(LINES_AJ, 'tree/foo')
146
159
def test_shelve_deletion(self):
147
self.thisFailsStrictLockCheck()
148
160
tree = self.create_shelvable_tree()
149
161
os.unlink('tree/foo')
162
tree.lock_tree_write()
163
self.addCleanup(tree.unlock)
150
164
shelver = ExpectShelver(tree, tree.basis_tree())
151
165
shelver.expect('Shelve removing file "foo"? [yNfq?]', 'y')
152
166
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
154
168
self.assertFileEqual(LINES_AJ, 'tree/foo')
156
170
def test_shelve_creation(self):
157
self.thisFailsStrictLockCheck()
158
171
tree = self.make_branch_and_tree('tree')
159
172
tree.commit('add tree root')
160
173
self.build_tree(['tree/foo'])
175
tree.lock_tree_write()
176
self.addCleanup(tree.unlock)
162
177
shelver = ExpectShelver(tree, tree.basis_tree())
163
178
shelver.expect('Shelve adding file "foo"? [yNfq?]', 'y')
164
179
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
166
181
self.failIfExists('tree/foo')
168
183
def test_shelve_kind_change(self):
169
self.thisFailsStrictLockCheck()
170
184
tree = self.create_shelvable_tree()
171
185
os.unlink('tree/foo')
172
186
os.mkdir('tree/foo')
187
tree.lock_tree_write()
188
self.addCleanup(tree.unlock)
173
189
shelver = ExpectShelver(tree, tree.basis_tree())
174
190
shelver.expect('Shelve changing "foo" from file to directory? [yNfq?]',
176
192
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
178
194
def test_shelve_modify_target(self):
179
self.thisFailsStrictLockCheck()
180
195
self.requireFeature(tests.SymlinkFeature)
181
196
tree = self.create_shelvable_tree()
182
197
os.symlink('bar', 'tree/baz')
192
209
self.assertEqual('bar', os.readlink('tree/baz'))
194
211
def test_shelve_finish(self):
195
self.thisFailsStrictLockCheck()
196
212
tree = self.create_shelvable_tree()
213
tree.lock_tree_write()
214
self.addCleanup(tree.unlock)
197
215
shelver = ExpectShelver(tree, tree.basis_tree())
198
216
shelver.expect('Shelve? [yNfq?]', 'f')
199
217
shelver.expect('Shelve 2 change(s)? [yNfq?]', 'y')
201
219
self.assertFileEqual(LINES_AJ, 'tree/foo')
203
221
def test_shelve_quit(self):
204
self.thisFailsStrictLockCheck()
205
222
tree = self.create_shelvable_tree()
223
tree.lock_tree_write()
224
self.addCleanup(tree.unlock)
206
225
shelver = ExpectShelver(tree, tree.basis_tree())
207
226
shelver.expect('Shelve? [yNfq?]', 'q')
208
227
self.assertRaises(errors.UserAbort, shelver.run)
209
228
self.assertFileEqual(LINES_ZY, 'tree/foo')
211
230
def test_shelve_all(self):
212
self.thisFailsStrictLockCheck()
213
231
tree = self.create_shelvable_tree()
214
ExpectShelver.from_args(sys.stdout, all=True, directory='tree').run()
232
shelver = ExpectShelver.from_args(sys.stdout, all=True,
237
shelver.work_tree.unlock()
215
238
self.assertFileEqual(LINES_AJ, 'tree/foo')
217
240
def test_shelve_filename(self):
218
self.thisFailsStrictLockCheck()
219
241
tree = self.create_shelvable_tree()
220
242
self.build_tree(['tree/bar'])
244
tree.lock_tree_write()
245
self.addCleanup(tree.unlock)
222
246
shelver = ExpectShelver(tree, tree.basis_tree(), file_list=['bar'])
223
247
shelver.expect('Shelve adding file "bar"? [yNfq?]', 'y')
224
248
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
227
251
def test_shelve_help(self):
228
self.thisFailsStrictLockCheck()
229
252
tree = self.create_shelvable_tree()
253
tree.lock_tree_write()
254
self.addCleanup(tree.unlock)
230
255
shelver = ExpectShelver(tree, tree.basis_tree())
231
256
shelver.expect('Shelve? [yNfq?]', '?')
232
257
shelver.expect('Shelve? [(y)es, (N)o, (f)inish, or (q)uit]', 'f')
236
261
def test_shelve_distroy(self):
237
self.thisFailsStrictLockCheck()
238
262
tree = self.create_shelvable_tree()
239
263
shelver = shelf_ui.Shelver.from_args(sys.stdout, all=True,
240
264
directory='tree', destroy=True)
268
shelver.work_tree.unlock()
242
269
self.assertIs(None, tree.get_shelf_manager().last_shelf())
243
270
self.assertFileEqual(LINES_AJ, 'tree/foo')
273
def shelve_all(tree, target_revision_id):
276
target = tree.branch.repository.revision_tree(target_revision_id)
277
shelver = shelf_ui.Shelver(tree, target, auto=True,
283
def test_shelve_old_root_deleted(self):
284
tree1 = self.make_branch_and_tree('tree1')
285
tree1.commit('add root')
286
tree2 = self.make_branch_and_tree('tree2')
287
rev2 = tree2.commit('add root')
288
tree1.merge_from_branch(tree2.branch,
289
from_revision=revision.NULL_REVISION)
290
tree1.commit('Replaced root entry')
291
# This is essentially assertNotRaises(InconsistentDelta)
292
self.expectFailure('Cannot shelve replacing a root entry',
293
self.assertRaises, AssertionError,
294
self.assertRaises, errors.InconsistentDelta,
295
self.shelve_all, tree1, rev2)
297
def test_shelve_split(self):
298
outer_tree = self.make_branch_and_tree('outer')
299
outer_tree.commit('Add root')
300
inner_tree = self.make_branch_and_tree('outer/inner')
301
rev2 = inner_tree.commit('Add root')
302
outer_tree.subsume(inner_tree)
303
# This is essentially assertNotRaises(ValueError).
304
# The ValueError is 'None is not a valid file id'.
305
self.expectFailure('Cannot shelve a join back to the inner tree.',
306
self.assertRaises, AssertionError,
307
self.assertRaises, ValueError, self.shelve_all,
246
311
class TestApplyReporter(TestShelver):
248
313
def test_shelve_not_diff(self):
249
self.thisFailsStrictLockCheck()
250
314
tree = self.create_shelvable_tree()
315
tree.lock_tree_write()
316
self.addCleanup(tree.unlock)
251
317
shelver = ExpectShelver(tree, tree.basis_tree(),
252
318
reporter=shelf_ui.ApplyReporter())
253
319
shelver.expect('Apply change? [yNfq?]', 'n')
257
323
self.assertFileEqual(LINES_ZY, 'tree/foo')
259
325
def test_shelve_diff_no(self):
260
self.thisFailsStrictLockCheck()
261
326
tree = self.create_shelvable_tree()
327
tree.lock_tree_write()
328
self.addCleanup(tree.unlock)
262
329
shelver = ExpectShelver(tree, tree.basis_tree(),
263
330
reporter=shelf_ui.ApplyReporter())
264
331
shelver.expect('Apply change? [yNfq?]', 'y')
268
335
self.assertFileEqual(LINES_ZY, 'tree/foo')
270
337
def test_shelve_diff(self):
271
self.thisFailsStrictLockCheck()
272
338
tree = self.create_shelvable_tree()
339
tree.lock_tree_write()
340
self.addCleanup(tree.unlock)
273
341
shelver = ExpectShelver(tree, tree.basis_tree(),
274
342
reporter=shelf_ui.ApplyReporter())
275
343
shelver.expect('Apply change? [yNfq?]', 'y')
279
347
self.assertFileEqual(LINES_AJ, 'tree/foo')
281
349
def test_shelve_binary_change(self):
282
self.thisFailsStrictLockCheck()
283
350
tree = self.create_shelvable_tree()
284
351
self.build_tree_contents([('tree/foo', '\x00')])
352
tree.lock_tree_write()
353
self.addCleanup(tree.unlock)
285
354
shelver = ExpectShelver(tree, tree.basis_tree(),
286
355
reporter=shelf_ui.ApplyReporter())
287
356
shelver.expect('Apply binary changes? [yNfq?]', 'y')
290
359
self.assertFileEqual(LINES_AJ, 'tree/foo')
292
361
def test_shelve_rename(self):
293
self.thisFailsStrictLockCheck()
294
362
tree = self.create_shelvable_tree()
295
363
tree.rename_one('foo', 'bar')
364
tree.lock_tree_write()
365
self.addCleanup(tree.unlock)
296
366
shelver = ExpectShelver(tree, tree.basis_tree(),
297
367
reporter=shelf_ui.ApplyReporter())
298
368
shelver.expect('Rename "bar" => "foo"? [yNfq?]', 'y')
303
373
self.assertFileEqual(LINES_AJ, 'tree/foo')
305
375
def test_shelve_deletion(self):
306
self.thisFailsStrictLockCheck()
307
376
tree = self.create_shelvable_tree()
308
377
os.unlink('tree/foo')
378
tree.lock_tree_write()
379
self.addCleanup(tree.unlock)
309
380
shelver = ExpectShelver(tree, tree.basis_tree(),
310
381
reporter=shelf_ui.ApplyReporter())
311
382
shelver.expect('Add file "foo"? [yNfq?]', 'y')
314
385
self.assertFileEqual(LINES_AJ, 'tree/foo')
316
387
def test_shelve_creation(self):
317
self.thisFailsStrictLockCheck()
318
388
tree = self.make_branch_and_tree('tree')
319
389
tree.commit('add tree root')
320
390
self.build_tree(['tree/foo'])
392
tree.lock_tree_write()
393
self.addCleanup(tree.unlock)
322
394
shelver = ExpectShelver(tree, tree.basis_tree(),
323
395
reporter=shelf_ui.ApplyReporter())
324
396
shelver.expect('Delete file "foo"? [yNfq?]', 'y')
327
399
self.failIfExists('tree/foo')
329
401
def test_shelve_kind_change(self):
330
self.thisFailsStrictLockCheck()
331
402
tree = self.create_shelvable_tree()
332
403
os.unlink('tree/foo')
333
404
os.mkdir('tree/foo')
405
tree.lock_tree_write()
406
self.addCleanup(tree.unlock)
334
407
shelver = ExpectShelver(tree, tree.basis_tree(),
335
408
reporter=shelf_ui.ApplyReporter())
336
409
shelver.expect('Change "foo" from directory to a file? [yNfq?]', 'y')
337
410
shelver.expect('Apply 1 change(s)? [yNfq?]', 'y')
339
412
def test_shelve_modify_target(self):
340
self.thisFailsStrictLockCheck()
341
413
self.requireFeature(tests.SymlinkFeature)
342
414
tree = self.create_shelvable_tree()
343
415
os.symlink('bar', 'tree/baz')
345
417
tree.commit("Add symlink")
346
418
os.unlink('tree/baz')
347
419
os.symlink('vax', 'tree/baz')
420
tree.lock_tree_write()
421
self.addCleanup(tree.unlock)
348
422
shelver = ExpectShelver(tree, tree.basis_tree(),
349
423
reporter=shelf_ui.ApplyReporter())
350
424
shelver.expect('Change target of "baz" from "vax" to "bar"? [yNfq?]',
359
433
def create_tree_with_shelf(self):
360
434
tree = self.make_branch_and_tree('tree')
361
self.build_tree_contents([('tree/foo', LINES_AJ)])
362
tree.add('foo', 'foo-id')
363
tree.commit('added foo')
364
self.build_tree_contents([('tree/foo', LINES_ZY)])
365
shelf_ui.Shelver(tree, tree.basis_tree(), auto_apply=True,
437
self.build_tree_contents([('tree/foo', LINES_AJ)])
438
tree.add('foo', 'foo-id')
439
tree.commit('added foo')
440
self.build_tree_contents([('tree/foo', LINES_ZY)])
441
shelf_ui.Shelver(tree, tree.basis_tree(), auto_apply=True,
369
447
def test_unshelve(self):
370
self.thisFailsStrictLockCheck()
371
448
tree = self.create_tree_with_shelf()
372
449
tree.lock_write()
373
450
self.addCleanup(tree.unlock)
376
453
self.assertFileEqual(LINES_ZY, 'tree/foo')
378
455
def test_unshelve_args(self):
379
self.thisFailsStrictLockCheck()
380
456
tree = self.create_tree_with_shelf()
381
shelf_ui.Unshelver.from_args(directory='tree').run()
457
unshelver = shelf_ui.Unshelver.from_args(directory='tree')
461
unshelver.tree.unlock()
382
462
self.assertFileEqual(LINES_ZY, 'tree/foo')
383
463
self.assertIs(None, tree.get_shelf_manager().last_shelf())
385
465
def test_unshelve_args_dry_run(self):
386
self.thisFailsStrictLockCheck()
387
466
tree = self.create_tree_with_shelf()
388
shelf_ui.Unshelver.from_args(directory='tree', action='dry-run').run()
467
unshelver = shelf_ui.Unshelver.from_args(directory='tree',
472
unshelver.tree.unlock()
389
473
self.assertFileEqual(LINES_AJ, 'tree/foo')
390
474
self.assertEqual(1, tree.get_shelf_manager().last_shelf())
392
476
def test_unshelve_args_delete_only(self):
393
self.thisFailsStrictLockCheck()
394
477
tree = self.make_branch_and_tree('tree')
395
478
manager = tree.get_shelf_manager()
396
479
shelf_file = manager.new_shelf()[1]
400
483
shelf_file.close()
401
484
unshelver = shelf_ui.Unshelver.from_args(directory='tree',
402
485
action='delete-only')
489
unshelver.tree.unlock()
404
490
self.assertIs(None, manager.last_shelf())
406
492
def test_unshelve_args_invalid_shelf_id(self):
407
self.thisFailsStrictLockCheck()
408
493
tree = self.make_branch_and_tree('tree')
409
494
manager = tree.get_shelf_manager()
410
495
shelf_file = manager.new_shelf()[1]