/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2005, 2006 Canonical Ltd
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
16
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
17
from bzrlib.symbol_versioning import deprecated_function, deprecated_in
1996.3.8 by John Arbash Meinel
lazy_import bundle and bundle.commands
18
from bzrlib.lazy_import import lazy_import
19
lazy_import(globals(), """
20
from bzrlib import (
21
    errors,
22
    urlutils,
23
    )
2095.2.1 by John Arbash Meinel
Fix imports for bundles.
24
from bzrlib.bundle import serializer as _serializer
2164.2.21 by Vincent Ladeuil
Take bundles into account.
25
from bzrlib.transport import (
26
    do_catching_redirections,
27
    get_transport,
28
    )
1996.3.8 by John Arbash Meinel
lazy_import bundle and bundle.commands
29
""")
2164.2.21 by Vincent Ladeuil
Take bundles into account.
30
from bzrlib.trace import note
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
31
32
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
33
@deprecated_function(deprecated_in((1, 12, 0)))
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
34
def read_bundle_from_url(url):
1551.14.7 by Aaron Bentley
test suite fixes
35
    return read_mergeable_from_url(url, _do_directive=False)
1551.14.1 by Aaron Bentley
Allow pull from a merge directive
36
2485.8.35 by Vincent Ladeuil
Fix pull multiple connections.
37
3251.4.10 by Aaron Bentley
Pull of launchpad locations works (abentley, #181945)
38
def read_mergeable_from_url(url, _do_directive=True, possible_transports=None):
1551.14.4 by Aaron Bentley
Change bundle reader and merge directive to both be 'mergeables'
39
    """Read mergable object from a given URL.
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
40
1551.14.4 by Aaron Bentley
Change bundle reader and merge directive to both be 'mergeables'
41
    :return: An object supporting get_target_revision.  Raises NotABundle if
42
        the target is not a mergeable type.
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
43
    """
3251.4.11 by Aaron Bentley
Fix wrong local lookups
44
    child_transport = get_transport(url,
45
        possible_transports=possible_transports)
46
    transport = child_transport.clone('..')
47
    filename = transport.relpath(child_transport.base)
2485.8.35 by Vincent Ladeuil
Fix pull multiple connections.
48
    mergeable, transport = read_mergeable_from_transport(transport, filename,
49
                                                         _do_directive)
50
    return mergeable
51
52
53
def read_mergeable_from_transport(transport, filename, _do_directive=True):
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
54
    # All of this must be in the try/except
55
    # Some transports cannot detect that we are trying to read a
56
    # directory until we actually issue read() on the handle.
57
    try:
2164.2.21 by Vincent Ladeuil
Take bundles into account.
58
        def get_bundle(transport):
2485.8.35 by Vincent Ladeuil
Fix pull multiple connections.
59
            return transport.get(filename), transport
2164.2.21 by Vincent Ladeuil
Take bundles into account.
60
61
        def redirected_transport(transport, exception, redirection_notice):
62
            note(redirection_notice)
2164.2.22 by Vincent Ladeuil
Take Aaron's review comments into account.
63
            url, filename = urlutils.split(exception.target,
64
                                           exclude_trailing_slash=False)
65
            if not filename:
66
                raise errors.NotABundle('A directory cannot be a bundle')
67
            return get_transport(url)
2164.2.21 by Vincent Ladeuil
Take bundles into account.
68
2164.2.22 by Vincent Ladeuil
Take Aaron's review comments into account.
69
        try:
2485.8.35 by Vincent Ladeuil
Fix pull multiple connections.
70
            f, transport = do_catching_redirections(get_bundle, transport,
71
                                                    redirected_transport)
2164.2.22 by Vincent Ladeuil
Take Aaron's review comments into account.
72
        except errors.TooManyRedirections:
4547.2.1 by Andrew Bennetts
Trivial fix for undefined local 'url' in TooManyRedirections case of read_mergeable_from_transport.
73
            raise errors.NotABundle(transport.clone(filename).base)
2164.2.21 by Vincent Ladeuil
Take bundles into account.
74
4792.7.1 by Martin
Ensure files that are opened as potential bundles but turn out not to be get closed
75
        bundle = None
76
        try:
77
            if _do_directive:
78
                from bzrlib.merge_directive import MergeDirective
79
                try:
80
                    return MergeDirective.from_lines(f.readlines()), transport
81
                except errors.NotAMergeDirective:
82
                    f.seek(0)
83
            bundle = _serializer.read_bundle(f)
84
        finally:
85
            if bundle is None:
86
                f.close()
87
        return bundle, transport
3983.4.1 by John Arbash Meinel
Don't trap a regular ConnectionError when trying to read a mergeable from a url.
88
    except (errors.ConnectionReset, errors.ConnectionError), e:
3703.2.1 by Andrew Bennetts
Allow ConnectionReset to propagate from read_mergeable_from_url.
89
        raise
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
90
    except (errors.TransportError, errors.PathError), e:
91
        raise errors.NotABundle(str(e))
1793.4.1 by John Arbash Meinel
Handle the SFTP exception that you can't read() from the result of get() to a dir
92
    except (IOError,), e:
93
        # jam 20060707
94
        # Abstraction leakage, SFTPTransport.get('directory')
95
        # doesn't always fail at get() time. Sometimes it fails
96
        # during read. And that raises a generic IOError with
97
        # just the string 'Failure'
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
98
        # StubSFTPServer does fail during get() (because of prefetch)
1793.4.1 by John Arbash Meinel
Handle the SFTP exception that you can't read() from the result of get() to a dir
99
        # so it has an opportunity to translate the error.
100
        raise errors.NotABundle(str(e))