mercurial/httprepo.py
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
Wed, 18 Nov 2009 12:47:58 +0100
changeset 9881 54b518fc6671
parent 9878 7e7d56fe4833
child 10208 37c4ce51a12d
permissions -rw-r--r--
httprepo: suppress the `real URL is...' message in safe, common cases. When the actual and requested URL only differ by trailing slashes, there is no need to warn. As an example, this easily happens when accessing repositories on Bitbucket over HTTP(S). As far as I could tell, there were no existing tests for this behaviour.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
     1
# httprepo.py - HTTP repository proxy classes for mercurial
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     2
#
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2740
diff changeset
     3
# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2740
diff changeset
     4
# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     5
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8206
diff changeset
     6
# This software may be used and distributed according to the terms of the
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8206
diff changeset
     7
# GNU General Public License version 2, incorporated herein by reference.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     8
7211
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
     9
from node import bin, hex, nullid
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3877
diff changeset
    10
from i18n import _
8312
b87a50b7125c separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents: 8225
diff changeset
    11
import repo, changegroup, statichttprepo, error, url, util
b87a50b7125c separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents: 8225
diff changeset
    12
import os, urllib, urllib2, urlparse, zlib, httplib
b87a50b7125c separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents: 8225
diff changeset
    13
import errno, socket
9861
0262bb59016f support encoding fallback in branchmap to maintain compatibility with 1.3.x
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 9748
diff changeset
    14
import encoding
4678
a814a5b11fff Work around urllib2 digest auth bug with Python < 2.5
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4633
diff changeset
    15
3661
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
    16
def zgenerator(f):
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
    17
    zd = zlib.decompressobj()
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
    18
    try:
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
    19
        for chunk in util.filechunkiter(f):
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
    20
            yield zd.decompress(chunk)
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7279
diff changeset
    21
    except httplib.HTTPException:
3661
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
    22
        raise IOError(None, _('connection ended unexpectedly'))
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
    23
    yield zd.flush()
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
    24
6313
c5580db9c3aa remoterepo: no longer needed
Matt Mackall <mpm@selenic.com>
parents: 6294
diff changeset
    25
class httprepository(repo.repository):
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
    26
    def __init__(self, ui, path):
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2612
diff changeset
    27
        self.path = path
2442
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    28
        self.caps = None
4132
0d94e4a3ddb4 Close keepalive connections to fix server traceback
Andrei Vermel <avermel@mail.ru>
parents: 4025
diff changeset
    29
        self.handler = None
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2336
diff changeset
    30
        scheme, netloc, urlpath, query, frag = urlparse.urlsplit(path)
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2336
diff changeset
    31
        if query or frag:
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2336
diff changeset
    32
            raise util.Abort(_('unsupported URL component: "%s"') %
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2336
diff changeset
    33
                             (query or frag))
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2336
diff changeset
    34
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2336
diff changeset
    35
        # urllib cannot handle URLs with embedded user or passwd
7270
2db33c1a5654 factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7269
diff changeset
    36
        self._url, authinfo = url.getauthinfo(path)
2db33c1a5654 factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7269
diff changeset
    37
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
    38
        self.ui = ui
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 8563
diff changeset
    39
        self.ui.debug('using %s\n' % self._url)
2337
3f24bc5dee81 http: fix many problems with url parsing and auth. added proxy test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2336
diff changeset
    40
7270
2db33c1a5654 factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7269
diff changeset
    41
        self.urlopener = url.opener(ui, authinfo)
4516
96d8a56d4ef9 Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4369
diff changeset
    42
7752
998fc8f62539 close sockets on httprepository deletion (issue1487)
Steve Borho <steve@borho.org>
parents: 7641
diff changeset
    43
    def __del__(self):
998fc8f62539 close sockets on httprepository deletion (issue1487)
Steve Borho <steve@borho.org>
parents: 7641
diff changeset
    44
        for h in self.urlopener.handlers:
998fc8f62539 close sockets on httprepository deletion (issue1487)
Steve Borho <steve@borho.org>
parents: 7641
diff changeset
    45
            h.close()
998fc8f62539 close sockets on httprepository deletion (issue1487)
Steve Borho <steve@borho.org>
parents: 7641
diff changeset
    46
            if hasattr(h, "close_all"):
998fc8f62539 close sockets on httprepository deletion (issue1487)
Steve Borho <steve@borho.org>
parents: 7641
diff changeset
    47
                h.close_all()
998fc8f62539 close sockets on httprepository deletion (issue1487)
Steve Borho <steve@borho.org>
parents: 7641
diff changeset
    48
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2612
diff changeset
    49
    def url(self):
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2612
diff changeset
    50
        return self.path
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2612
diff changeset
    51
2442
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    52
    # look up capabilities only when needed
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    53
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    54
    def get_caps(self):
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    55
        if self.caps is None:
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    56
            try:
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 8055
diff changeset
    57
                self.caps = set(self.do_read('capabilities').split())
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7342
diff changeset
    58
            except error.RepoError:
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 8055
diff changeset
    59
                self.caps = set()
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 8563
diff changeset
    60
            self.ui.debug('capabilities: %s\n' %
2465
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
    61
                          (' '.join(self.caps or ['none'])))
2442
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    62
        return self.caps
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    63
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    64
    capabilities = property(get_caps)
c660691fb45d http: query server for capabilities
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2439
diff changeset
    65
1870
8a8ab47cccde make push over http print good error message.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1736
diff changeset
    66
    def lock(self):
8a8ab47cccde make push over http print good error message.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1736
diff changeset
    67
        raise util.Abort(_('operation not supported over http'))
8a8ab47cccde make push over http print good error message.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1736
diff changeset
    68
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
    69
    def do_cmd(self, cmd, **args):
2465
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
    70
        data = args.pop('data', None)
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
    71
        headers = args.pop('headers', {})
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 8563
diff changeset
    72
        self.ui.debug("sending %s command\n" % cmd)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
    73
        q = {"cmd": cmd}
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
    74
        q.update(args)
3562
88b4755fa48f httprepo: record the url after a request, makes pull + redirect works
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3445
diff changeset
    75
        qs = '?%s' % urllib.urlencode(q)
88b4755fa48f httprepo: record the url after a request, makes pull + redirect works
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3445
diff changeset
    76
        cu = "%s%s" % (self._url, qs)
2294
ce67fa312f61 Catch urllib's HTTPException and give a meaningful error message to the user.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2281
diff changeset
    77
        try:
3567
3bab1fc0ab75 Turn bundle file into a string for http push, for urllib2 over proxies.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3566
diff changeset
    78
            if data:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 8563
diff changeset
    79
                self.ui.debug("sending %s bytes\n" % len(data))
7270
2db33c1a5654 factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7269
diff changeset
    80
            resp = self.urlopener.open(urllib2.Request(cu, data, headers))
2467
4e78dc71d946 http client: better work with authorization errors, broken sockets.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2465
diff changeset
    81
        except urllib2.HTTPError, inst:
4e78dc71d946 http client: better work with authorization errors, broken sockets.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2465
diff changeset
    82
            if inst.code == 401:
4e78dc71d946 http client: better work with authorization errors, broken sockets.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2465
diff changeset
    83
                raise util.Abort(_('authorization failed'))
4e78dc71d946 http client: better work with authorization errors, broken sockets.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2465
diff changeset
    84
            raise
2294
ce67fa312f61 Catch urllib's HTTPException and give a meaningful error message to the user.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2281
diff changeset
    85
        except httplib.HTTPException, inst:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 8563
diff changeset
    86
            self.ui.debug('http error while sending %s command\n' % cmd)
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8150
diff changeset
    87
            self.ui.traceback()
2336
f77edcffb837 http: print better error if exception happens.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2294
diff changeset
    88
            raise IOError(None, inst)
3399
5dbb3a991bbf Catch python2.3's IndexError with bogus http proxy settings. (issue203)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3223
diff changeset
    89
        except IndexError:
5dbb3a991bbf Catch python2.3's IndexError with bogus http proxy settings. (issue203)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3223
diff changeset
    90
            # this only happens with Python 2.3, later versions raise URLError
5dbb3a991bbf Catch python2.3's IndexError with bogus http proxy settings. (issue203)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3223
diff changeset
    91
            raise util.Abort(_('http error, possibly caused by proxy setting'))
3562
88b4755fa48f httprepo: record the url after a request, makes pull + redirect works
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3445
diff changeset
    92
        # record the url we got redirected to
3570
c141d07198b9 Inform the user about the new URL when being redirected via http.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3569
diff changeset
    93
        resp_url = resp.geturl()
c141d07198b9 Inform the user about the new URL when being redirected via http.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3569
diff changeset
    94
        if resp_url.endswith(qs):
c141d07198b9 Inform the user about the new URL when being redirected via http.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3569
diff changeset
    95
            resp_url = resp_url[:-len(qs)]
9881
54b518fc6671 httprepo: suppress the `real URL is...' message in safe, common cases.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9878
diff changeset
    96
        if self._url.rstrip('/') != resp_url.rstrip('/'):
