/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

Implement GitRepository.revision_graph_can_have_wrong_parents().

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
 
 
30
# versions ending in 'exp' mean experimental mappings
 
31
# versions ending in 'dev' mean development version
 
32
# versions ending in 'final' mean release (well tested, etc)
 
33
version_info = (0, 3, 3, 'dev', 0)
 
34
 
 
35
if version_info[3] == 'final':
 
36
    version_string = '%d.%d.%d' % version_info[:3]
 
37
else:
 
38
    version_string = '%d.%d.%d%s%d' % version_info
 
39
__version__ = version_string
 
40
 
 
41
MINIMUM_DULWICH_VERSION = (0, 3, 1)
 
42
COMPATIBLE_BZR_VERSIONS = [(1, 14, 0), (1, 15, 0)]
 
43
 
 
44
bzrlib.api.require_any_api(bzrlib, COMPATIBLE_BZR_VERSIONS)
 
45
 
 
46
 
 
47
from bzrlib import (
 
48
    bzrdir,
 
49
    errors as bzr_errors,
 
50
    osutils,
 
51
    )
 
52
from bzrlib.foreign import (
 
53
    foreign_vcs_registry,
 
54
    )
 
55
from bzrlib.lockable_files import (
 
56
    TransportLock,
 
57
    )
 
58
from bzrlib.transport import (
 
59
    register_lazy_transport,
 
60
    register_transport_proto,
 
61
    )
 
62
from bzrlib.commands import (
 
63
    plugin_cmds,
 
64
    )
 
65
from bzrlib.trace import (
 
66
    warning,
 
67
    )
 
68
from bzrlib.version_info_formats.format_rio import (
 
69
    RioVersionInfoBuilder,
 
70
    )
 
71
 
 
72
 
 
73
if getattr(sys, "frozen", None):
 
74
    # allow import additional libs from ./_lib for bzr.exe only
 
75
    sys.path.append(os.path.normpath(os.path.join(os.path.dirname(__file__), '_lib')))
35
76
 
36
77
_versions_checked = False
37
78
def lazy_check_versions():
42
83
    try:
43
84
        from dulwich import __version__ as dulwich_version
44
85
    except ImportError:
45
 
        warning("Please install dulwich, https://launchpad.net/dulwich")
46
 
        raise
 
86
        raise ImportError("bzr-git: Please install dulwich, https://launchpad.net/dulwich")
47
87
    else:
48
88
        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
51
 
 
52
 
bzrlib.api.require_any_api(bzrlib, COMPATIBLE_BZR_VERSIONS)
 
89
            raise ImportError("bzr-git: Dulwich is too old; at least %d.%d.%d is required" % MINIMUM_DULWICH_VERSION)
53
90
 
54
91
bzrdir.format_registry.register_lazy('git', 
55
92
    "bzrlib.plugins.git.dir", "LocalGitBzrDirFormat",
56
93
    help='GIT repository.', native=False, experimental=True,
57
94
    )
58
95
 
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)
 
96
from bzrlib.revisionspec import revspec_registry
 
97
revspec_registry.register_lazy("git:", "bzrlib.plugins.git.revspec", 
 
98
    "RevisionSpec_git")
 
99
 
68
100
 
69
101
class GitBzrDirFormat(bzrdir.BzrDirFormat):
70
102
    _lock_class = TransportLock
72
104
    def is_supported(self):
73
105
        return True
74
106
 
 
107
    def network_name(self):
 
108
        return "git"
 
109
 
75
110
 
76
111
class LocalGitBzrDirFormat(GitBzrDirFormat):
77
112
    """The .git directory control format."""
91
126
            url = url[len('readonly+'):]
92
127
 
93
128
        try:
94
 
            gitrepo = git.repo.Repo(transport.local_abspath("."))
 
129
            gitrepo = git.repo.Repo(transport.local_abspath(".").encode(osutils._fs_enc))
95
130
        except bzr_errors.NotLocalUrl:
96
131
            raise bzr_errors.NotBranchError(path=transport.base)
97
132
        from bzrlib.plugins.git.dir import LocalGitDir, GitLockableFiles, GitLock
135
170
                "non-local transports")
136
171
 
137
172
        from dulwich.repo import Repo
138
 
        Repo.create(transport.local_abspath(".")) 
 
173
        Repo.create(transport.local_abspath(".").encode(osutils._fs_enc)) 
139
174
        return self.open(transport)
140
175
 
141
176
    def is_supported(self):
153
188
        """Open this directory.
154
189
 
155
190
        """
 
191
        # we dont grok readonly - git isn't integrated with transport.
 
192
        url = transport.base
 
