66
78
self.build_tree_contents([('tree/foo', LINES_ZY)])
82
class TestShelver(ShelfTestCase):
69
84
def test_unexpected_prompt_failure(self):
70
85
tree = self.create_shelvable_tree()
86
tree.lock_tree_write()
87
self.addCleanup(tree.unlock)
71
88
shelver = ExpectShelver(tree, tree.basis_tree())
89
self.addCleanup(shelver.finalize)
72
90
e = self.assertRaises(AssertionError, shelver.run)
73
self.assertEqual('Unexpected prompt: Shelve? [yNfq?]', str(e))
91
self.assertEqual('Unexpected prompt: Shelve?', str(e))
75
93
def test_wrong_prompt_failure(self):
76
94
tree = self.create_shelvable_tree()
95
tree.lock_tree_write()
96
self.addCleanup(tree.unlock)
77
97
shelver = ExpectShelver(tree, tree.basis_tree())
78
shelver.expect('foo', 'y')
98
self.addCleanup(shelver.finalize)
99
shelver.expect('foo', 0)
79
100
e = self.assertRaises(AssertionError, shelver.run)
80
self.assertEqual('Wrong prompt: Shelve? [yNfq?]', str(e))
101
self.assertEqual('Wrong prompt: Shelve?', str(e))
82
103
def test_shelve_not_diff(self):
83
104
tree = self.create_shelvable_tree()
105
tree.lock_tree_write()
106
self.addCleanup(tree.unlock)
84
107
shelver = ExpectShelver(tree, tree.basis_tree())
85
shelver.expect('Shelve? [yNfq?]', 'n')
86
shelver.expect('Shelve? [yNfq?]', 'n')
108
self.addCleanup(shelver.finalize)
109
shelver.expect('Shelve?', 1)
110
shelver.expect('Shelve?', 1)
87
111
# No final shelving prompt because no changes were selected
89
113
self.assertFileEqual(LINES_ZY, 'tree/foo')
91
115
def test_shelve_diff_no(self):
92
116
tree = self.create_shelvable_tree()
117
tree.lock_tree_write()
118
self.addCleanup(tree.unlock)
93
119
shelver = ExpectShelver(tree, tree.basis_tree())
94
shelver.expect('Shelve? [yNfq?]', 'y')
95
shelver.expect('Shelve? [yNfq?]', 'y')
96
shelver.expect('Shelve 2 change(s)? [yNfq?]', 'n')
120
self.addCleanup(shelver.finalize)
121
shelver.expect('Shelve?', 0)
122
shelver.expect('Shelve?', 0)
123
shelver.expect('Shelve 2 change(s)?', 1)
98
125
self.assertFileEqual(LINES_ZY, 'tree/foo')
100
127
def test_shelve_diff(self):
101
128
tree = self.create_shelvable_tree()
129
tree.lock_tree_write()
130
self.addCleanup(tree.unlock)
102
131
shelver = ExpectShelver(tree, tree.basis_tree())
103
shelver.expect('Shelve? [yNfq?]', 'y')
104
shelver.expect('Shelve? [yNfq?]', 'y')
105
shelver.expect('Shelve 2 change(s)? [yNfq?]', 'y')
132
self.addCleanup(shelver.finalize)
133
shelver.expect('Shelve?', 0)
134
shelver.expect('Shelve?', 0)
135
shelver.expect('Shelve 2 change(s)?', 0)
107
137
self.assertFileEqual(LINES_AJ, 'tree/foo')
109
139
def test_shelve_one_diff(self):
110
140
tree = self.create_shelvable_tree()
141
tree.lock_tree_write()
142
self.addCleanup(tree.unlock)
111
143
shelver = ExpectShelver(tree, tree.basis_tree())
112
shelver.expect('Shelve? [yNfq?]', 'y')
113
shelver.expect('Shelve? [yNfq?]', 'n')
114
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
144
self.addCleanup(shelver.finalize)
145
shelver.expect('Shelve?', 0)
146
shelver.expect('Shelve?', 1)
147
shelver.expect('Shelve 1 change(s)?', 0)
116
149
self.assertFileEqual(LINES_AY, 'tree/foo')
118
151
def test_shelve_binary_change(self):
119
152
tree = self.create_shelvable_tree()
120
153
self.build_tree_contents([('tree/foo', '\x00')])
154
tree.lock_tree_write()
155
self.addCleanup(tree.unlock)
121
156
shelver = ExpectShelver(tree, tree.basis_tree())
122
shelver.expect('Shelve binary changes? [yNfq?]', 'y')
123
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
157
self.addCleanup(shelver.finalize)
158
shelver.expect('Shelve binary changes?', 0)
159
shelver.expect('Shelve 1 change(s)?', 0)
125
161
self.assertFileEqual(LINES_AJ, 'tree/foo')
127
163
def test_shelve_rename(self):
128
164
tree = self.create_shelvable_tree()
129
165
tree.rename_one('foo', 'bar')
166
tree.lock_tree_write()
167
self.addCleanup(tree.unlock)
130
168
shelver = ExpectShelver(tree, tree.basis_tree())
131
shelver.expect('Shelve renaming "foo" => "bar"? [yNfq?]', 'y')
132
shelver.expect('Shelve? [yNfq?]', 'y')
133
shelver.expect('Shelve? [yNfq?]', 'y')
134
shelver.expect('Shelve 3 change(s)? [yNfq?]', 'y')
169
self.addCleanup(shelver.finalize)
170
shelver.expect('Shelve renaming "foo" => "bar"?', 0)
171
shelver.expect('Shelve?', 0)
172
shelver.expect('Shelve?', 0)
173
shelver.expect('Shelve 3 change(s)?', 0)
136
175
self.assertFileEqual(LINES_AJ, 'tree/foo')
138
177
def test_shelve_deletion(self):
139
178
tree = self.create_shelvable_tree()
140
179
os.unlink('tree/foo')
180
tree.lock_tree_write()
181
self.addCleanup(tree.unlock)
141
182
shelver = ExpectShelver(tree, tree.basis_tree())
142
shelver.expect('Shelve removing file "foo"? [yNfq?]', 'y')
143
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
183
self.addCleanup(shelver.finalize)
184
shelver.expect('Shelve removing file "foo"?', 0)
185
shelver.expect('Shelve 1 change(s)?', 0)
145
187
self.assertFileEqual(LINES_AJ, 'tree/foo')
149
191
tree.commit('add tree root')
150
192
self.build_tree(['tree/foo'])
194
tree.lock_tree_write()
195
self.addCleanup(tree.unlock)
152
196
shelver = ExpectShelver(tree, tree.basis_tree())
153
shelver.expect('Shelve adding file "foo"? [yNfq?]', 'y')
154
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
197
self.addCleanup(shelver.finalize)
198
shelver.expect('Shelve adding file "foo"?', 0)
199
shelver.expect('Shelve 1 change(s)?', 0)
156
self.failIfExists('tree/foo')
201
self.assertPathDoesNotExist('tree/foo')
158
203
def test_shelve_kind_change(self):
159
204
tree = self.create_shelvable_tree()
160
205
os.unlink('tree/foo')
161
206
os.mkdir('tree/foo')
207
tree.lock_tree_write()
208
self.addCleanup(tree.unlock)
162
209
shelver = ExpectShelver(tree, tree.basis_tree())
163
shelver.expect('Shelve changing "foo" from file to directory? [yNfq?]',
165
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
210
self.addCleanup(shelver.finalize)
211
shelver.expect('Shelve changing "foo" from file to directory?',
213
shelver.expect('Shelve 1 change(s)?', 0)
167
215
def test_shelve_modify_target(self):
168
self.requireFeature(tests.SymlinkFeature)
216
self.requireFeature(features.SymlinkFeature)
169
217
tree = self.create_shelvable_tree()
170
218
os.symlink('bar', 'tree/baz')
171
219
tree.add('baz', 'baz-id')
172
220
tree.commit("Add symlink")
173
221
os.unlink('tree/baz')
174
222
os.symlink('vax', 'tree/baz')
223
tree.lock_tree_write()
224
self.addCleanup(tree.unlock)
175
225
shelver = ExpectShelver(tree, tree.basis_tree())
226
self.addCleanup(shelver.finalize)
176
227
shelver.expect('Shelve changing target of "baz" from "bar" to '
177
'"vax"? [yNfq?]', 'y')
178
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
229
shelver.expect('Shelve 1 change(s)?', 0)
180
231
self.assertEqual('bar', os.readlink('tree/baz'))
182
233
def test_shelve_finish(self):
183
234
tree = self.create_shelvable_tree()
235
tree.lock_tree_write()
236
self.addCleanup(tree.unlock)
184
237
shelver = ExpectShelver(tree, tree.basis_tree())
185
shelver.expect('Shelve? [yNfq?]', 'f')
186
shelver.expect('Shelve 2 change(s)? [yNfq?]', 'y')
238
self.addCleanup(shelver.finalize)
239
shelver.expect('Shelve?', 2)
240
shelver.expect('Shelve 2 change(s)?', 0)
188
242
self.assertFileEqual(LINES_AJ, 'tree/foo')
190
244
def test_shelve_quit(self):
191
245
tree = self.create_shelvable_tree()
246
tree.lock_tree_write()
247
self.addCleanup(tree.unlock)
192
248
shelver = ExpectShelver(tree, tree.basis_tree())
193
shelver.expect('Shelve? [yNfq?]', 'q')
249
self.addCleanup(shelver.finalize)
250
shelver.expect('Shelve?', 3)
194
251
self.assertRaises(errors.UserAbort, shelver.run)
195
252
self.assertFileEqual(LINES_ZY, 'tree/foo')
197
254
def test_shelve_all(self):
198
255
tree = self.create_shelvable_tree()
199
ExpectShelver.from_args(sys.stdout, all=True, directory='tree').run()
256
shelver = ExpectShelver.from_args(sys.stdout, all=True,
200
262
self.assertFileEqual(LINES_AJ, 'tree/foo')
202
264
def test_shelve_filename(self):
203
265
tree = self.create_shelvable_tree()
204
266
self.build_tree(['tree/bar'])
268
tree.lock_tree_write()
269
self.addCleanup(tree.unlock)
206
270
shelver = ExpectShelver(tree, tree.basis_tree(), file_list=['bar'])
207
shelver.expect('Shelve adding file "bar"? [yNfq?]', 'y')
208
shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
211
def test_shelve_help(self):
212
tree = self.create_shelvable_tree()
213
shelver = ExpectShelver(tree, tree.basis_tree())
214
shelver.expect('Shelve? [yNfq?]', '?')
215
shelver.expect('Shelve? [(y)es, (N)o, (f)inish, or (q)uit]', 'f')
216
shelver.expect('Shelve 2 change(s)? [yNfq?]', 'y')
219
def test_shelve_distroy(self):
271
self.addCleanup(shelver.finalize)
272
shelver.expect('Shelve adding file "bar"?', 0)
273
shelver.expect('Shelve 1 change(s)?', 0)
276
def test_shelve_destroy(self):
220
277
tree = self.create_shelvable_tree()
221
278
shelver = shelf_ui.Shelver.from_args(sys.stdout, all=True,
222
279
directory='tree', destroy=True)
280
self.addCleanup(shelver.finalize)
224
282
self.assertIs(None, tree.get_shelf_manager().last_shelf())
225
283
self.assertFileEqual(LINES_AJ, 'tree/foo')
228
class TestApplyReporter(TestShelver):
286
def shelve_all(tree, target_revision_id):
289
target = tree.branch.repository.revision_tree(target_revision_id)
290
shelver = shelf_ui.Shelver(tree, target, auto=True,
299
def test_shelve_old_root_preserved(self):
300
tree1 = self.make_branch_and_tree('tree1')
301
tree1.commit('add root')
302
tree1_root_id = tree1.get_root_id()
303
tree2 = self.make_branch_and_tree('tree2')
304
rev2 = tree2.commit('add root')
305
self.assertNotEquals(tree1_root_id, tree2.get_root_id())
306
tree1.merge_from_branch(tree2.branch,
307
from_revision=revision.NULL_REVISION)
308
tree1.commit('merging in tree2')
309
self.assertEquals(tree1_root_id, tree1.get_root_id())
310
# This is essentially assertNotRaises(InconsistentDelta)
311
# With testtools 0.9.9, it can be rewritten as:
312
# with ExpectedException(AssertionError,
313
# 'InconsistentDelta not raised'):
314
# with ExpectedException(errors.InconsistentDelta, ''):
315
# self.shelve_all(tree1, rev2)
316
e = self.assertRaises(AssertionError, self.assertRaises,
317
errors.InconsistentDelta, self.shelve_all, tree1,
319
self.assertContainsRe('InconsistentDelta not raised', str(e))
321
def test_shelve_split(self):
322
outer_tree = self.make_branch_and_tree('outer')
323
outer_tree.commit('Add root')
324
inner_tree = self.make_branch_and_tree('outer/inner')
325
rev2 = inner_tree.commit('Add root')
326
outer_tree.subsume(inner_tree)
327
# This is essentially assertNotRaises(ValueError).
328
# The ValueError is 'None is not a valid file id'.
329
self.expectFailure('Cannot shelve a join back to the inner tree.',
330
self.assertRaises, AssertionError,
331
self.assertRaises, ValueError, self.shelve_all,
335
class TestApplyReporter(ShelfTestCase):
230
337
def test_shelve_not_diff(self):
231
338
tree = self.create_shelvable_tree()
339
tree.lock_tree_write()
340
self.addCleanup(tree.unlock)
232
341
shelver = ExpectShelver(tree, tree.basis_tree(),
233
342
reporter=shelf_ui.ApplyReporter())
234
shelver.expect('Apply change? [yNfq?]', 'n')
235
shelver.expect('Apply change? [yNfq?]', 'n')
343
self.addCleanup(shelver.finalize)
344
shelver.expect('Apply change?', 1)
345
shelver.expect('Apply change?', 1)
236
346
# No final shelving prompt because no changes were selected
238
348
self.assertFileEqual(LINES_ZY, 'tree/foo')
240
350
def test_shelve_diff_no(self):
241
351
tree = self.create_shelvable_tree()
352
tree.lock_tree_write()
353
self.addCleanup(tree.unlock)
242
354
shelver = ExpectShelver(tree, tree.basis_tree(),
243
355
reporter=shelf_ui.ApplyReporter())
244
shelver.expect('Apply change? [yNfq?]', 'y')
245
shelver.expect('Apply change? [yNfq?]', 'y')
246
shelver.expect('Apply 2 change(s)? [yNfq?]', 'n')
356
self.addCleanup(shelver.finalize)
357
shelver.expect('Apply change?', 0)
358
shelver.expect('Apply change?', 0)
359
shelver.expect('Apply 2 change(s)?', 1)
248
361
self.assertFileEqual(LINES_ZY, 'tree/foo')
250
363
def test_shelve_diff(self):
251
364
tree = self.create_shelvable_tree()
365
tree.lock_tree_write()
366
self.addCleanup(tree.unlock)
252
367
shelver = ExpectShelver(tree, tree.basis_tree(),
253
368
reporter=shelf_ui.ApplyReporter())
254
shelver.expect('Apply change? [yNfq?]', 'y')
255
shelver.expect('Apply change? [yNfq?]', 'y')
256
shelver.expect('Apply 2 change(s)? [yNfq?]', 'y')
369
self.addCleanup(shelver.finalize)
370
shelver.expect('Apply change?', 0)
371
shelver.expect('Apply change?', 0)
372
shelver.expect('Apply 2 change(s)?', 0)
258
374
self.assertFileEqual(LINES_AJ, 'tree/foo')
260
376
def test_shelve_binary_change(self):
261
377
tree = self.create_shelvable_tree()
262
378
self.build_tree_contents([('tree/foo', '\x00')])
379
tree.lock_tree_write()
380
self.addCleanup(tree.unlock)
263
381
shelver = ExpectShelver(tree, tree.basis_tree(),
264
382
reporter=shelf_ui.ApplyReporter())
265
shelver.expect('Apply binary changes? [yNfq?]', 'y')
266
shelver.expect('Apply 1 change(s)? [yNfq?]', 'y')
383
self.addCleanup(shelver.finalize)
384
shelver.expect('Apply binary changes?', 0)
385
shelver.expect('Apply 1 change(s)?', 0)
268
387
self.assertFileEqual(LINES_AJ, 'tree/foo')
270
389
def test_shelve_rename(self):
271
390
tree = self.create_shelvable_tree()
272
391
tree.rename_one('foo', 'bar')
392
tree.lock_tree_write()
393
self.addCleanup(tree.unlock)
273
394
shelver = ExpectShelver(tree, tree.basis_tree(),
274
395
reporter=shelf_ui.ApplyReporter())
275
shelver.expect('Rename "bar" => "foo"? [yNfq?]', 'y')
276
shelver.expect('Apply change? [yNfq?]', 'y')
277
shelver.expect('Apply change? [yNfq?]', 'y')
278
shelver.expect('Apply 3 change(s)? [yNfq?]', 'y')
396
self.addCleanup(shelver.finalize)
397
shelver.expect('Rename "bar" => "foo"?', 0)
398
shelver.expect('Apply change?', 0)
399
shelver.expect('Apply change?', 0)
400
shelver.expect('Apply 3 change(s)?', 0)
280
402
self.assertFileEqual(LINES_AJ, 'tree/foo')
282
404
def test_shelve_deletion(self):
283
405
tree = self.create_shelvable_tree()
284
406
os.unlink('tree/foo')
407
tree.lock_tree_write()
408
self.addCleanup(tree.unlock)
285
409
shelver = ExpectShelver(tree, tree.basis_tree(),
286
410
reporter=shelf_ui.ApplyReporter())
287
shelver.expect('Add file "foo"? [yNfq?]', 'y')
288
shelver.expect('Apply 1 change(s)? [yNfq?]', 'y')
411
self.addCleanup(shelver.finalize)
412
shelver.expect('Add file "foo"?', 0)
413
shelver.expect('Apply 1 change(s)?', 0)
290
415
self.assertFileEqual(LINES_AJ, 'tree/foo')
294
419
tree.commit('add tree root')
295
420
self.build_tree(['tree/foo'])
422
tree.lock_tree_write()
423
self.addCleanup(tree.unlock)
297
424
shelver = ExpectShelver(tree, tree.basis_tree(),
298
425
reporter=shelf_ui.ApplyReporter())
299
shelver.expect('Delete file "foo"? [yNfq?]', 'y')
300
shelver.expect('Apply 1 change(s)? [yNfq?]', 'y')
426
self.addCleanup(shelver.finalize)
427
shelver.expect('Delete file "foo"?', 0)
428
shelver.expect('Apply 1 change(s)?', 0)
302
self.failIfExists('tree/foo')
430
self.assertPathDoesNotExist('tree/foo')
304
432
def test_shelve_kind_change(self):
305
433
tree = self.create_shelvable_tree()
306
434
os.unlink('tree/foo')
307
435
os.mkdir('tree/foo')
436
tree.lock_tree_write()
437
self.addCleanup(tree.unlock)
308
438
shelver = ExpectShelver(tree, tree.basis_tree(),
309
439
reporter=shelf_ui.ApplyReporter())
310
shelver.expect('Change "foo" from directory to a file? [yNfq?]', 'y')
311
shelver.expect('Apply 1 change(s)? [yNfq?]', 'y')
440
self.addCleanup(shelver.finalize)
441
shelver.expect('Change "foo" from directory to a file?', 0)
442
shelver.expect('Apply 1 change(s)?', 0)
313
444
def test_shelve_modify_target(self):
314
self.requireFeature(tests.SymlinkFeature)
445
self.requireFeature(features.SymlinkFeature)
315
446
tree = self.create_shelvable_tree()
316
447
os.symlink('bar', 'tree/baz')
317
448
tree.add('baz', 'baz-id')
318
449
tree.commit("Add symlink")
319
450
os.unlink('tree/baz')
320
451
os.symlink('vax', 'tree/baz')
452
tree.lock_tree_write()
453
self.addCleanup(tree.unlock)
321
454
shelver = ExpectShelver(tree, tree.basis_tree(),
322
455
reporter=shelf_ui.ApplyReporter())
323
shelver.expect('Change target of "baz" from "vax" to "bar"? [yNfq?]',
325
shelver.expect('Apply 1 change(s)? [yNfq?]', 'y')
456
self.addCleanup(shelver.finalize)
457
shelver.expect('Change target of "baz" from "vax" to "bar"?',
459
shelver.expect('Apply 1 change(s)?', 0)
327
461
self.assertEqual('bar', os.readlink('tree/baz'))