/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 __init__.py

Cope with API changes in Dulwich.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Canonical Ltd
 
1
# Copyright (C) 2006-2009 Canonical Ltd
2
2
 
3
3
# Authors: Robert Collins <robert.collins@canonical.com>
4
4
#          Jelmer Vernooij <jelmer@samba.org>
21
21
 
22
22
"""A GIT branch and repository format implementation for bzr."""
23
23
 
 
24
import os
 
25
import sys
 
26
 
24
27
import bzrlib
25
28
import bzrlib.api
26
 
from bzrlib import bzrdir, errors as bzr_errors
27
 
from bzrlib.foreign import foreign_vcs_registry
28
 
from bzrlib.lockable_files import TransportLock
29
 
from bzrlib.transport import register_lazy_transport
30
 
from bzrlib.commands import plugin_cmds
31
 
from bzrlib.trace import warning
32
 
 
33
 
MINIMUM_DULWICH_VERSION = (0, 1, 0)
34
 
COMPATIBLE_BZR_VERSIONS = [(1, 11, 0), (1, 12, 0)]
 
29
from bzrlib import (
 
30
    bzrdir,
 
31
    errors as bzr_errors,
 
32
    osutils,
 
33
    )
 
34
from bzrlib.foreign import (
 
35
    foreign_vcs_registry,
 
36
    )
 
37
from bzrlib.lockable_files import (
 
38
    TransportLock,
 
39
    )
 
40
from bzrlib.transport import (
 
41
    register_lazy_transport,
 
42
    register_transport_proto,
 
43
    )
 
44
from bzrlib.commands import (
 
45
    plugin_cmds,
 
46
    )
 
47
from bzrlib.trace import (
 
48
    warning,
 
49
    )
 
50
from bzrlib.version_info_formats.format_rio import (
 
51
    RioVersionInfoBuilder,
 
52
    )
 
53
 
 
54
 
 
55
# versions ending in 'exp' mean experimental mappings
 
56
# versions ending in 'dev' mean development version
 
57
# versions ending in 'final' mean release (well tested, etc)
 
58
version_info = (0, 3, 1, 'dev', 0)
 
59
 
 
60
if version_info[3] == 'final':
 
61
    version_string = '%d.%d.%d' % version_info[:3]
 
62
else:
 
63
    version_string = '%d.%d.%d%s%d' % version_info
 
64
__version__ = version_string
 
65
 
 
66
MINIMUM_DULWICH_VERSION = (0, 3, 0)
 
67
COMPATIBLE_BZR_VERSIONS = [(1, 14, 0), (1, 15, 0)]
 
68
 
 
69
if getattr(sys, "frozen", None):
 
70
    # allow import additional libs from ./_lib for bzr.exe only
 
71
    sys.path.append(os.path.normpath(os.path.join(os.path.dirname(__file__), '_lib')))
35
72
 
36
73
_versions_checked = False
37
74
def lazy_check_versions():
42
79
    try:
43
80
        from dulwich import __version__ as dulwich_version
44
81
    except ImportError:
45
 
        warning("Please install dulwich, https://launchpad.net/dulwich")
46
 
        raise
 
82
        raise ImportError("bzr-git: Please install dulwich, https://launchpad.net/dulwich")
47
83
    else:
48
84
        if dulwich_version < MINIMUM_DULWICH_VERSION:
49
 
            warning("Dulwich is too old; at least %d.%d.%d is required" % MINIMUM_DULWICH_VERSION)
50
 
            raise ImportError
 
85
            raise ImportError("bzr-git: Dulwich is too old; at least %d.%d.%d is required" % MINIMUM_DULWICH_VERSION)
51
86
 
52
87
bzrlib.api.require_any_api(bzrlib, COMPATIBLE_BZR_VERSIONS)
53
88
 
56
91
    help='GIT repository.', native=False, experimental=True,
57
92
    )
58
93
 
59
 
try:
60
 
    from bzrlib.revisionspec import revspec_registry
61
 
    revspec_registry.register_lazy("git:", "bzrlib.plugins.git.revspec", 
62
 
        "RevisionSpec_git")
63
 
except ImportError:
64
 
    lazy_check_versions()
65
 
    from bzrlib.revisionspec import SPEC_TYPES
66
 
    from bzrlib.plugins.git.revspec import RevisionSpec_git
67
 
    SPEC_TYPES.append(RevisionSpec_git)
 
94
from bzrlib.revisionspec import revspec_registry
 
95
revspec_registry.register_lazy("git:", "bzrlib.plugins.git.revspec", 
 
96
    "RevisionSpec_git")
 
97
 
68
98
 
69
99
class GitBzrDirFormat(bzrdir.BzrDirFormat):
70
100
    _lock_class = TransportLock
91
121
            url = url[len('readonly+'):]
92
122
 
93
123
        try:
94
 
            gitrepo = git.repo.Repo(transport.local_abspath("."))
 
124
            gitrepo = git.repo.Repo(transport.local_abspath(".").encode(osutils._fs_enc))
95
125
        except bzr_errors.NotLocalUrl:
96
126
            raise bzr_errors.NotBranchError(path=transport.base)
