207
214
request = request_class(backing)
208
215
expected = smart_req.SuccessfulSmartServerResponse(
209
216
(local_result.network_name(),
210
local_result.repository_format.network_name(),
211
('branch', local_result.get_branch_format().network_name())))
212
self.assertEqual(expected, request.execute('', 'False'))
217
local_result.repository_format.network_name(),
218
(b'branch', local_result.get_branch_format().network_name())))
219
self.assertEqual(expected, request.execute(b'', b'False'))
214
221
def test_cloning_metadir_reference(self):
215
222
"""The request fails when bzrdir contains a branch reference."""
216
223
backing = self.get_transport()
217
224
referenced_branch = self.make_branch('referenced')
218
225
dir = self.make_controldir('.')
219
local_result = dir.cloning_metadir()
220
reference = _mod_bzrbranch.BranchReferenceFormat().initialize(
226
dir.cloning_metadir()
227
_mod_bzrbranch.BranchReferenceFormat().initialize(
221
228
dir, target_branch=referenced_branch)
222
reference_url = _mod_bzrbranch.BranchReferenceFormat().get_reference(dir)
229
_mod_bzrbranch.BranchReferenceFormat().get_reference(dir)
223
230
# The server shouldn't try to follow the branch reference, so it's fine
224
231
# if the referenced branch isn't reachable.
225
232
backing.rename('referenced', 'moved')
226
233
request_class = smart_dir.SmartServerBzrDirRequestCloningMetaDir
227
234
request = request_class(backing)
228
expected = smart_req.FailedSmartServerResponse(('BranchReference',))
229
self.assertEqual(expected, request.execute('', 'False'))
232
class TestSmartServerBzrDirRequestCloningMetaDir(
233
tests.TestCaseWithMemoryTransport):
235
expected = smart_req.FailedSmartServerResponse((b'BranchReference',))
236
self.assertEqual(expected, request.execute(b'', b'False'))
239
class TestSmartServerBzrDirRequestCheckoutMetaDir(
240
tests.TestCaseWithMemoryTransport):
234
241
"""Tests for BzrDir.checkout_metadir."""
236
243
def test_checkout_metadir(self):
237
244
backing = self.get_transport()
238
245
request = smart_dir.SmartServerBzrDirRequestCheckoutMetaDir(
240
branch = self.make_branch('.', format='2a')
241
response = request.execute('')
247
self.make_branch('.', format='2a')
248
response = request.execute(b'')
242
249
self.assertEqual(
243
250
smart_req.SmartServerResponse(
244
('Bazaar-NG meta directory, format 1\n',
245
'Bazaar repository format 2a (needs bzr 1.16 or later)\n',
246
'Bazaar Branch Format 7 (needs bzr 1.6)\n')),
251
(b'Bazaar-NG meta directory, format 1\n',
252
b'Bazaar repository format 2a (needs bzr 1.16 or later)\n',
253
b'Bazaar Branch Format 7 (needs bzr 1.6)\n')),
250
257
class TestSmartServerBzrDirRequestDestroyBranch(
251
tests.TestCaseWithMemoryTransport):
258
tests.TestCaseWithMemoryTransport):
252
259
"""Tests for BzrDir.destroy_branch."""
254
261
def test_destroy_branch_default(self):
255
262
"""The default branch can be removed."""
256
263
backing = self.get_transport()
257
dir = self.make_branch('.').controldir
264
self.make_branch('.')
258
265
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
259
266
request = request_class(backing)
260
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
261
self.assertEqual(expected, request.execute('', None))
267
expected = smart_req.SuccessfulSmartServerResponse((b'ok',))
268
self.assertEqual(expected, request.execute(b'', None))
263
270
def test_destroy_branch_named(self):
264
271
"""A named branch can be removed."""
267
274
dir.create_branch(name="branchname")
268
275
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
269
276
request = request_class(backing)
270
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
271
self.assertEqual(expected, request.execute('', "branchname"))
277
expected = smart_req.SuccessfulSmartServerResponse((b'ok',))
278
self.assertEqual(expected, request.execute(b'', b"branchname"))
273
280
def test_destroy_branch_missing(self):
274
281
"""An error is raised if the branch didn't exist."""
275
282
backing = self.get_transport()
276
dir = self.make_controldir('.', format="development-colo")
283
self.make_controldir('.', format="development-colo")
277
284
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
278
285
request = request_class(backing)
279
expected = smart_req.FailedSmartServerResponse(('nobranch',), None)
280
self.assertEqual(expected, request.execute('', "branchname"))
286
expected = smart_req.FailedSmartServerResponse((b'nobranch',), None)
287
self.assertEqual(expected, request.execute(b'', b"branchname"))
283
290
class TestSmartServerBzrDirRequestHasWorkingTree(
284
tests.TestCaseWithTransport):
291
tests.TestCaseWithTransport):
285
292
"""Tests for BzrDir.has_workingtree."""
287
294
def test_has_workingtree_yes(self):
288
295
"""A working tree is present."""
289
296
backing = self.get_transport()
290
dir = self.make_branch_and_tree('.').controldir
297
self.make_branch_and_tree('.')
291
298
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
292
299
request = request_class(backing)
293
expected = smart_req.SuccessfulSmartServerResponse(('yes',))
294
self.assertEqual(expected, request.execute(''))
300
expected = smart_req.SuccessfulSmartServerResponse((b'yes',))
301
self.assertEqual(expected, request.execute(b''))
296
303
def test_has_workingtree_no(self):
297
304
"""A working tree is missing."""
298
305
backing = self.get_transport()
299
dir = self.make_controldir('.')
306
self.make_controldir('.')
300
307
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
301
308
request = request_class(backing)
302
expected = smart_req.SuccessfulSmartServerResponse(('no',))
303
self.assertEqual(expected, request.execute(''))
309
expected = smart_req.SuccessfulSmartServerResponse((b'no',))
310
self.assertEqual(expected, request.execute(b''))
306
313
class TestSmartServerBzrDirRequestDestroyRepository(
307
tests.TestCaseWithMemoryTransport):
314
tests.TestCaseWithMemoryTransport):
308
315
"""Tests for BzrDir.destroy_repository."""
310
317
def test_destroy_repository_default(self):
311
318
"""The repository can be removed."""
312
319
backing = self.get_transport()
313
dir = self.make_repository('.').controldir
320
self.make_repository('.')
314
321
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
315
322
request = request_class(backing)
316
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
317
self.assertEqual(expected, request.execute(''))
323
expected = smart_req.SuccessfulSmartServerResponse((b'ok',))
324
self.assertEqual(expected, request.execute(b''))
319
326
def test_destroy_repository_missing(self):
320
327
"""An error is raised if the repository didn't exist."""
321
328
backing = self.get_transport()
322
dir = self.make_controldir('.')
329
self.make_controldir('.')
323
330
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
324
331
request = request_class(backing)
325
332
expected = smart_req.FailedSmartServerResponse(
326
('norepository',), None)
327
self.assertEqual(expected, request.execute(''))
330
class TestSmartServerRequestCreateRepository(tests.TestCaseWithMemoryTransport):
333
(b'norepository',), None)
334
self.assertEqual(expected, request.execute(b''))
337
class TestSmartServerRequestCreateRepository(
338
tests.TestCaseWithMemoryTransport):
331
339
"""Tests for BzrDir.create_repository."""
333
341
def test_makes_repository(self):
375
383
repo = self.make_repository('.', shared=shared, format=format)
376
384
if repo.supports_rich_root():
380
388
if repo._format.supports_tree_reference:
384
392
if repo._format.supports_external_lookups:
388
396
if (smart_dir.SmartServerRequestFindRepositoryV3 ==
389
self._request_class):
397
self._request_class):
390
398
return smart_req.SuccessfulSmartServerResponse(
391
('ok', '', rich_root, subtrees, external,
399
(b'ok', b'', rich_root, subtrees, external,
392
400
repo._format.network_name()))
393
401
elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
394
self._request_class):
402
self._request_class):
395
403
# All tests so far are on formats, and for non-external
397
405
return smart_req.SuccessfulSmartServerResponse(
398
('ok', '', rich_root, subtrees, external))
406
(b'ok', b'', rich_root, subtrees, external))
400
408
return smart_req.SuccessfulSmartServerResponse(
401
('ok', '', rich_root, subtrees))
409
(b'ok', b'', rich_root, subtrees))
403
411
def test_shared_repository(self):
404
"""When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
412
"""for a shared repository, we get 'ok', 'relpath-to-repo'."""
405
413
backing = self.get_transport()
406
414
request = self._request_class(backing)
407
415
result = self._make_repository_and_result(shared=True)
408
self.assertEqual(result, request.execute(''))
416
self.assertEqual(result, request.execute(b''))
409
417
self.make_controldir('subdir')
410
418
result2 = smart_req.SmartServerResponse(
411
result.args[0:1] + ('..', ) + result.args[2:])
419
result.args[0:1] + (b'..', ) + result.args[2:])
412
420
self.assertEqual(result2,
413
request.execute('subdir'))
421
request.execute(b'subdir'))
414
422
self.make_controldir('subdir/deeper')
415
423
result3 = smart_req.SmartServerResponse(
416
result.args[0:1] + ('../..', ) + result.args[2:])
424
result.args[0:1] + (b'../..', ) + result.args[2:])
417
425
self.assertEqual(result3,
418
request.execute('subdir/deeper'))
426
request.execute(b'subdir/deeper'))
420
428
def test_rich_root_and_subtree_encoding(self):
421
429
"""Test for the format attributes for rich root and subtree support."""
828
852
request = smart_branch.SmartServerBranchRequest(backing)
829
853
self.make_controldir('.')
830
854
self.assertRaises(errors.NotBranchError,
855
request.execute, b'')
833
857
def test_branch_reference(self):
834
858
"""When there is a branch reference, NotBranchError is raised."""
835
859
backing = self.get_transport()
836
860
request = smart_branch.SmartServerBranchRequest(backing)
837
861
branch = self.make_branch('branch')
838
checkout = branch.create_checkout('reference', lightweight=True)
862
branch.create_checkout('reference', lightweight=True)
839
863
self.assertRaises(errors.NotBranchError,
840
request.execute, 'checkout')
864
request.execute, b'checkout')
843
867
class TestSmartServerBranchRequestLastRevisionInfo(
844
tests.TestCaseWithMemoryTransport):
868
tests.TestCaseWithMemoryTransport):
846
870
def test_empty(self):
847
"""For an empty branch, the result is ('ok', '0', 'null:')."""
871
"""For an empty branch, the result is ('ok', '0', b'null:')."""
848
872
backing = self.get_transport()
849
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
873
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(
850
875
self.make_branch('.')
851
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
877
smart_req.SmartServerResponse((b'ok', b'0', b'null:')),
878
request.execute(b''))
880
def test_ghost(self):
881
"""For an empty branch, the result is ('ok', '0', b'null:')."""
882
backing = self.get_transport()
883
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(
885
branch = self.make_branch('.')
887
def last_revision_info():
888
raise errors.GhostRevisionsHaveNoRevno(b'revid1', b'revid2')
889
self.overrideAttr(branch, 'last_revision_info', last_revision_info)
890
self.assertRaises(errors.GhostRevisionsHaveNoRevno,
891
request.do_with_branch, branch)
854
893
def test_not_empty(self):
855
894
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
856
895
backing = self.get_transport()
857
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
896
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(
858
898
tree = self.make_branch_and_memory_tree('.')
859
899
tree.lock_write()
861
901
rev_id_utf8 = u'\xc8'.encode('utf-8')
862
r1 = tree.commit('1st commit')
863
r2 = tree.commit('2nd commit', rev_id=rev_id_utf8)
902
tree.commit('1st commit')
903
tree.commit('2nd commit', rev_id=rev_id_utf8)
865
905
self.assertEqual(
866
smart_req.SmartServerResponse(('ok', '2', rev_id_utf8)),
906
smart_req.SmartServerResponse((b'ok', b'2', rev_id_utf8)),
907
request.execute(b''))
870
910
class TestSmartServerBranchRequestRevisionIdToRevno(
871
tests.TestCaseWithMemoryTransport):
911
tests.TestCaseWithMemoryTransport):
873
913
def test_null(self):
874
914
backing = self.get_transport()
875
915
request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
877
917
self.make_branch('.')
878
self.assertEqual(smart_req.SmartServerResponse(('ok', '0')),
879
request.execute('', 'null:'))
918
self.assertEqual(smart_req.SmartServerResponse((b'ok', b'0')),
919
request.execute(b'', b'null:'))
921
def test_ghost_revision(self):
922
backing = self.get_transport()
923
request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
925
branch = self.make_branch('.')
926
def revision_id_to_dotted_revno(revid):
927
raise errors.GhostRevisionsHaveNoRevno(revid, b'ghost-revid')
928
self.overrideAttr(branch, 'revision_id_to_dotted_revno', revision_id_to_dotted_revno)
930
smart_req.FailedSmartServerResponse(
931
(b'GhostRevisionsHaveNoRevno', b'revid', b'ghost-revid')),
932
request.do_with_branch(branch, b'revid'))
881
934
def test_simple(self):
882
935
backing = self.get_transport()
1778
1843
tree = self.make_branch_and_memory_tree('.', format='2a')
1779
1844
tree.lock_write()
1781
tree.commit('1st commit', rev_id="rev1")
1782
tree.commit('2nd commit', rev_id="rev2")
1846
tree.commit('1st commit', rev_id=b"rev1")
1847
tree.commit('2nd commit', rev_id=b"rev2")
1785
self.assertIs(None, request.execute(''))
1786
response = request.do_body("rev1\nrev2")
1850
self.assertIs(None, request.execute(b''))
1851
response = request.do_body(b"rev1\nrev2")
1787
1852
self.assertTrue(response.is_successful())
1788
1853
# Format 2a uses serializer format 10
1789
self.assertEqual(response.args, ("ok", "10"))
1854
self.assertEqual(response.args, (b"ok", b"10"))
1791
1856
self.addCleanup(tree.branch.lock_read().unlock)
1792
1857
entries = [zlib.compress(record.get_bytes_as("fulltext")) for record in
1793
tree.branch.repository.revisions.get_record_stream(
1794
[("rev1", ), ("rev2", )], "unordered", True)]
1858
tree.branch.repository.revisions.get_record_stream(
1859
[(b"rev1", ), (b"rev2", )], "unordered", True)]
1796
contents = "".join(response.body_stream)
1861
contents = b"".join(response.body_stream)
1797
1862
self.assertTrue(contents in (
1798
"".join([entries[0], entries[1]]),
1799
"".join([entries[1], entries[0]])))
1863
b"".join([entries[0], entries[1]]),
1864
b"".join([entries[1], entries[0]])))
1801
1866
def test_missing(self):
1802
1867
backing = self.get_transport()
1803
1868
request = smart_repo.SmartServerRepositoryIterRevisions(backing)
1804
tree = self.make_branch_and_memory_tree('.', format='2a')
1869
self.make_branch_and_memory_tree('.', format='2a')
1806
self.assertIs(None, request.execute(''))
1807
response = request.do_body("rev1\nrev2")
1871
self.assertIs(None, request.execute(b''))
1872
response = request.do_body(b"rev1\nrev2")
1808
1873
self.assertTrue(response.is_successful())
1809
1874
# Format 2a uses serializer format 10
1810
self.assertEqual(response.args, ("ok", "10"))
1875
self.assertEqual(response.args, (b"ok", b"10"))
1812
contents = "".join(response.body_stream)
1813
self.assertEqual(contents, "")
1877
contents = b"".join(response.body_stream)
1878
self.assertEqual(contents, b"")
1816
1881
class GetStreamTestBase(tests.TestCaseWithMemoryTransport):
1833
1898
backing = self.get_transport()
1834
1899
request = smart_repo.SmartServerRepositoryGetStream(backing)
1835
1900
repo, r1, r2 = self.make_two_commit_repo()
1836
fetch_spec = ['ancestry-of', r2]
1837
lines = '\n'.join(fetch_spec)
1838
request.execute('', repo._format.network_name())
1901
fetch_spec = [b'ancestry-of', r2]
1902
lines = b'\n'.join(fetch_spec)
1903
request.execute(b'', repo._format.network_name())
1839
1904
response = request.do_body(lines)
1840
self.assertEqual(('ok',), response.args)
1841
stream_bytes = ''.join(response.body_stream)
1842
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1905
self.assertEqual((b'ok',), response.args)
1906
stream_bytes = b''.join(response.body_stream)
1907
self.assertStartsWith(stream_bytes, b'Bazaar pack format 1')
1844
1909
def test_search(self):
1845
1910
"""The search argument may be a 'search' of some explicit keys."""
1846
1911
backing = self.get_transport()
1847
1912
request = smart_repo.SmartServerRepositoryGetStream(backing)
1848
1913
repo, r1, r2 = self.make_two_commit_repo()
1849
fetch_spec = ['search', '%s %s' % (r1, r2), 'null:', '2']
1850
lines = '\n'.join(fetch_spec)
1851
request.execute('', repo._format.network_name())
1914
fetch_spec = [b'search', r1 + b' ' + r2, b'null:', b'2']
1915
lines = b'\n'.join(fetch_spec)
1916
request.execute(b'', repo._format.network_name())
1852
1917
response = request.do_body(lines)
1853
self.assertEqual(('ok',), response.args)
1854
stream_bytes = ''.join(response.body_stream)
1855
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1918
self.assertEqual((b'ok',), response.args)
1919
stream_bytes = b''.join(response.body_stream)
1920
self.assertStartsWith(stream_bytes, b'Bazaar pack format 1')
1857
1922
def test_search_everything(self):
1858
1923
"""A search of 'everything' returns a stream."""
1859
1924
backing = self.get_transport()
1860
1925
request = smart_repo.SmartServerRepositoryGetStream_1_19(backing)
1861
1926
repo, r1, r2 = self.make_two_commit_repo()
1862
serialised_fetch_spec = 'everything'
1863
request.execute('', repo._format.network_name())
1927
serialised_fetch_spec = b'everything'
1928
request.execute(b'', repo._format.network_name())
1864
1929
response = request.do_body(serialised_fetch_spec)
1865
self.assertEqual(('ok',), response.args)
1866
stream_bytes = ''.join(response.body_stream)
1867
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1930
self.assertEqual((b'ok',), response.args)
1931
stream_bytes = b''.join(response.body_stream)
1932
self.assertStartsWith(stream_bytes, b'Bazaar pack format 1')
1870
1935
class TestSmartServerRequestHasRevision(tests.TestCaseWithMemoryTransport):
2476
2542
def test_registered_methods(self):
2477
2543
"""Test that known methods are registered to the correct object."""
2478
self.assertHandlerEqual('Branch.break_lock',
2479
smart_branch.SmartServerBranchBreakLock)
2480
self.assertHandlerEqual('Branch.get_config_file',
2481
smart_branch.SmartServerBranchGetConfigFile)
2482
self.assertHandlerEqual('Branch.put_config_file',
2483
smart_branch.SmartServerBranchPutConfigFile)
2484
self.assertHandlerEqual('Branch.get_parent',
2485
smart_branch.SmartServerBranchGetParent)
2486
self.assertHandlerEqual('Branch.get_physical_lock_status',
2487
smart_branch.SmartServerBranchRequestGetPhysicalLockStatus)
2488
self.assertHandlerEqual('Branch.get_tags_bytes',
2489
smart_branch.SmartServerBranchGetTagsBytes)
2490
self.assertHandlerEqual('Branch.lock_write',
2491
smart_branch.SmartServerBranchRequestLockWrite)
2492
self.assertHandlerEqual('Branch.last_revision_info',
2493
smart_branch.SmartServerBranchRequestLastRevisionInfo)
2494
self.assertHandlerEqual('Branch.revision_history',
2495
smart_branch.SmartServerRequestRevisionHistory)
2496
self.assertHandlerEqual('Branch.revision_id_to_revno',
2497
smart_branch.SmartServerBranchRequestRevisionIdToRevno)
2498
self.assertHandlerEqual('Branch.set_config_option',
2499
smart_branch.SmartServerBranchRequestSetConfigOption)
2500
self.assertHandlerEqual('Branch.set_last_revision',
2501
smart_branch.SmartServerBranchRequestSetLastRevision)
2502
self.assertHandlerEqual('Branch.set_last_revision_info',
2503
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
2504
self.assertHandlerEqual('Branch.set_last_revision_ex',
2505
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
2506
self.assertHandlerEqual('Branch.set_parent_location',
2507
smart_branch.SmartServerBranchRequestSetParentLocation)
2508
self.assertHandlerEqual('Branch.unlock',
2509
smart_branch.SmartServerBranchRequestUnlock)
2510
self.assertHandlerEqual('BzrDir.destroy_branch',
2511
smart_dir.SmartServerBzrDirRequestDestroyBranch)
2512
self.assertHandlerEqual('BzrDir.find_repository',
2513
smart_dir.SmartServerRequestFindRepositoryV1)
2514
self.assertHandlerEqual('BzrDir.find_repositoryV2',
2515
smart_dir.SmartServerRequestFindRepositoryV2)
2516
self.assertHandlerEqual('BzrDirFormat.initialize',
2517
smart_dir.SmartServerRequestInitializeBzrDir)
2518
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
2519
smart_dir.SmartServerRequestBzrDirInitializeEx)
2520
self.assertHandlerEqual('BzrDir.checkout_metadir',
2521
smart_dir.SmartServerBzrDirRequestCheckoutMetaDir)
2522
self.assertHandlerEqual('BzrDir.cloning_metadir',
2523
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
2524
self.assertHandlerEqual('BzrDir.get_branches',
2525
smart_dir.SmartServerBzrDirRequestGetBranches)
2526
self.assertHandlerEqual('BzrDir.get_config_file',
2527
smart_dir.SmartServerBzrDirRequestConfigFile)
2528
self.assertHandlerEqual('BzrDir.open_branch',
2529
smart_dir.SmartServerRequestOpenBranch)
2530
self.assertHandlerEqual('BzrDir.open_branchV2',
2531
smart_dir.SmartServerRequestOpenBranchV2)
2532
self.assertHandlerEqual('BzrDir.open_branchV3',
2533
smart_dir.SmartServerRequestOpenBranchV3)
2534
self.assertHandlerEqual('PackRepository.autopack',
2535
smart_packrepo.SmartServerPackRepositoryAutopack)
2536
self.assertHandlerEqual('Repository.add_signature_text',
2537
smart_repo.SmartServerRepositoryAddSignatureText)
2538
self.assertHandlerEqual('Repository.all_revision_ids',
2539
smart_repo.SmartServerRepositoryAllRevisionIds)
2540
self.assertHandlerEqual('Repository.break_lock',
2541
smart_repo.SmartServerRepositoryBreakLock)
2542
self.assertHandlerEqual('Repository.gather_stats',
2543
smart_repo.SmartServerRepositoryGatherStats)
2544
self.assertHandlerEqual('Repository.get_parent_map',
2545
smart_repo.SmartServerRepositoryGetParentMap)
2546
self.assertHandlerEqual('Repository.get_physical_lock_status',
2547
smart_repo.SmartServerRepositoryGetPhysicalLockStatus)
2548
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
2549
smart_repo.SmartServerRepositoryGetRevIdForRevno)
2550
self.assertHandlerEqual('Repository.get_revision_graph',
2551
smart_repo.SmartServerRepositoryGetRevisionGraph)
2552
self.assertHandlerEqual('Repository.get_revision_signature_text',
2553
smart_repo.SmartServerRepositoryGetRevisionSignatureText)
2554
self.assertHandlerEqual('Repository.get_stream',
2555
smart_repo.SmartServerRepositoryGetStream)
2556
self.assertHandlerEqual('Repository.get_stream_1.19',
2557
smart_repo.SmartServerRepositoryGetStream_1_19)
2558
self.assertHandlerEqual('Repository.iter_revisions',
2559
smart_repo.SmartServerRepositoryIterRevisions)
2560
self.assertHandlerEqual('Repository.has_revision',
2561
smart_repo.SmartServerRequestHasRevision)
2562
self.assertHandlerEqual('Repository.insert_stream',
2563
smart_repo.SmartServerRepositoryInsertStream)
2564
self.assertHandlerEqual('Repository.insert_stream_locked',
2565
smart_repo.SmartServerRepositoryInsertStreamLocked)
2566
self.assertHandlerEqual('Repository.is_shared',
2567
smart_repo.SmartServerRepositoryIsShared)
2568
self.assertHandlerEqual('Repository.iter_files_bytes',
2569
smart_repo.SmartServerRepositoryIterFilesBytes)
2570
self.assertHandlerEqual('Repository.lock_write',
2571
smart_repo.SmartServerRepositoryLockWrite)
2572
self.assertHandlerEqual('Repository.make_working_trees',
2573
smart_repo.SmartServerRepositoryMakeWorkingTrees)
2574
self.assertHandlerEqual('Repository.pack',
2575
smart_repo.SmartServerRepositoryPack)
2576
self.assertHandlerEqual('Repository.reconcile',
2577
smart_repo.SmartServerRepositoryReconcile)
2578
self.assertHandlerEqual('Repository.tarball',
2579
smart_repo.SmartServerRepositoryTarball)
2580
self.assertHandlerEqual('Repository.unlock',
2581
smart_repo.SmartServerRepositoryUnlock)
2582
self.assertHandlerEqual('Repository.start_write_group',
2583
smart_repo.SmartServerRepositoryStartWriteGroup)
2584
self.assertHandlerEqual('Repository.check_write_group',
2585
smart_repo.SmartServerRepositoryCheckWriteGroup)
2586
self.assertHandlerEqual('Repository.commit_write_group',
2587
smart_repo.SmartServerRepositoryCommitWriteGroup)
2588
self.assertHandlerEqual('Repository.abort_write_group',
2589
smart_repo.SmartServerRepositoryAbortWriteGroup)
2590
self.assertHandlerEqual('VersionedFileRepository.get_serializer_format',
2591
smart_repo.SmartServerRepositoryGetSerializerFormat)
2592
self.assertHandlerEqual('VersionedFileRepository.get_inventories',
2593
smart_repo.SmartServerRepositoryGetInventories)
2594
self.assertHandlerEqual('Transport.is_readonly',
2595
smart_req.SmartServerIsReadonly)
2544
self.assertHandlerEqual(b'Branch.break_lock',
2545
smart_branch.SmartServerBranchBreakLock)
2546
self.assertHandlerEqual(b'Branch.get_config_file',
2547
smart_branch.SmartServerBranchGetConfigFile)
2548
self.assertHandlerEqual(b'Branch.put_config_file',
2549
smart_branch.SmartServerBranchPutConfigFile)
2550
self.assertHandlerEqual(b'Branch.get_parent',
2551
smart_branch.SmartServerBranchGetParent)
2552
self.assertHandlerEqual(b'Branch.get_physical_lock_status',
2553
smart_branch.SmartServerBranchRequestGetPhysicalLockStatus)
2554
self.assertHandlerEqual(b'Branch.get_tags_bytes',
2555
smart_branch.SmartServerBranchGetTagsBytes)
2556
self.assertHandlerEqual(b'Branch.lock_write',
2557
smart_branch.SmartServerBranchRequestLockWrite)
2558
self.assertHandlerEqual(b'Branch.last_revision_info',
2559
smart_branch.SmartServerBranchRequestLastRevisionInfo)
2560
self.assertHandlerEqual(b'Branch.revision_history',
2561
smart_branch.SmartServerRequestRevisionHistory)
2562
self.assertHandlerEqual(b'Branch.revision_id_to_revno',
2563
smart_branch.SmartServerBranchRequestRevisionIdToRevno)
2564
self.assertHandlerEqual(b'Branch.set_config_option',
2565
smart_branch.SmartServerBranchRequestSetConfigOption)
2566
self.assertHandlerEqual(b'Branch.set_last_revision',
2567
smart_branch.SmartServerBranchRequestSetLastRevision)
2568
self.assertHandlerEqual(b'Branch.set_last_revision_info',
2569
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
2570
self.assertHandlerEqual(b'Branch.set_last_revision_ex',
2571
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
2572
self.assertHandlerEqual(b'Branch.set_parent_location',
2573
smart_branch.SmartServerBranchRequestSetParentLocation)
2574
self.assertHandlerEqual(b'Branch.unlock',
2575
smart_branch.SmartServerBranchRequestUnlock)
2576
self.assertHandlerEqual(b'BzrDir.destroy_branch',
2577
smart_dir.SmartServerBzrDirRequestDestroyBranch)
2578
self.assertHandlerEqual(b'BzrDir.find_repository',
2579
smart_dir.SmartServerRequestFindRepositoryV1)
2580
self.assertHandlerEqual(b'BzrDir.find_repositoryV2',
2581
smart_dir.SmartServerRequestFindRepositoryV2)
2582
self.assertHandlerEqual(b'BzrDirFormat.initialize',
2583
smart_dir.SmartServerRequestInitializeBzrDir)
2584
self.assertHandlerEqual(b'BzrDirFormat.initialize_ex_1.16',
2585
smart_dir.SmartServerRequestBzrDirInitializeEx)
2586
self.assertHandlerEqual(b'BzrDir.checkout_metadir',
2587
smart_dir.SmartServerBzrDirRequestCheckoutMetaDir)
2588
self.assertHandlerEqual(b'BzrDir.cloning_metadir',
2589
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
2590
self.assertHandlerEqual(b'BzrDir.get_branches',
2591
smart_dir.SmartServerBzrDirRequestGetBranches)
2592
self.assertHandlerEqual(b'BzrDir.get_config_file',
2593
smart_dir.SmartServerBzrDirRequestConfigFile)
2594
self.assertHandlerEqual(b'BzrDir.open_branch',
2595
smart_dir.SmartServerRequestOpenBranch)
2596
self.assertHandlerEqual(b'BzrDir.open_branchV2',
2597
smart_dir.SmartServerRequestOpenBranchV2)
2598
self.assertHandlerEqual(b'BzrDir.open_branchV3',
2599
smart_dir.SmartServerRequestOpenBranchV3)
2600
self.assertHandlerEqual(b'PackRepository.autopack',
2601
smart_packrepo.SmartServerPackRepositoryAutopack)
2602
self.assertHandlerEqual(b'Repository.add_signature_text',
2603
smart_repo.SmartServerRepositoryAddSignatureText)
2604
self.assertHandlerEqual(b'Repository.all_revision_ids',
2605
smart_repo.SmartServerRepositoryAllRevisionIds)
2606
self.assertHandlerEqual(b'Repository.break_lock',
2607
smart_repo.SmartServerRepositoryBreakLock)
2608
self.assertHandlerEqual(b'Repository.gather_stats',
2609
smart_repo.SmartServerRepositoryGatherStats)
2610
self.assertHandlerEqual(b'Repository.get_parent_map',
2611
smart_repo.SmartServerRepositoryGetParentMap)
2612
self.assertHandlerEqual(b'Repository.get_physical_lock_status',
2613
smart_repo.SmartServerRepositoryGetPhysicalLockStatus)
2614
self.assertHandlerEqual(b'Repository.get_rev_id_for_revno',
2615
smart_repo.SmartServerRepositoryGetRevIdForRevno)
2616
self.assertHandlerEqual(b'Repository.get_revision_graph',
2617
smart_repo.SmartServerRepositoryGetRevisionGraph)
2618
self.assertHandlerEqual(b'Repository.get_revision_signature_text',
2619
smart_repo.SmartServerRepositoryGetRevisionSignatureText)
2620
self.assertHandlerEqual(b'Repository.get_stream',
2621
smart_repo.SmartServerRepositoryGetStream)
2622
self.assertHandlerEqual(b'Repository.get_stream_1.19',
2623
smart_repo.SmartServerRepositoryGetStream_1_19)
2624
self.assertHandlerEqual(b'Repository.iter_revisions',
2625
smart_repo.SmartServerRepositoryIterRevisions)
2626
self.assertHandlerEqual(b'Repository.has_revision',
2627
smart_repo.SmartServerRequestHasRevision)
2628
self.assertHandlerEqual(b'Repository.insert_stream',
2629
smart_repo.SmartServerRepositoryInsertStream)
2630
self.assertHandlerEqual(b'Repository.insert_stream_locked',
2631
smart_repo.SmartServerRepositoryInsertStreamLocked)
2632
self.assertHandlerEqual(b'Repository.is_shared',
2633
smart_repo.SmartServerRepositoryIsShared)
2634
self.assertHandlerEqual(b'Repository.iter_files_bytes',
2635
smart_repo.SmartServerRepositoryIterFilesBytes)
2636
self.assertHandlerEqual(b'Repository.lock_write',
2637
smart_repo.SmartServerRepositoryLockWrite)
2638
self.assertHandlerEqual(b'Repository.make_working_trees',
2639
smart_repo.SmartServerRepositoryMakeWorkingTrees)
2640
self.assertHandlerEqual(b'Repository.pack',
2641
smart_repo.SmartServerRepositoryPack)
2642
self.assertHandlerEqual(b'Repository.reconcile',
2643
smart_repo.SmartServerRepositoryReconcile)
2644
self.assertHandlerEqual(b'Repository.tarball',
2645
smart_repo.SmartServerRepositoryTarball)
2646
self.assertHandlerEqual(b'Repository.unlock',
2647
smart_repo.SmartServerRepositoryUnlock)
2648
self.assertHandlerEqual(b'Repository.start_write_group',
2649
smart_repo.SmartServerRepositoryStartWriteGroup)
2650
self.assertHandlerEqual(b'Repository.check_write_group',
2651
smart_repo.SmartServerRepositoryCheckWriteGroup)
2652
self.assertHandlerEqual(b'Repository.commit_write_group',
2653
smart_repo.SmartServerRepositoryCommitWriteGroup)
2654
self.assertHandlerEqual(b'Repository.abort_write_group',
2655
smart_repo.SmartServerRepositoryAbortWriteGroup)
2656
self.assertHandlerEqual(b'VersionedFileRepository.get_serializer_format',
2657
smart_repo.SmartServerRepositoryGetSerializerFormat)
2658
self.assertHandlerEqual(b'VersionedFileRepository.get_inventories',
2659
smart_repo.SmartServerRepositoryGetInventories)
2660
self.assertHandlerEqual(b'Transport.is_readonly',
2661
smart_req.SmartServerIsReadonly)
2598
2664
class SmartTCPServerHookTests(tests.TestCaseWithMemoryTransport):
2663
2733
base_inv = repository.revision_tree(base_revid).root_inventory
2664
2734
inv = repository.revision_tree(revid).root_inventory
2665
2735
inv_delta = inv._make_delta(base_inv)
2666
serializer = inventory_delta.InventoryDeltaSerializer(True, False)
2667
return "".join(serializer.delta_to_lines(base_revid, revid, inv_delta))
2736
serializer = inventory_delta.InventoryDeltaSerializer(True, True)
2737
return b"".join(serializer.delta_to_lines(base_revid, revid, inv_delta))
2669
2739
def test_single(self):
2670
2740
backing = self.get_transport()
2671
2741
request = smart_repo.SmartServerRepositoryGetInventories(backing)
2672
2742
t = self.make_branch_and_tree('.', format='2a')
2673
2743
self.addCleanup(t.lock_write().unlock)
2674
self.build_tree_contents([("file", "somecontents")])
2675
t.add(["file"], ["thefileid"])
2676
t.commit(rev_id='somerev', message="add file")
2677
self.assertIs(None, request.execute('', 'unordered'))
2678
response = request.do_body("somerev\n")
2744
self.build_tree_contents([("file", b"somecontents")])
2745
t.add(["file"], [b"thefileid"])
2746
t.commit(rev_id=b'somerev', message="add file")
2747
self.assertIs(None, request.execute(b'', b'unordered'))
2748
response = request.do_body(b"somerev\n")
2679
2749
self.assertTrue(response.is_successful())
2680
self.assertEqual(response.args, ("ok", ))
2750
self.assertEqual(response.args, (b"ok", ))
2681
2751
stream = [('inventory-deltas', [
2682
versionedfile.FulltextContentFactory('somerev', None, None,
2683
self._get_serialized_inventory_delta(
2684
t.branch.repository, 'null:', 'somerev'))])]
2752
versionedfile.FulltextContentFactory(b'somerev', None, None,
2753
self._get_serialized_inventory_delta(
2754
t.branch.repository, b'null:', b'somerev'))])]
2685
2755
fmt = controldir.format_registry.get('2a')().repository_format
2686
2756
self.assertEqual(
2687
"".join(response.body_stream),
2688
"".join(smart_repo._stream_to_byte_stream(stream, fmt)))
2757
b"".join(response.body_stream),
2758
b"".join(smart_repo._stream_to_byte_stream(stream, fmt)))
2690
2760
def test_empty(self):
2691
2761
backing = self.get_transport()
2692
2762
request = smart_repo.SmartServerRepositoryGetInventories(backing)
2693
2763
t = self.make_branch_and_tree('.', format='2a')
2694
2764
self.addCleanup(t.lock_write().unlock)
2695
self.build_tree_contents([("file", "somecontents")])
2696
t.add(["file"], ["thefileid"])
2697
t.commit(rev_id='somerev', message="add file")
2698
self.assertIs(None, request.execute('', 'unordered'))
2699
response = request.do_body("")
2700
self.assertTrue(response.is_successful())
2701
self.assertEqual(response.args, ("ok", ))
2702
self.assertEqual("".join(response.body_stream),
2703
"Bazaar pack format 1 (introduced in 0.18)\nB54\n\nBazaar repository format 2a (needs bzr 1.16 or later)\nE")
2765
self.build_tree_contents([("file", b"somecontents")])
2766
t.add(["file"], [b"thefileid"])
2767
t.commit(rev_id=b'somerev', message="add file")
2768
self.assertIs(None, request.execute(b'', b'unordered'))
2769
response = request.do_body(b"")
2770
self.assertTrue(response.is_successful())
2771
self.assertEqual(response.args, (b"ok", ))
2772
self.assertEqual(b"".join(response.body_stream),
2773
b"Bazaar pack format 1 (introduced in 0.18)\nB54\n\nBazaar repository format 2a (needs bzr 1.16 or later)\nE")
2776
class TestSmartServerRepositoryGetStreamForMissingKeys(GetStreamTestBase):
2778
def test_missing(self):
2779
"""The search argument may be a 'ancestry-of' some heads'."""
2780
backing = self.get_transport()
2781
request = smart_repo.SmartServerRepositoryGetStreamForMissingKeys(
2783
repo, r1, r2 = self.make_two_commit_repo()
2784
request.execute(b'', repo._format.network_name())
2785
lines = b'inventories\t' + r1
2786
response = request.do_body(lines)
2787
self.assertEqual((b'ok',), response.args)
2788
stream_bytes = b''.join(response.body_stream)
2789
self.assertStartsWith(stream_bytes, b'Bazaar pack format 1')
2791
def test_unknown_format(self):
2792
"""The format may not be known by the remote server."""
2793
backing = self.get_transport()
2794
request = smart_repo.SmartServerRepositoryGetStreamForMissingKeys(
2796
repo, r1, r2 = self.make_two_commit_repo()
2797
request.execute(b'', b'yada yada yada')
2798
expected = smart_req.FailedSmartServerResponse(
2799
(b'UnknownFormat', b'repository', b'yada yada yada'))
2802
class TestSmartServerRepositoryRevisionArchive(tests.TestCaseWithTransport):
2804
backing = self.get_transport()
2805
request = smart_repo.SmartServerRepositoryRevisionArchive(backing)
2806
t = self.make_branch_and_tree('.')
2807
self.addCleanup(t.lock_write().unlock)
2808
self.build_tree_contents([("file", b"somecontents")])
2809
t.add(["file"], [b"thefileid"])
2810
t.commit(rev_id=b'somerev', message="add file")
2811
response = request.execute(b'', b"somerev", b"tar", b"foo.tar", b"foo")
2812
self.assertTrue(response.is_successful())
2813
self.assertEqual(response.args, (b"ok", ))
2814
b = BytesIO(b"".join(response.body_stream))
2815
with tarfile.open(mode='r', fileobj=b) as tf:
2816
self.assertEqual(['foo/file'], tf.getnames())
2819
class TestSmartServerRepositoryAnnotateFileRevision(tests.TestCaseWithTransport):
2822
backing = self.get_transport()
2823
request = smart_repo.SmartServerRepositoryAnnotateFileRevision(backing)
2824
t = self.make_branch_and_tree('.')
2825
self.addCleanup(t.lock_write().unlock)
2826
self.build_tree_contents([("file", b"somecontents\nmorecontents\n")])
2827
t.add(["file"], [b"thefileid"])
2828
t.commit(rev_id=b'somerev', message="add file")
2829
response = request.execute(b'', b"somerev", b"file")
2830
self.assertTrue(response.is_successful())
2831
self.assertEqual(response.args, (b"ok", ))
2833
[[b'somerev', b'somecontents\n'], [b'somerev', b'morecontents\n']],
2834
bencode.bdecode(response.body))
2837
class TestSmartServerBranchRequestGetAllReferenceInfo(TestLockedBranch):
2839
def test_get_some(self):
2840
backing = self.get_transport()
2841
request = smart_branch.SmartServerBranchRequestGetAllReferenceInfo(backing)
2842
branch = self.make_branch('.')
2843
branch.set_reference_info('some/path', 'http://www.example.com/')
2844
response = request.execute(b'')
2845
self.assertTrue(response.is_successful())
2846
self.assertEqual(response.args, (b"ok", ))
2848
[[b'some/path', b'http://www.example.com/', b'']],
2849
bencode.bdecode(response.body))