~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/medium.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-05-20 07:16:50 UTC
  • mfrom: (3431.3.11 bug-230550)
  • Revision ID: pqm@pqm.ubuntu.com-20080520071650-9vbizb6v6ji8k1jy
Fix spurious "No repository present" errors when accessing branches
        in shared repos via bzr+http.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
import os
28
28
import socket
29
29
import sys
 
30
import urllib
30
31
 
31
32
from bzrlib import (
32
33
    errors,
33
34
    osutils,
34
35
    symbol_versioning,
 
36
    urlutils,
35
37
    )
36
38
from bzrlib.smart.protocol import (
37
39
    MESSAGE_VERSION_THREE,
431
433
class SmartClientMedium(object):
432
434
    """Smart client is a medium for sending smart protocol requests over."""
433
435
 
434
 
    def __init__(self):
 
436
    def __init__(self, base):
435
437
        super(SmartClientMedium, self).__init__()
 
438
        self.base = base
436
439
        self._protocol_version_error = None
437
440
        self._protocol_version = None
438
441
        self._done_hello = False
478
481
        The default implementation does nothing.
479
482
        """
480
483
        
 
484
    def remote_path_from_transport(self, transport):
 
485
        """Convert transport into a path suitable for using in a request.
 
486
        
 
487
        Note that the resulting remote path doesn't encode the host name or
 
488
        anything but path, so it is only safe to use it in requests sent over
 
489
        the medium from the matching transport.
 
490
        """
 
491
        medium_base = urlutils.join(self.base, '/')
 
492
        rel_url = urlutils.relative_url(medium_base, transport.base)
 
493
        return urllib.unquote(rel_url)
 
494
 
481
495
 
482
496
class SmartClientStreamMedium(SmartClientMedium):
483
497
    """Stream based medium common class.
488
502
    receive bytes.
489
503
    """
490
504
 
491
 
    def __init__(self):
492
 
        SmartClientMedium.__init__(self)
 
505
    def __init__(self, base):
 
506
        SmartClientMedium.__init__(self, base)
493
507
        self._current_request = None
494
508
        # Be optimistic: we assume the remote end can accept new remote
495
509
        # requests until we get an error saying otherwise.  (1.2 adds some
531
545
    This client does not manage the pipes: it assumes they will always be open.
532
546
    """
533
547
 
534
 
    def __init__(self, readable_pipe, writeable_pipe):
535
 
        SmartClientStreamMedium.__init__(self)
 
548
    def __init__(self, readable_pipe, writeable_pipe, base):
 
549
        SmartClientStreamMedium.__init__(self, base)
536
550
        self._readable_pipe = readable_pipe
537
551
        self._writeable_pipe = writeable_pipe
538
552
 
553
567
    """A client medium using SSH."""
554
568
    
555
569
    def __init__(self, host, port=None, username=None, password=None,
556
 
            vendor=None, bzr_remote_path=None):
 
570
            base=None, vendor=None, bzr_remote_path=None):
557
571
        """Creates a client that will connect on the first use.
558
572
        
559
573
        :param vendor: An optional override for the ssh vendor to use. See
560
574
            bzrlib.transport.ssh for details on ssh vendors.
561
575
        """
562
 
        SmartClientStreamMedium.__init__(self)
 
576
        SmartClientStreamMedium.__init__(self, base)
563
577
        self._connected = False
564
578
        self._host = host
565
579
        self._password = password
625
639
class SmartTCPClientMedium(SmartClientStreamMedium):
626
640
    """A client medium using TCP."""
627
641
    
628
 
    def __init__(self, host, port):
 
642
    def __init__(self, host, port, base):
629
643
        """Creates a client that will connect on the first use."""
630
 
        SmartClientStreamMedium.__init__(self)
 
644
        SmartClientStreamMedium.__init__(self, base)
631
645
        self._connected = False
632
646
        self._host = host
633
647
        self._port = port