193
        if url.startswith('readonly+'):
 
194
            url = url[len('readonly+'):]
 
195
        if (not url.startswith("git://") and 
 
196
            not url.startswith("git+")):
 
197
            raise bzr_errors.NotBranchError(transport.base)
156
198
        from bzrlib.plugins.git.remote import RemoteGitDir, GitSmartTransport
157
199
        if not isinstance(transport, GitSmartTransport):
158
200
            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
201
        from bzrlib.plugins.git.dir import GitLockableFiles, GitLock
165
202
        lockfiles = GitLockableFiles(transport, GitLock())
166
203
        return RemoteGitDir(transport, lockfiles, self)
168
205
    @classmethod
169
206
    def probe_transport(klass, transport):
170
207
        """Our format is present if the transport ends in '.not/'."""
 
208
        url = transport.base
 
209
        if url.startswith('readonly+'):
 
210
            url = url[len('readonly+'):]
 
211
        if (not url.startswith("git://") and 
 
212
            not url.startswith("git+")):
 
213
            raise bzr_errors.NotBranchError(transport.base)
171
214
        # little ugly, but works
172
215
        format = klass()
173
216
        from bzrlib.plugins.git.remote import GitSmartTransport
174
217
        if not isinstance(transport, GitSmartTransport):
175
218
            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)
 
219
        return format
186
220
 
187
221
    def get_format_description(self):
188
222
        return "Remote Git Repository"
197
231
bzrdir.BzrDirFormat.register_control_format(LocalGitBzrDirFormat)
198
232
bzrdir.BzrDirFormat.register_control_format(RemoteGitBzrDirFormat)
199
233
 
 
234
register_transport_proto('git://', 
 
235
        help="Access using the Git smart server protocol.")
 
236
register_transport_proto('git+ssh://', 
 
237
        help="Access using the Git smart server protocol over SSH.")
 
238
 
200
239
register_lazy_transport("git://", 'bzrlib.plugins.git.remote',
201
 
                        'GitSmartTransport')
 
240
                        'TCPGitSmartTransport')
 
241
register_lazy_transport("git+ssh://", 'bzrlib.plugins.git.remote',
 
242
                        'SSHGitSmartTransport')
202
243
 
203
244
foreign_vcs_registry.register_lazy("git", 
204
 
                        "bzrlib.plugins.git.mapping", 
205
 
                        "foreign_git",
206
 
                        "Stupid content tracker")
 
245
    "bzrlib.plugins.git.mapping", "foreign_git", "Stupid content tracker")
207
246
 
208
 
plugin_cmds.register_lazy("cmd_git_serve", [], "bzrlib.plugins.git.commands")
209
247
plugin_cmds.register_lazy("cmd_git_import", [], "bzrlib.plugins.git.commands")
 
248
plugin_cmds.register_lazy("cmd_git_object", ["git-objects", "git-cat"], 
 
249
    "bzrlib.plugins.git.commands")
 
250
 
 
251
def update_stanza(rev, stanza):
 
252
    mapping = getattr(rev, "mapping", None)
 
253
    if mapping is not None and mapping.revid_prefix.startswith("git-"):
 
254
        stanza.add("git-commit", rev.foreign_revid)
 
255
 
 
256
 
 
257
rio_hooks = getattr(RioVersionInfoBuilder, "hooks", None)
 
258
if rio_hooks is not None:
 
259
    rio_hooks.install_named_hook('revision', update_stanza, None)
 
260
 
 
261
 
 
262
try:
 
263
    from bzrlib.transport import transport_server_registry
 
264
except ImportError:
 
265
    pass
 
266
else:
 
267
    transport_server_registry.register_lazy('git',
 
268
        'bzrlib.plugins.git.server', 
 
269
        'serve_git',
 
270
        'Git Smart server protocol over TCP. (default port: 9418)')
 
271
 
 
272
 
 
273
from bzrlib.repository import network_format_registry as repository_network_format_registry
 
274
repository_network_format_registry.register_lazy('git', 
 
275
    'bzrlib.plugins.git.repository', 'GitRepositoryFormat')
 
276
 
 
277
from bzrlib.bzrdir import network_format_registry as bzrdir_network_format_registry
 
278
bzrdir_network_format_registry.register('git', GitBzrDirFormat)
 
279
 
 
280
 
 
281
def get_rich_root_format(stacked=False):
 
282
    if stacked:
 
283
        return bzrdir.format_registry.make_bzrdir("1.9-rich-root")
 
284
    else:
 
285
        return bzrdir.format_registry.make_bzrdir("default-rich-root")
210
286
 
211
287
def test_suite():
212
288
    from bzrlib.plugins.git import tests