97
127
        from bzrlib.plugins.git.dir import LocalGitDir, GitLockableFiles, GitLock
135
165
                "non-local transports")
136
166
 
137
167
        from dulwich.repo import Repo
138
 
        Repo.create(transport.local_abspath(".")) 
 
168
        Repo.create(transport.local_abspath(".").encode(osutils._fs_enc)) 
139
169
        return self.open(transport)
140
170
 
141
171
    def is_supported(self):
153
183
        """Open this directory.
154
184
 
155
185
        """
 
186
        # we dont grok readonly - git isn't integrated with transport.
 
187
        url = transport.base
 
188
        if url.startswith('readonly+'):
 
189
            url = url[len('readonly+'):]
 
190
        if (not url.startswith("git://") and 
 
191
            not url.startswith("git+")):
 
192
            raise bzr_errors.NotBranchError(transport.base)
156
193
        from bzrlib.plugins.git.remote import RemoteGitDir, GitSmartTransport
157
194
        if not isinstance(transport, GitSmartTransport):
158
195
            raise bzr_errors.NotBranchError(transport.base)
159
 
        # we dont grok readonly - git isn't integrated with transport.
160
 
        url = transport.base
161
 
        if url.startswith('readonly+'):
162
 
            url = url[len('readonly+'):]
163
 
 
164
196
        from bzrlib.plugins.git.dir import GitLockableFiles, GitLock
165
197
        lockfiles = GitLockableFiles(transport, GitLock())
166
198
        return RemoteGitDir(transport, lockfiles, self)
168
200
    @classmethod
169
201
    def probe_transport(klass, transport):
170
202
        """Our format is present if the transport ends in '.not/'."""
 
203
        url = transport.base
 
204
        if url.startswith('readonly+'):
 
205
            url = url[len('readonly+'):]
 
206
        if (not url.startswith("git://") and 
 
207
            not url.startswith("git+")):
 
208
            raise bzr_errors.NotBranchError(transport.base)
171
209
        # little ugly, but works
172
210
        format = klass()
173
211
        from bzrlib.plugins.git.remote import GitSmartTransport
174
212
        if not isinstance(transport, GitSmartTransport):
175
213
            raise bzr_errors.NotBranchError(transport.base)
176
 
        # The only way to know a path exists and contains a valid repository 
177
 
        # is to do a request against it:
178
 
        try:
179
 
            transport.fetch_pack(lambda x: [], None, lambda x: None, 
180
 
                                 lambda x: mutter("git: %s" % x))
181
 
        except errors.git_errors.GitProtocolError:
182
 
            raise bzr_errors.NotBranchError(path=transport.base)
183
 
        else:
184
 
            return format
185
 
        raise bzr_errors.NotBranchError(path=transport.base)
 
214
        return format
186
215
 
187
216
    def get_format_description(self):
188
217
        return "Remote Git Repository"
197
226
bzrdir.BzrDirFormat.register_control_format(LocalGitBzrDirFormat)
198
227
bzrdir.BzrDirFormat.register_control_format(RemoteGitBzrDirFormat)
199
228
 
 
229
register_transport_proto('git://', 
 
230
        help="Access using the Git smart server protocol.")
 
231
register_transport_proto('git+ssh://', 
 
232
        help="Access using the Git smart server protocol over SSH.")
 
233
 
200
234
register_lazy_transport("git://", 'bzrlib.plugins.git.remote',
201
 
                        'GitSmartTransport')
 
235
                        'TCPGitSmartTransport')
 
236
register_lazy_transport("git+ssh://", 'bzrlib.plugins.git.remote',
 
237
                        'SSHGitSmartTransport')
202
238
 
203
239
foreign_vcs_registry.register_lazy("git", 
204
 
                        "bzrlib.plugins.git.mapping", 
205
 
                        "foreign_git",
206
 
                        "Stupid content tracker")
 
240
    "bzrlib.plugins.git.mapping", "foreign_git", "Stupid content tracker")
207
241
 
208
242
plugin_cmds.register_lazy("cmd_git_serve", [], "bzrlib.plugins.git.commands")
209
243
plugin_cmds.register_lazy("cmd_git_import", [], "bzrlib.plugins.git.commands")
 
244
plugin_cmds.register_lazy("cmd_git_object", ["git-objects", "git-cat"], 
 
245
    "bzrlib.plugins.git.commands")
 
246
 
 
247
def update_stanza(rev, stanza):
 
248
    mapping = getattr(rev, "mapping", None)
 
249
    if mapping is not None and mapping.revid_prefix.startswith("git-"):
 
250
        stanza.add("git-commit", rev.foreign_revid)
 
251
 
 
252
 
 
253
rio_hooks = getattr(RioVersionInfoBuilder, "hooks", None)
 
254
if rio_hooks is not None:
 
255
    rio_hooks.install_named_hook('revision', update_stanza, None)
 
256
 
 
257
def get_rich_root_format(stacked=False):
 
258
    if stacked:
 
259
        return bzrdir.format_registry.make_bzrdir("1.9-rich-root")
 
260
    else:
 
261
        return bzrdir.format_registry.make_bzrdir("default-rich-root")
210
262
 
211
263
def test_suite():
212
264
    from bzrlib.plugins.git import tests