/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_push.py

  • Committer: Aaron Bentley
  • Date: 2007-12-08 01:00:58 UTC
  • mfrom: (3095 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3133.
  • Revision ID: aaron.bentley@utoronto.ca-20071208010058-1vuj9qn49qfu808e
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
"""Black-box tests for bzr push."""
19
19
 
20
20
import os
 
21
import re
21
22
 
22
23
from bzrlib import (
23
24
    errors,
28
29
from bzrlib.osutils import abspath
29
30
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1
30
31
from bzrlib.tests.blackbox import ExternalBase
 
32
from bzrlib.transport import register_transport, unregister_transport
 
33
from bzrlib.transport.memory import MemoryServer, MemoryTransport
31
34
from bzrlib.uncommit import uncommit
32
35
from bzrlib.urlutils import local_path_from_url
33
36
from bzrlib.workingtree import WorkingTree
244
247
        self.run_bzr_error(['At ../dir you have a valid .bzr control'],
245
248
                'push ../dir',
246
249
                working_dir='tree')
 
250
 
 
251
 
 
252
class RedirectingMemoryTransport(MemoryTransport):
 
253
 
 
254
    def mkdir(self, path, mode=None):
 
255
        path = self.abspath(path)[len(self._scheme):]
 
256
        if path == '/source':
 
257
            raise errors.RedirectRequested(
 
258
                path, self._scheme + '/target', is_permanent=True)
 
259
        elif path == '/infinite-loop':
 
260
            raise errors.RedirectRequested(
 
261
                path, self._scheme + '/infinite-loop', is_permanent=True)
 
262
        else:
 
263
            return super(RedirectingMemoryTransport, self).mkdir(
 
264
                path, mode)
 
265
 
 
266
 
 
267
class RedirectingMemoryServer(MemoryServer):
 
268
 
 
269
    def setUp(self):
 
270
        self._dirs = {'/': None}
 
271
        self._files = {}
 
272
        self._locks = {}
 
273
        self._scheme = 'redirecting-memory+%s:///' % id(self)
 
274
        register_transport(self._scheme, self._memory_factory)
 
275
 
 
276
    def _memory_factory(self, url):
 
277
        result = RedirectingMemoryTransport(url)
 
278
        result._dirs = self._dirs
 
279
        result._files = self._files
 
280
        result._locks = self._locks
 
281
        return result
 
282
 
 
283
    def tearDown(self):
 
284
        unregister_transport(self._scheme, self._memory_factory)
 
285
 
 
286
 
 
287
class TestPushRedirect(ExternalBase):
 
288
 
 
289
    def setUp(self):
 
290
        ExternalBase.setUp(self)
 
291
        self.memory_server = RedirectingMemoryServer()
 
292
        self.memory_server.setUp()
 
293
        self.addCleanup(self.memory_server.tearDown)
 
294
 
 
295
        # Make the branch and tree that we'll be pushing.
 
296
        t = self.make_branch_and_tree('tree')
 
297
        self.build_tree(['tree/file'])
 
298
        t.add('file')
 
299
        t.commit('commit 1')
 
300
 
 
301
    def test_push_redirects_on_mkdir(self):
 
302
        """If the push requires a mkdir, push respects redirect requests.
 
303
 
 
304
        This is added primarily to handle lp:/ URI support, so that users can
 
305
        push to new branches by specifying lp:/ URIs.
 
306
        """
 
307
        os.chdir('tree')
 
308
        destination_url = self.memory_server.get_url() + 'source'
 
309
        self.run_bzr('push %s' % destination_url)
 
310
        os.chdir('..')
 
311
 
 
312
        local_revision = Branch.open('tree').last_revision()
 
313
        remote_revision = Branch.open(
 
314
            self.memory_server.get_url() + 'target').last_revision()
 
315
        self.assertEqual(remote_revision, local_revision)
 
316
 
 
317
    def test_push_gracefully_handles_too_many_redirects(self):
 
318
        """Push fails gracefully if the mkdir generates a large number of
 
319
        redirects.
 
320
        """
 
321
        os.chdir('tree')
 
322
        destination_url = self.memory_server.get_url() + 'infinite-loop'
 
323
        out, err = self.run_bzr_error(
 
324
            ['Too many redirections trying to make %s\\.\n'
 
325
             % re.escape(destination_url)],
 
326
            'push %s' % destination_url, retcode=3)
 
327
        os.chdir('..')
 
328
        self.assertEqual('', out)