3570
c141d07198b9 Inform the user about the new URL when being redirected via http.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3569
diff changeset
    97
            self.ui.status(_('real URL is %s\n') % resp_url)
c141d07198b9 Inform the user about the new URL when being redirected via http.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3569
diff changeset
    98
            self._url = resp_url
2435
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
    99
        try:
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   100
            proto = resp.getheader('content-type')
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   101
        except AttributeError:
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   102
            proto = resp.headers['content-type']
752
c693eafd5967 Simplify content type checking
mpm@selenic.com
parents: 751
diff changeset
   103
8053
976170068286 hide passwords in httprepo error messages
Steve Borho <steve@borho.org>
parents: 7752
diff changeset
   104
        safeurl = url.hidepassword(self._url)
753
8760d0c83b9b Check protocol versions
mpm@selenic.com
parents: 752
diff changeset
   105
        # accept old "text/plain" and "application/hg-changegroup" for now
4633
ff7253a0d1da Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4516
diff changeset
   106
        if not (proto.startswith('application/mercurial-') or
ff7253a0d1da Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4516
diff changeset
   107
                proto.startswith('text/plain') or
ff7253a0d1da Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4516
diff changeset
   108
                proto.startswith('application/hg-changegroup')):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 8563
diff changeset
   109
            self.ui.debug("requested URL: '%s'\n" % url.hidepassword(cu))
