/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

  • Committer: Robert Collins
  • Date: 2010-05-05 00:05:29 UTC
  • mto: This revision was merged to the branch mainline in revision 5206.
  • Revision ID: robertc@robertcollins.net-20100505000529-ltmllyms5watqj5u
Make 'pydoc bzrlib.tests.build_tree_shape' useful.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2009 Canonical Ltd
2
 
 
3
 
# Authors: Robert Collins <robert.collins@canonical.com>
4
 
#          Jelmer Vernooij <jelmer@samba.org>
5
 
#          John Carr <john.carr@unrouted.co.uk>
6
 
#
7
 
# This program is free software; you can redistribute it and/or modify
8
 
# it under the terms of the GNU General Public License as published by
9
 
# the Free Software Foundation; either version 2 of the License, or
10
 
# (at your option) any later version.
11
 
#
12
 
# This program is distributed in the hope that it will be useful,
13
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 
# GNU General Public License for more details.
16
 
#
17
 
# You should have received a copy of the GNU General Public License
18
 
# along with this program; if not, write to the Free Software
19
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
 
 
21
 
 
22
 
"""A GIT branch and repository format implementation for bzr."""
23
 
 
24
 
import os
25
 
import sys
26
 
 
27
 
import bzrlib
28
 
import bzrlib.api
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, 2, 2, '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, 2, 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')))
72
 
 
73
 
_versions_checked = False
74
 
def lazy_check_versions():
75
 
    global _versions_checked
76
 
    if _versions_checked:
77
 
        return
78
 
    _versions_checked = True
79
 
    try:
80
 
        from dulwich import __version__ as dulwich_version
81
 
    except ImportError:
82
 
        raise ImportError("bzr-git: Please install dulwich, https://launchpad.net/dulwich")
83
 
    else:
84
 
        if dulwich_version < MINIMUM_DULWICH_VERSION:
85
 
            raise ImportError("bzr-git: Dulwich is too old; at least %d.%d.%d is required" % MINIMUM_DULWICH_VERSION)
86
 
 
87
 
bzrlib.api.require_any_api(bzrlib, COMPATIBLE_BZR_VERSIONS)
88
 
 
89
 
bzrdir.format_registry.register_lazy('git', 
90
 
    "bzrlib.plugins.git.dir", "LocalGitBzrDirFormat",
91
 
    help='GIT repository.', native=False, experimental=True,
92
 
    )
93
 
 
94
 
from bzrlib.revisionspec import revspec_registry
95
 
revspec_registry.register_lazy("git:", "bzrlib.plugins.git.revspec", 
96
 
    "RevisionSpec_git")
97
 
 
98
 
 
99
 
class GitBzrDirFormat(bzrdir.BzrDirFormat):
100
 
    _lock_class = TransportLock
101
 
 
102
 
    def is_supported(self):
103
 
        return True
104
 
 
105
 
 
106
 
class LocalGitBzrDirFormat(GitBzrDirFormat):
107
 
    """The .git directory control format."""
108
 
 
109
 
    @classmethod
110
 
    def _known_formats(self):
111
 
        return set([LocalGitBzrDirFormat()])
112
 
 
113
 
    def open(self, transport, _found=None):
114
 
        """Open this directory.
115
 
 
116
 
        """
117
 
        import dulwich as git
118
 
        # we dont grok readonly - git isn't integrated with transport.
119
 
        url = transport.base
120
 
        if url.startswith('readonly+'):
121
 
            url = url[len('readonly+'):]
122
 
 
123
 
        try:
124
 
            gitrepo = git.repo.Repo(transport.local_abspath(".").encode(osutils._fs_enc))
125
 
        except bzr_errors.NotLocalUrl:
126
 
            raise bzr_errors.NotBranchError(path=transport.base)
127
 
        from bzrlib.plugins.git.dir import LocalGitDir, GitLockableFiles, GitLock
128
 
        lockfiles = GitLockableFiles(transport, GitLock())
129
 
        return LocalGitDir(transport, lockfiles, gitrepo, self)
130
 
 
131
 
    @classmethod
132
 
    def probe_transport(klass, transport):
133
 
        """Our format is present if the transport ends in '.not/'."""
134
 
        from bzrlib.transport.local import LocalTransport
135
 
 
136
 
        if not isinstance(transport, LocalTransport):
137
 
            raise bzr_errors.NotBranchError(path=transport.base)
138
 
 
139
 
        # This should quickly filter out most things that are not 
140
 
        # git repositories, saving us the trouble from loading dulwich.
141
 
        if not transport.has(".git") and not transport.has("objects"):
142
 
            raise bzr_errors.NotBranchError(path=transport.base)
143
 
 
144
 
        import dulwich as git
145
 
        format = klass()
146
 
        try:
147
 
            format.open(transport)
148
 
            return format
149
 
        except git.errors.NotGitRepository, e:
150
 
            raise bzr_errors.NotBranchError(path=transport.base)
151
 
        raise bzr_errors.NotBranchError(path=transport.base)
152
 
 
153
 
    def get_format_description(self):
