30
31
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1
31
32
from bzrlib.tests.blackbox import ExternalBase
32
33
from bzrlib.tests.http_server import HttpServer
33
from bzrlib.transport import register_transport, unregister_transport
34
34
from bzrlib.transport.memory import MemoryServer, MemoryTransport
35
35
from bzrlib.uncommit import uncommit
36
36
from bzrlib.urlutils import local_path_from_url
87
87
out, err = self.run_bzr('push')
88
88
path = branch_a.get_push_location()
89
89
self.assertEquals(out,
90
'Using saved location: %s\n'
90
'Using saved push location: %s\n'
91
91
'Pushed up to revision 2.\n'
92
92
% local_path_from_url(path))
93
93
self.assertEqual(err,
343
343
self.assertFalse(self.get_transport('published').has('.'))
345
345
def test_push_notifies_default_stacking(self):
346
self.make_branch('stack_on', format='development1')
346
self.make_branch('stack_on', format='1.6')
347
347
self.make_bzrdir('.').get_config().set_default_stack_on('stack_on')
348
self.make_branch('from', format='development1')
348
self.make_branch('from', format='1.6')
349
349
out, err = self.run_bzr('push -d from to')
350
350
self.assertContainsRe(err,
351
351
'Using default stacking branch stack_on at .*')
354
354
class RedirectingMemoryTransport(MemoryTransport):
356
def mkdir(self, path, mode=None):
357
path = self.abspath(path)[len(self._scheme):]
358
if path == '/source':
359
raise errors.RedirectRequested(
360
path, self._scheme + '/target', is_permanent=True)
361
elif path == '/infinite-loop':
362
raise errors.RedirectRequested(
363
path, self._scheme + '/infinite-loop', is_permanent=True)
356
def mkdir(self, relpath, mode=None):
357
from bzrlib.trace import mutter
358
mutter('cwd: %r, rel: %r, abs: %r' % (self._cwd, relpath, abspath))
359
if self._cwd == '/source/':
360
raise errors.RedirectRequested(self.abspath(relpath),
361
self.abspath('../target'),
363
elif self._cwd == '/infinite-loop/':
364
raise errors.RedirectRequested(self.abspath(relpath),
365
self.abspath('../infinite-loop'),
365
368
return super(RedirectingMemoryTransport, self).mkdir(
371
def _redirected_to(self, source, target):
372
# We do accept redirections
373
return transport.get_transport(target)
369
376
class RedirectingMemoryServer(MemoryServer):
375
382
self._scheme = 'redirecting-memory+%s:///' % id(self)
376
register_transport(self._scheme, self._memory_factory)
383
transport.register_transport(self._scheme, self._memory_factory)
378
385
def _memory_factory(self, url):
379
386
result = RedirectingMemoryTransport(url)
406
413
This is added primarily to handle lp:/ URI support, so that users can
407
414
push to new branches by specifying lp:/ URIs.
410
416
destination_url = self.memory_server.get_url() + 'source'
411
self.run_bzr('push %s' % destination_url)
417
self.run_bzr(['push', '-d', 'tree', destination_url])
414
419
local_revision = Branch.open('tree').last_revision()
415
420
remote_revision = Branch.open(
420
425
"""Push fails gracefully if the mkdir generates a large number of
424
428
destination_url = self.memory_server.get_url() + 'infinite-loop'
425
429
out, err = self.run_bzr_error(
426
430
['Too many redirections trying to make %s\\.\n'
427
431
% re.escape(destination_url)],
428
'push %s' % destination_url, retcode=3)
432
['push', '-d', 'tree', destination_url], retcode=3)
430
433
self.assertEqual('', out)