9748
67e5d5a2f625 Sometimes pushing to an HTTP repo fails with a useless message.
Jesse Glick <jesse.glick@sun.com>
parents: 9467
diff changeset
   110
            raise error.RepoError(_("'%s' does not appear to be an hg repository:\n"
67e5d5a2f625 Sometimes pushing to an HTTP repo fails with a useless message.
Jesse Glick <jesse.glick@sun.com>
parents: 9467
diff changeset
   111
                                    "---%%<--- (%s)\n%s\n---%%<---\n")
67e5d5a2f625 Sometimes pushing to an HTTP repo fails with a useless message.
Jesse Glick <jesse.glick@sun.com>
parents: 9467
diff changeset
   112
                                  % (safeurl, proto, resp.read()))
752
c693eafd5967 Simplify content type checking
mpm@selenic.com
parents: 751
diff changeset
   113
4012
d1e31d7f7d44 fix handling of multiple Content-type headers
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3703
diff changeset
   114
        if proto.startswith('application/mercurial-'):
d1e31d7f7d44 fix handling of multiple Content-type headers
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3703
diff changeset
   115
            try:
4356
aed9e6dceb85 Avoid float rounding errors when checking http protocol version.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4226
diff changeset
   116
                version = proto.split('-', 1)[1]
aed9e6dceb85 Avoid float rounding errors when checking http protocol version.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4226
diff changeset
   117
                version_info = tuple([int(n) for n in version.split('.')])
4012
d1e31d7f7d44 fix handling of multiple Content-type headers
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3703
diff changeset
   118
            except ValueError:
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7342
diff changeset
   119
                raise error.RepoError(_("'%s' sent a broken Content-Type "
8053
976170068286 hide passwords in httprepo error messages
Steve Borho <steve@borho.org>
parents: 7752
diff changeset
   120
                                        "header (%s)") % (safeurl, proto))
4356
aed9e6dceb85 Avoid float rounding errors when checking http protocol version.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4226
diff changeset
   121
            if version_info > (0, 1):
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7342
diff changeset
   122
                raise error.RepoError(_("'%s' uses newer protocol %s") %
8053
976170068286 hide passwords in httprepo error messages
Steve Borho <steve@borho.org>
parents: 7752
diff changeset
   123
                                      (safeurl, version))
753
8760d0c83b9b Check protocol versions
mpm@selenic.com
parents: 752
diff changeset
   124
752
c693eafd5967 Simplify content type checking
mpm@selenic.com
parents: 751
diff changeset
   125
        return resp
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
   126
2435
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   127
    def do_read(self, cmd, **args):
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   128
        fp = self.do_cmd(cmd, **args)
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   129
        try:
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   130
            return fp.read()
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   131
        finally:
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   132
            # if using keepalive, allow connection to be reused
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   133
            fp.close()
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   134
3444
3505fcd5a231 Adding changegroupsubset and lookup to web protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents: 3399
diff changeset
   135
    def lookup(self, key):
