/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.235 by Jelmer Vernooij
Depend on newer dulwich.
1
# Copyright (C) 2006-2009 Canonical Ltd
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
2
0.200.1 by Robert Collins
Commit initial content.
3
# Authors: Robert Collins <robert.collins@canonical.com>
0.200.184 by Jelmer Vernooij
Update authors: line.
4
#          Jelmer Vernooij <jelmer@samba.org>
5
#          John Carr <john.carr@unrouted.co.uk>
0.200.1 by Robert Collins
Commit initial content.
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
0.224.1 by Alexander Belchenko
bzr.exe support: allow import of dulwich from _lib subdirectory
24
import os
25
import sys
26
0.200.199 by Jelmer Vernooij
Check for bzrlib API version.
27
import bzrlib
28
import bzrlib.api
0.200.292 by Jelmer Vernooij
Fix formatting.
29
from bzrlib import (
30
    bzrdir,
31
    errors as bzr_errors,
0.200.370 by Jelmer Vernooij
Specify plain string path to Dulwich.
32
    osutils,
0.200.292 by Jelmer Vernooij
Fix formatting.
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,
0.200.308 by Jelmer Vernooij
Register git protocols.
42
    register_transport_proto,
0.200.292 by Jelmer Vernooij
Fix formatting.
43
    )
44
from bzrlib.commands import (
45
    plugin_cmds,
46
    )
47
from bzrlib.trace import (
48
    warning,
49
    )
0.200.341 by Jelmer Vernooij
Add stanza with git commit info in 'bzr version-info'
50
from bzrlib.version_info_formats.format_rio import (
51
    RioVersionInfoBuilder,
52
    )
53
0.200.192 by Jelmer Vernooij
use system-provided dulwich, remove own copy.
54
0.200.263 by Jelmer Vernooij
Start working on 0.2.0.
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)
0.200.413 by Jelmer Vernooij
Start on 0.2.2
58
version_info = (0, 2, 2, 'dev', 0)
0.200.263 by Jelmer Vernooij
Start working on 0.2.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
0.200.440 by Jelmer Vernooij
Remove silly mapping of timezones; dulwich uses offsets now as well.
66
MINIMUM_DULWICH_VERSION = (0, 2, 2)
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
67
COMPATIBLE_BZR_VERSIONS = [(1, 14, 0), (1, 15, 0)]
0.200.192 by Jelmer Vernooij
use system-provided dulwich, remove own copy.
68
0.224.1 by Alexander Belchenko
bzr.exe support: allow import of dulwich from _lib subdirectory
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
0.200.200 by Jelmer Vernooij
Register lazily where possible.
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:
0.200.215 by Jelmer Vernooij
Merge improvements for running with bzr.exe.
82
        raise ImportError("bzr-git: Please install dulwich, https://launchpad.net/dulwich")
0.200.200 by Jelmer Vernooij
Register lazily where possible.
83
    else:
84
        if dulwich_version < MINIMUM_DULWICH_VERSION:
0.200.215 by Jelmer Vernooij
Merge improvements for running with bzr.exe.
85
            raise ImportError("bzr-git: Dulwich is too old; at least %d.%d.%d is required" % MINIMUM_DULWICH_VERSION)
0.200.199 by Jelmer Vernooij
Check for bzrlib API version.
86
87
bzrlib.api.require_any_api(bzrlib, COMPATIBLE_BZR_VERSIONS)
88
0.200.200 by Jelmer Vernooij
Register lazily where possible.
89
bzrdir.format_registry.register_lazy('git', 
90
    "bzrlib.plugins.git.dir", "LocalGitBzrDirFormat",
91
    help='GIT repository.', native=False, experimental=True,
92
    )
0.200.204 by Jelmer Vernooij
Support bzr 1.11.
93
0.200.292 by Jelmer Vernooij
Fix formatting.
94
from bzrlib.revisionspec import revspec_registry
95
revspec_registry.register_lazy("git:", "bzrlib.plugins.git.revspec", 
96
    "RevisionSpec_git")
0.200.200 by Jelmer Vernooij
Register lazily where possible.
97
0.200.328 by Jelmer Vernooij
Support stacking, depend on bzr 1.15.
98
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
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:
0.200.370 by Jelmer Vernooij
Specify plain string path to Dulwich.
124
            gitrepo = git.repo.Repo(transport.local_abspath(".").encode(osutils._fs_enc))
0.200.203 by Jelmer Vernooij
Fix imports.
125
        except bzr_errors.NotLocalUrl:
126
            raise bzr_errors.NotBranchError(path=transport.base)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
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):
0.200.203 by Jelmer Vernooij
Fix imports.
137
            raise bzr_errors.NotBranchError(path=transport.base)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
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"):
0.200.203 by Jelmer Vernooij
Fix imports.
142
            raise bzr_errors.NotBranchError(path=transport.base)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
143
144
        import dulwich as git
145
        format = klass()
146
        try:
147
            format.open(transport)
148
            return format
149
        except git.errors.NotGitRepository, e:
0.200.203 by Jelmer Vernooij
Fix imports.
150
            raise bzr_errors.NotBranchError(path=transport.base)
151
        raise bzr_errors.NotBranchError(path=transport.base)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
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
0.200.370 by Jelmer Vernooij
Specify plain string path to Dulwich.
168
        Repo.create(transport.local_abspath(".").encode(osutils._fs_enc)) 
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
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
        """
0.200.321 by Jelmer Vernooij
Make remote repository access a bit lazier.
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)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
193
        from bzrlib.plugins.git.remote import RemoteGitDir, GitSmartTransport
194
        if not isinstance(transport, GitSmartTransport):
0.200.203 by Jelmer Vernooij
Fix imports.
195
            raise bzr_errors.NotBranchError(transport.base)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
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/'."""
0.200.321 by Jelmer Vernooij
Make remote repository access a bit lazier.
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)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
209
        # little ugly, but works
210
        format = klass()
211
        from bzrlib.plugins.git.remote import GitSmartTransport
212
        if not isinstance(transport, GitSmartTransport):
0.200.203 by Jelmer Vernooij
Fix imports.
213
            raise bzr_errors.NotBranchError(transport.base)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
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:
0.200.203 by Jelmer Vernooij
Fix imports.
220
            raise bzr_errors.NotBranchError(path=transport.base)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
221
        else:
222
            return format
0.200.203 by Jelmer Vernooij
Fix imports.
223
        raise bzr_errors.NotBranchError(path=transport.base)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
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):
0.200.203 by Jelmer Vernooij
Fix imports.
232
        raise bzr_errors.UninitializableFormat(self)
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
233
234
235
bzrdir.BzrDirFormat.register_control_format(LocalGitBzrDirFormat)
236
bzrdir.BzrDirFormat.register_control_format(RemoteGitBzrDirFormat)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
237
0.200.308 by Jelmer Vernooij
Register git protocols.
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
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
243
register_lazy_transport("git://", 'bzrlib.plugins.git.remote',
0.200.307 by Jelmer Vernooij
Support git+ssh.
244
                        'TCPGitSmartTransport')
245
register_lazy_transport("git+ssh://", 'bzrlib.plugins.git.remote',
246
                        'SSHGitSmartTransport')
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
247
0.200.195 by Jelmer Vernooij
Return mapping in revision_id_bzr_to_foreign() as required by the interface.
248
foreign_vcs_registry.register_lazy("git", 
0.200.328 by Jelmer Vernooij
Support stacking, depend on bzr 1.15.
249
    "bzrlib.plugins.git.mapping", "foreign_git", "Stupid content tracker")
0.208.5 by Jelmer Vernooij
Add log show function for git.
250
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
251
plugin_cmds.register_lazy("cmd_git_serve", [], "bzrlib.plugins.git.commands")
252
plugin_cmds.register_lazy("cmd_git_import", [], "bzrlib.plugins.git.commands")
0.200.422 by Jelmer Vernooij
'bzr git-object' without arguments now prints the available git objects.
253
plugin_cmds.register_lazy("cmd_git_object", ["git-objects", "git-cat"], 
254
    "bzrlib.plugins.git.commands")
0.200.177 by Jelmer Vernooij
Add git-import command.
255
0.200.341 by Jelmer Vernooij
Add stanza with git commit info in 'bzr version-info'
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
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
262
rio_hooks = getattr(RioVersionInfoBuilder, "hooks", None)
263
if rio_hooks is not None:
264
    rio_hooks.install_named_hook('revision', update_stanza, None)
0.200.341 by Jelmer Vernooij
Add stanza with git commit info in 'bzr version-info'
265
0.200.328 by Jelmer Vernooij
Support stacking, depend on bzr 1.15.
266
def get_rich_root_format(stacked=False):
267
    if stacked:
268
        return bzrdir.format_registry.make_bzrdir("1.9-rich-root")
269
    else:
0.200.266 by Jelmer Vernooij
Use default-rich-root if possible.
270
        return bzrdir.format_registry.make_bzrdir("default-rich-root")
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
271
0.201.1 by Jelmer Vernooij
Add very small initial testsuite.
272
def test_suite():
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
273
    from bzrlib.plugins.git import tests
274
    return tests.test_suite()