154
 
        return "Local Git Repository"
155
 
 
156
 
    def get_format_string(self):
157
 
        return "Local Git Repository"
158
 
 
159
 
    def initialize_on_transport(self, transport):
160
 
        from bzrlib.transport.local import LocalTransport
161
 
 
162
 
        if not isinstance(transport, LocalTransport):
163
 
            raise NotImplementedError(self.initialize, 
164
 
                "Can't create Git Repositories/branches on "
165
 
                "non-local transports")
166
 
 
167
 
        from dulwich.repo import Repo
168
 
        Repo.create(transport.local_abspath(".").encode(osutils._fs_enc)) 
169
 
        return self.open(transport)
170
 
 
171
 
    def is_supported(self):
172
 
        return True
173
 
 
174
 
 
175
 
class RemoteGitBzrDirFormat(GitBzrDirFormat):
176
 
    """The .git directory control format."""
177
 
 
178
 
    @classmethod
179
 
    def _known_formats(self):
180
 
        return set([RemoteGitBzrDirFormat()])
181
 
 
182
 
    def open(self, transport, _found=None):
183
 
        """Open this directory.
184
 
 
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)
193
 
        from bzrlib.plugins.git.remote import RemoteGitDir, GitSmartTransport
194
 
        if not isinstance(transport, GitSmartTransport):
195
 
            raise bzr_errors.NotBranchError(transport.base)
196
 
        from bzrlib.plugins.git.dir import GitLockableFiles, GitLock
197
 
        lockfiles = GitLockableFiles(transport, GitLock())
198
 
        return RemoteGitDir(transport, lockfiles, self)
199
 
 
200
 
    @classmethod
201
 
    def probe_transport(klass, transport):
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)
209
 
        # little ugly, but works
210
 
        format = klass()
211
 
        from bzrlib.plugins.git.remote import GitSmartTransport
212
 
        if not isinstance(transport, GitSmartTransport):
213
 
            raise bzr_errors.NotBranchError(transport.base)
214
 
        # The only way to know a path exists and contains a valid repository 
215
 
        # is to do a request against it:
216
 
        try:
217
 
            transport.fetch_pack(lambda x: [], None, lambda x: None, 
218
 
                                 lambda x: mutter("git: %s" % x))
219
 
        except errors.git_errors.GitProtocolError:
220
 
            raise bzr_errors.NotBranchError(path=transport.base)
221
 
        else:
222
 
            return format
223
 
        raise bzr_errors.NotBranchError(path=transport.base)
224
 
 
225
 
    def get_format_description(self):
226
 
        return "Remote Git Repository"
227
 
 
228
 
    def get_format_string(self):
229
 
        return "Remote Git Repository"
230
 
 
231
 
    def initialize_on_transport(self, transport):
232
 
        raise bzr_errors.UninitializableFormat(self)
233
 
 
234
 
 
235
 
bzrdir.BzrDirFormat.register_control_format(LocalGitBzrDirFormat)
236
 
bzrdir.BzrDirFormat.register_control_format(RemoteGitBzrDirFormat)
237
 
 
238
 
register_transport_proto('git://', 
239
 
        help="Access using the Git smart server protocol.")
240
 
register_transport_proto('git+ssh://', 
241
 
        help="Access using the Git smart server protocol over SSH.")
242
 
 
243
 
register_lazy_transport("git://", 'bzrlib.plugins.git.remote',
244
 
                        'TCPGitSmartTransport')
245
 
register_lazy_transport("git+ssh://", 'bzrlib.plugins.git.remote',
246
 
                        'SSHGitSmartTransport')
247
 
 
248
 
foreign_vcs_registry.register_lazy("git", 
249
 
    "bzrlib.plugins.git.mapping", "foreign_git", "Stupid content tracker")
250
 
 
251
 
plugin_cmds.register_lazy("cmd_git_serve", [], "bzrlib.plugins.git.commands")
252
 
plugin_cmds.register_lazy("cmd_git_import", [], "bzrlib.plugins.git.commands")
253
 
plugin_cmds.register_lazy("cmd_git_object", ["git-objects", "git-cat"], 
254
 
    "bzrlib.plugins.git.commands")
255
 
 
256
 
def update_stanza(rev, stanza):
257
 
    mapping = getattr(rev, "mapping", None)
258
 
    if mapping is not None and mapping.revid_prefix.startswith("git-"):
259
 
        stanza.add("git-commit", rev.foreign_revid)
260
 
 
261
 
 
262
 
rio_hooks = getattr(RioVersionInfoBuilder, "hooks", None)
263
 
if rio_hooks is not None:
264
 
    rio_hooks.install_named_hook('revision', update_stanza, None)
265
 
 
266
 
def get_rich_root_format(stacked=False):
267
 
    if stacked:
268
 
        return bzrdir.format_registry.make_bzrdir("1.9-rich-root")
269
 
    else:
270
 
        return bzrdir.format_registry.make_bzrdir("default-rich-root")
271
 
 
272
 
def test_suite():
273
 
    from bzrlib.plugins.git import tests
274
 
    return tests.test_suite()