5259
65dc707606ed Push capability checking into protocol-level code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5258
diff changeset
   136
        self.requirecap('lookup', _('look up remote revision'))
3445
233c733e4af5 httprepo: add support for passing lookup exception data
Matt Mackall <mpm@selenic.com>
parents: 3444
diff changeset
   137
        d = self.do_cmd("lookup", key = key).read()
233c733e4af5 httprepo: add support for passing lookup exception data
Matt Mackall <mpm@selenic.com>
parents: 3444
diff changeset
   138
        success, data = d[:-1].split(' ', 1)
233c733e4af5 httprepo: add support for passing lookup exception data
Matt Mackall <mpm@selenic.com>
parents: 3444
diff changeset
   139
        if int(success):
233c733e4af5 httprepo: add support for passing lookup exception data
Matt Mackall <mpm@selenic.com>
parents: 3444
diff changeset
   140
            return bin(data)
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7342
diff changeset
   141
        raise error.RepoError(data)
3444
3505fcd5a231 Adding changegroupsubset and lookup to web protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents: 3399
diff changeset
   142
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
   143
    def heads(self):
2435
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   144
        d = self.do_read("heads")
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
   145
        try:
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
   146
            return map(bin, d[:-1].split(" "))
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
   147
        except:
7641
d2f753830f80 error: move UnexpectedOutput (now ResponseError)
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   148
            raise error.ResponseError(_("unexpected response:"), d)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
   149
8563
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   150
    def branchmap(self):
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   151
        d = self.do_read("branchmap")
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   152
        try:
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   153
            branchmap = {}
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   154
            for branchpart in d.splitlines():
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   155
                branchheads = branchpart.split(' ')
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   156
                branchname = urllib.unquote(branchheads[0])
9878
7e7d56fe4833 branchmap: fix defective fallback fix 0262bb59016f
Sune Foldager <cryo@cyanite.org>
parents: 9861
diff changeset
   157
                # Earlier servers (1.3.x) send branch names in (their) local
7e7d56fe4833 branchmap: fix defective fallback fix 0262bb59016f
Sune Foldager <cryo@cyanite.org>
parents: 9861
diff changeset
   158
                # charset. The best we can do is assume it's identical to our
7e7d56fe4833 branchmap: fix defective fallback fix 0262bb59016f
Sune Foldager <cryo@cyanite.org>
parents: 9861
diff changeset
   159
                # own local charset, in case it's not utf-8.
9861
0262bb59016f support encoding fallback in branchmap to maintain compatibility with 1.3.x
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 9748
diff changeset
   160
                try:
9878
7e7d56fe4833 branchmap: fix defective fallback fix 0262bb59016f
Sune Foldager <cryo@cyanite.org>
parents: 9861
diff changeset
   161
                    branchname.decode('utf-8')
9861
0262bb59016f support encoding fallback in branchmap to maintain compatibility with 1.3.x
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 9748
diff changeset
   162
                except UnicodeDecodeError:
9878
7e7d56fe4833 branchmap: fix defective fallback fix 0262bb59016f
Sune Foldager <cryo@cyanite.org>
parents: 9861
diff changeset
   163
                    branchname = encoding.fromlocal(branchname)
8563
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   164
                branchheads = [bin(x) for x in branchheads[1:]]
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   165
                branchmap[branchname] = branchheads
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   166
            return branchmap
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   167
        except:
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   168
            raise error.ResponseError(_("unexpected response:"), d)
f8ff65a83169 named branches: client branchmap wire protocol support (issue736)
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8312
diff changeset
   169
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
   170
    def branches(self, nodes):
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
   171
        n = " ".join(map(hex, nodes))
2435
ff2bac730b99 http client: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2337
diff changeset
   172
        d = self.do_read("branches", nodes=n)
217
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
   173
        try:
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
   174
            br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ]
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
   175
            return br
e6d6497a6331 merge: catch unexpected responses
mpm@selenic.com
parents: 216
diff changeset
   176
        except:
7641
d2f753830f80 error: move UnexpectedOutput (now ResponseError)
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   177
            raise error.ResponseError(_("unexpected response:"), d)
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
   178
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
   179
    def between(self, pairs):
7342
1dcd2cc6878b protocol: avoid sending outrageously large between requests
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
   180
        batch = 8 # avoid giant requests
1dcd2cc6878b protocol: avoid sending outrageously large between requests
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
   181
        r = []
1dcd2cc6878b protocol: avoid sending outrageously large between requests
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
   182
        for i in xrange(0, len(pairs), batch):
1dcd2cc6878b protocol: avoid sending outrageously large between requests
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
   183
            n = " ".join(["-".join(map(hex, p)) for p in pairs[i:i + batch]])
1dcd2cc6878b protocol: avoid sending outrageously large between requests
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
   184
            d = self.do_read("between", pairs=n)
1dcd2cc6878b protocol: avoid sending outrageously large between requests
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
   185
            try:
1dcd2cc6878b protocol: avoid sending outrageously large between requests
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
   186
                r += [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ]
1dcd2cc6878b protocol: avoid sending outrageously large between requests
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
   187
            except:
7641
d2f753830f80 error: move UnexpectedOutput (now ResponseError)
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   188
                raise error.ResponseError(_("unexpected response:"), d)
7342
1dcd2cc6878b protocol: avoid sending outrageously large between requests
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
   189
        return r
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
   190
1736
50de0887bbcd add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1402
diff changeset
   191
    def changegroup(self, nodes, kind):
60
e32fdbd97839 Add hg:// protocol
mpm@selenic.com
parents: 56
diff changeset
   192
        n = " ".join(map(hex, nodes))
752
c693eafd5967 Simplify content type checking
mpm@selenic.com
parents: 751
diff changeset
   193
        f = self.do_cmd("changegroup", roots=n)
3661
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
   194
        return util.chunkbuffer(zgenerator(f))
3444
3505fcd5a231 Adding changegroupsubset and lookup to web protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents: 3399
diff changeset
   195
3505fcd5a231 Adding changegroupsubset and lookup to web protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents: 3399
diff changeset
   196
    def changegroupsubset(self, bases, heads, source):
5259
65dc707606ed Push capability checking into protocol-level code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5258
diff changeset
   197
        self.requirecap('changegroupsubset', _('look up remote changes'))
3444
3505fcd5a231 Adding changegroupsubset and lookup to web protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents: 3399
diff changeset
   198
        baselst = " ".join([hex(n) for n in bases])
3505fcd5a231 Adding changegroupsubset and lookup to web protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents: 3399
diff changeset
   199
        headlst = " ".join([hex(n) for n in heads])
3505fcd5a231 Adding changegroupsubset and lookup to web protocol so pull -r and
Eric Hopper <hopper@omnifarious.org>
parents: 3399
diff changeset
   200
        f = self.do_cmd("changegroupsubset", bases=baselst, heads=headlst)
3661
e99ba8726bda remove duplicate zgenerator in httprepo
Matt Mackall <mpm@selenic.com>
parents: 3614
diff changeset
   201
        return util.chunkbuffer(zgenerator(f))
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 634
diff changeset
   202
2439
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2435
diff changeset
   203
    def unbundle(self, cg, heads, source):
2465
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
   204
        # have to stream bundle to a temp file because we do not have
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
   205
        # http 1.1 chunked transfer.
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
   206
3662
f4dc02d7fb71 unduplicate bundle writing code from httprepo
Matt Mackall <mpm@selenic.com>
parents: 3661
diff changeset
   207
        type = ""
f4dc02d7fb71 unduplicate bundle writing code from httprepo
Matt Mackall <mpm@selenic.com>
parents: 3661
diff changeset
   208
        types = self.capable('unbundle')
3703
e674cae8efee fix push over HTTP to older servers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3662
diff changeset
   209
        # servers older than d1b16a746db6 will send 'unbundle' as a
e674cae8efee fix push over HTTP to older servers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3662
diff changeset
   210
        # boolean capability
e674cae8efee fix push over HTTP to older servers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3662
diff changeset
   211
        try:
e674cae8efee fix push over HTTP to older servers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3662
diff changeset
   212
            types = types.split(',')
e674cae8efee fix push over HTTP to older servers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3662
diff changeset
   213
        except AttributeError:
e674cae8efee fix push over HTTP to older servers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3662
diff changeset
   214
            types = [""]
3662
f4dc02d7fb71 unduplicate bundle writing code from httprepo
Matt Mackall <mpm@selenic.com>
parents: 3661
diff changeset
   215
        if types:
3703
e674cae8efee fix push over HTTP to older servers
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3662
diff changeset
   216
            for x in types:
3662
f4dc02d7fb71 unduplicate bundle writing code from httprepo
Matt Mackall <mpm@selenic.com>
parents: 3661
diff changeset
   217
                if x in changegroup.bundletypes:
f4dc02d7fb71 unduplicate bundle writing code from httprepo
Matt Mackall <mpm@selenic.com>
parents: 3661
diff changeset
   218
                    type = x
f4dc02d7fb71 unduplicate bundle writing code from httprepo
Matt Mackall <mpm@selenic.com>
parents: 3661
diff changeset
   219
                    break
3613
cbf352b9a3cd Client support for hgweb unbundle with versions.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3609
diff changeset
   220
3662
f4dc02d7fb71 unduplicate bundle writing code from httprepo
Matt Mackall <mpm@selenic.com>
parents: 3661
diff changeset
   221
        tempname = changegroup.writebundle(cg, None, type)
7270
2db33c1a5654 factor out the url handling from httprepo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7269
diff changeset
   222
        fp = url.httpsendfile(tempname, "rb")
2465
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
   223
        try:
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
   224
            try:
7010
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   225
                resp = self.do_read(
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   226
                     'unbundle', data=fp,
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   227
                     headers={'Content-Type': 'application/octet-stream'},
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   228
                     heads=' '.join(map(hex, heads)))
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   229
                resp_code, output = resp.split('\n', 1)
2467
4e78dc71d946 http client: better work with authorization errors, broken sockets.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2465
diff changeset
   230
                try:
7010
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   231
                    ret = int(resp_code)
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   232
                except ValueError, err:
7641
d2f753830f80 error: move UnexpectedOutput (now ResponseError)
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   233
                    raise error.ResponseError(
7010
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   234
                            _('push failed (unexpected response):'), resp)
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   235
                self.ui.write(output)
9141bebefe3e enhance the error output in case of failure during http push
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6787
diff changeset
   236
                return ret
2467
4e78dc71d946 http client: better work with authorization errors, broken sockets.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2465
diff changeset
   237
            except socket.error, err:
4e78dc71d946 http client: better work with authorization errors, broken sockets.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2465
diff changeset
   238
                if err[0] in (errno.ECONNRESET, errno.EPIPE):
3072
bc3fe3b5b785 Never apply string formatting to generated errors with util.Abort.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2859
diff changeset
   239
                    raise util.Abort(_('push failed: %s') % err[1])
2467
4e78dc71d946 http client: better work with authorization errors, broken sockets.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2465
diff changeset
   240
                raise util.Abort(err[1])
2465
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
   241
        finally:
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
   242
            fp.close()
c91118f425d0 push over http: client support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2447
diff changeset
   243
            os.unlink(tempname)
2439
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2435
diff changeset
   244
2612
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
   245
    def stream_out(self):
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
   246
        return self.do_cmd('stream_out')
ffb895f16925 add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2569
diff changeset
   247
923
c7a3b88505cd Add basic https support for pull
mpm@selenic.com
parents: 919
diff changeset
   248
class httpsrepository(httprepository):
2569
52ce0d6bc375 HTTPS: fix python2.3, persistent connections, don't explode if SSL is not available
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2557
diff changeset
   249
    def __init__(self, ui, path):
7279
1f0f84660dea Fix https availability checking
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7270
diff changeset
   250
        if not url.has_https:
2569
52ce0d6bc375 HTTPS: fix python2.3, persistent connections, don't explode if SSL is not available
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2557
diff changeset
   251
            raise util.Abort(_('Python support for SSL and HTTPS '
52ce0d6bc375 HTTPS: fix python2.3, persistent connections, don't explode if SSL is not available
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2557
diff changeset
   252
                               'is not installed'))
52ce0d6bc375 HTTPS: fix python2.3, persistent connections, don't explode if SSL is not available
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2557
diff changeset
   253
        httprepository.__init__(self, ui, path)
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   254
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   255
def instance(ui, path, create):
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   256
    if create:
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   257
        raise util.Abort(_('cannot create new http repository'))
7211
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
   258
    try:
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
   259
        if path.startswith('https:'):
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
   260
            inst = httpsrepository(ui, path)
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
   261
        else:
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
   262
            inst = httprepository(ui, path)
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
   263
        inst.between([(nullid, nullid)])
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
   264
        return inst
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7342
diff changeset
   265
    except error.RepoError:
7211
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
   266
        ui.note('(falling back to static-http)\n')
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7207
diff changeset
   267
        return statichttprepo.instance(ui, "static-" + path, create)