/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-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

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
 
 
30
 
from info import (
31
 
    bzr_compatible_versions,
32
 
    bzr_plugin_version as version_info,
33
 
    dulwich_minimum_version,
34
 
    )
35
 
 
36
 
if version_info[3] == 'final':
37
 
    version_string = '%d.%d.%d' % version_info[:3]
38
 
else:
39
 
    version_string = '%d.%d.%d%s%d' % version_info
40
 
__version__ = version_string
41
 
 
42
 
bzrlib.api.require_any_api(bzrlib, bzr_compatible_versions)
43
 
 
44
 
 
45
 
from bzrlib import (
46
 
    errors as bzr_errors,
47
 
    )
48
 
 
49
 
from bzrlib.controldir import (
50
 
    ControlDirFormat,
51
 
    Prober,
52
 
    format_registry,
53
 
    network_format_registry as controldir_network_format_registry,
54
 
    )
55
 
 
56
 
from bzrlib.foreign import (
57
 
    foreign_vcs_registry,
58
 
    )
59
 
from bzrlib.help_topics import (
60
 
    topic_registry,
61
 
    )
62
 
from bzrlib.transport import (
63
 
    register_lazy_transport,
64
 
    register_transport_proto,
65
 
    )
66
 
from bzrlib.commands import (
67
 
    plugin_cmds,
68
 
    )
69
 
from bzrlib.send import (
70
 
    format_registry as send_format_registry,
71
 
    )
72
 
 
73
 
 
74
 
if getattr(sys, "frozen", None):
75
 
    # allow import additional libs from ./_lib for bzr.exe only
76
 
    sys.path.append(os.path.normpath(
77
 
        os.path.join(os.path.dirname(__file__), '_lib')))
78
 
 
79
 
 
80
 
def import_dulwich():
81
 
    try:
82
 
        from dulwich import __version__ as dulwich_version
83
 
    except ImportError:
84
 
        raise bzr_errors.DependencyNotPresent("dulwich",
85
 
            "bzr-git: Please install dulwich, https://launchpad.net/dulwich")
86
 
    else:
87
 
        if dulwich_version < dulwich_minimum_version:
88
 
            raise bzr_errors.DependencyNotPresent("dulwich",
89
 
                "bzr-git: Dulwich is too old; at least %d.%d.%d is required" %
90
 
                    dulwich_minimum_version)
91
 
 
92
 
 
93
 
_versions_checked = False
94
 
def lazy_check_versions():
95
 
    global _versions_checked
96
 
    if _versions_checked:
97
 
        return
98
 
    import_dulwich()
99
 
    _versions_checked = True
100
 
 
101
 
format_registry.register_lazy('git',
102
 
    "bzrlib.plugins.git.dir", "LocalGitControlDirFormat",
103
 
    help='GIT repository.', native=False, experimental=False,
104
 
    )
105
 
 
106
 
format_registry.register_lazy('git-bare',
107
 
    "bzrlib.plugins.git.dir", "BareLocalGitControlDirFormat",
108
 
    help='Bare GIT repository (no working tree).', native=False,
109
 
    experimental=False,
110
 
    )
111
 
 
112
 
from bzrlib.revisionspec import revspec_registry
113
 
revspec_registry.register_lazy("git:", "bzrlib.plugins.git.revspec",
114
 
    "RevisionSpec_git")
115
 
 
116
 
from bzrlib.revisionspec import dwim_revspecs, RevisionSpec_dwim
117
 
if getattr(RevisionSpec_dwim, "append_possible_lazy_revspec", None):
118
 
    RevisionSpec_dwim.append_possible_lazy_revspec(
119
 
        "bzrlib.plugins.git.revspec", "RevisionSpec_git")
120
 
else: # bzr < 2.4
121
 
    from bzrlib.plugins.git.revspec import RevisionSpec_git
122
 
    dwim_revspecs.append(RevisionSpec_git)
123
 
 
124
 
 
125
 
class LocalGitProber(Prober):
126
 
 
127
 
    def probe_transport(self, transport):
128
 
        try:
129
 
            if not transport.has_any(['info/refs', '.git/HEAD', 'HEAD', 'objects', '.git/objects']):
130
 
                raise bzr_errors.NotBranchError(path=transport.base)
131
 
        except bzr_errors.NoSuchFile:
132
 
            raise bzr_errors.NotBranchError(path=transport.base)
133
 
        from bzrlib import urlutils
134
 
        if urlutils.split(transport.base)[1] == ".git":
135
 
            raise bzr_errors.NotBranchError(path=transport.base)
136
 
        lazy_check_versions()
137
 
        import dulwich
138
 
        from bzrlib.plugins.git.transportgit import TransportRepo
139
 
        try:
140
 
            gitrepo = TransportRepo(transport)
141
 
        except dulwich.errors.NotGitRepository, e:
142
 
            raise bzr_errors.NotBranchError(path=transport.base)
143
 
        else:
144
 
            from bzrlib.plugins.git.dir import (
145
 
                BareLocalGitControlDirFormat,
146
 
                LocalGitControlDirFormat,
147
 
                )
148
 
            if gitrepo.bare:
149
 
                return BareLocalGitControlDirFormat()
150
 
            else:
151
 
                return LocalGitControlDirFormat()
152
 
 
153
 
    @classmethod
154
 
    def known_formats(cls):
155
 
        from bzrlib.plugins.git.dir import (
156
 
            BareLocalGitControlDirFormat,
157
 
            LocalGitControlDirFormat,
158
 
            )
159
 
        return set([BareLocalGitControlDirFormat(), LocalGitControlDirFormat()])
160
 
 
161
 
 
162
 
class RemoteGitProber(Prober):
163
 
 
164
 
    def probe_transport(self, transport):
165
 
        url = transport.base
166
 
        if url.startswith('readonly+'):
167
 
            url = url[len('readonly+'):]
168
 
        if (not url.startswith("git://") and not url.startswith("git+")):
169
 
            raise bzr_errors.NotBranchError(transport.base)
170
 
        # little ugly, but works
171
 
        from bzrlib.plugins.git.remote import (
172
 
            GitSmartTransport,
173
 
            RemoteGitControlDirFormat,
174
 
            )
175
 
        if not isinstance(transport, GitSmartTransport):
176
 
            raise bzr_errors.NotBranchError(transport.base)
177
 
        return RemoteGitControlDirFormat()
178
 
 
179
 
    @classmethod
180
 
    def known_formats(cls):
181
 
        from bzrlib.plugins.git.remote import RemoteGitControlDirFormat
182
 
        return set([RemoteGitControlDirFormat()])
183
 
 
184
 
 
185
 
if not getattr(Prober, "known_formats", None): # bzr < 2.4
186
 
    from bzrlib.plugins.git.dir import (
187
 
        LocalGitControlDirFormat, BareLocalGitControlDirFormat,
188
 
        )
189
 
    from bzrlib.plugins.git.remote import RemoteGitControlDirFormat
190
 
    ControlDirFormat.register_format(LocalGitControlDirFormat())
191
 
    ControlDirFormat.register_format(BareLocalGitControlDirFormat())
192
 
    ControlDirFormat.register_format(RemoteGitControlDirFormat())
193
 
    # Provide RevisionTree.get_file_revision, so various parts of bzr-svn
194
 
    # can avoid inventories.
195
 
    from bzrlib.revisiontree import RevisionTree
196
 
    def get_file_revision(tree, file_id, path=None):
197
 
        return tree.inventory[file_id].revision
198
 
    RevisionTree.get_file_revision = get_file_revision
199
 
 
200
 
ControlDirFormat.register_prober(LocalGitProber)
201
 
ControlDirFormat.register_prober(RemoteGitProber)
202
 
 
203
 
register_transport_proto('git://',
204
 
        help="Access using the Git smart server protocol.")
205
 
register_transport_proto('git+ssh://',
206
 
        help="Access using the Git smart server protocol over SSH.")
207
 
 
208
 
register_lazy_transport("git://", 'bzrlib.plugins.git.remote',
209
 
                        'TCPGitSmartTransport')
210
 
register_lazy_transport("git+ssh://", 'bzrlib.plugins.git.remote',
211
 
                        'SSHGitSmartTransport')
212
 
 
213
 
foreign_vcs_registry.register_lazy("git",
214
 
    "bzrlib.plugins.git.mapping", "foreign_vcs_git", "Stupid content tracker")
215
 
 
216
 
plugin_cmds.register_lazy("cmd_git_import", [], "bzrlib.plugins.git.commands")
217
 
plugin_cmds.register_lazy("cmd_git_object", ["git-objects", "git-cat"],
218
 
    "bzrlib.plugins.git.commands")
219
 
plugin_cmds.register_lazy("cmd_git_refs", [], "bzrlib.plugins.git.commands")
220
 
plugin_cmds.register_lazy("cmd_git_apply", [], "bzrlib.plugins.git.commands")
221
 
 
222
 
def extract_git_foreign_revid(rev):
223
 
    try:
224
 
        foreign_revid = rev.foreign_revid
225
 
    except AttributeError:
226
 
        from bzrlib.plugins.git.mapping import mapping_registry
227
 
        foreign_revid, mapping = \
228
 
            mapping_registry.parse_revision_id(rev.revision_id)
229
 
        return foreign_revid
230
 
    else:
231
 
        from bzrlib.plugins.git.mapping import foreign_vcs_git
232
 
        if rev.mapping.vcs == foreign_vcs_git:
233
 
            return foreign_revid
234
 
        else:
235
 
            raise bzr_errors.InvalidRevisionId(rev.revision_id, None)
236
 
 
237
 
 
238
 
def update_stanza(rev, stanza):
239
 
    mapping = getattr(rev, "mapping", None)
240
 
    try:
241
 
        git_commit = extract_git_foreign_revid(rev)
242
 
    except bzr_errors.InvalidRevisionId:
243
 
        pass
244
 
    else:
245
 
        stanza.add("git-commit", git_commit)
246
 
 
247
 
try:
248
 
    from bzrlib.hooks import install_lazy_named_hook
249
 
except ImportError: # Compatibility with bzr < 2.4
250
 
    from bzrlib.version_info_formats.format_rio import (
251
 
        RioVersionInfoBuilder,
252
 
        )
253
 
    RioVersionInfoBuilder.hooks.install_named_hook('revision', update_stanza,
254
 
        "git commits")
255
 
else:
256
 
    install_lazy_named_hook("bzrlib.version_info_formats.format_rio",
257
 
        "RioVersionInfoBuilder.hooks", "revision", update_stanza,
258
 
        "git commits")
259
 
 
260
 
 
261
 
from bzrlib.transport import transport_server_registry
262
 
transport_server_registry.register_lazy('git',
263
 
    'bzrlib.plugins.git.server',
264
 
    'serve_git',
265
 
    'Git Smart server protocol over TCP. (default port: 9418)')
266
 
 
267
 
 
268
 
from bzrlib.repository import (
269
 
    format_registry as repository_format_registry,
270
 
    network_format_registry as repository_network_format_registry,
271
 
    )
272
 
repository_network_format_registry.register_lazy('git',
273
 
    'bzrlib.plugins.git.repository', 'GitRepositoryFormat')
274
 
 
275
 
try:
276
 
    register_extra_lazy_repository_format = getattr(repository_format_registry,
277
 
        "register_extra_lazy")
278
 
except AttributeError: # bzr < 2.4
279
 
    pass
280
 
else:
281
 
    register_extra_lazy_repository_format('bzrlib.plugins.git.repository',
282
 
        'GitRepositoryFormat')
283
 
 
284
 
from bzrlib.branch import (
285
 
    network_format_registry as branch_network_format_registry,
286
 
    )
287
 
branch_network_format_registry.register_lazy('git',
288
 
    'bzrlib.plugins.git.branch', 'GitBranchFormat')
289
 
 
290
 
try:
291
 
    from bzrlib.branch import (
292
 
        format_registry as branch_format_registry,
293
 
        )
294
 
except ImportError: # bzr < 2.4
295
 
    pass
296
 
else:
297
 
    branch_format_registry.register_extra_lazy(
298
 
        'bzrlib.plugins.git.branch',
299
 
        'GitBranchFormat',
300
 
        )
301
 
 
302
 
try:
303
 
    from bzrlib.workingtree import (
304
 
        format_registry as workingtree_format_registry,
305
 
        )
306
 
except ImportError: # bzr < 2.4
307
 
    pass
308
 
else:
309
 
    workingtree_format_registry.register_extra_lazy(
310
 
        'bzrlib.plugins.git.workingtree',
311
 
        'GitWorkingTreeFormat',
312
 
        )
313
 
 
314
 
controldir_network_format_registry.register_lazy('git',
315
 
    "bzrlib.plugins.git.dir", "GitControlDirFormat")
316
 
 
317
 
send_format_registry.register_lazy('git', 'bzrlib.plugins.git.send',
318
 
                                   'send_git', 'Git am-style diff format')
319
 
 
320
 
topic_registry.register_lazy('git', 'bzrlib.plugins.git.help', 'help_git',
321
 
    'Using Bazaar with Git')
322
 
 
323
 
from bzrlib.diff import format_registry as diff_format_registry
324
 
diff_format_registry.register_lazy('git', 'bzrlib.plugins.git.send',
325
 
    'GitDiffTree', 'Git am-style diff format')
326
 
 
327
 
 
328
 
def update_git_cache(repository, revid):
329
 
    """Update the git cache after a local commit."""
330
 
    if getattr(repository, "_git", None) is not None:
331
 
        return # No need to update cache for git repositories
332
 
 
333
 
    from bzrlib.plugins.git.object_store import BazaarObjectStore
334
 
    if not repository.control_transport.has("git"):
335
 
        return # No existing cache, don't bother updating
336
 
    store = BazaarObjectStore(repository)
337
 
    store.lock_write()
338
 
    try:
339
 
        parent_revisions = set(repository.get_parent_map([revid])[revid])
340
 
        missing_revisions = store._missing_revisions(parent_revisions)
341
 
        if not missing_revisions:
342
 
            # Only update if the cache was up to date previously
343
 
            store._update_sha_map_revision(revid)
344
 
    finally:
345
 
        store.unlock()
346
 
 
347
 
 
348
 
def post_commit_update_cache(local_branch, master_branch, old_revno, old_revid,
349
 
        new_revno, new_revid):
350
 
    if local_branch is not None:
351
 
        update_git_cache(local_branch.repository, new_revid)
352
 
    update_git_cache(master_branch.repository, new_revid)
353
 
 
354
 
 
355
 
try:
356
 
    from bzrlib.hooks import install_lazy_named_hook
357
 
except ImportError: # Compatibility with bzr < 2.4
358
 
    pass
359
 
else:
360
 
    install_lazy_named_hook("bzrlib.branch",
361
 
        "Branch.hooks", "post_commit", post_commit_update_cache,
362
 
        "git cache")
363
 
 
364
 
 
365
 
def test_suite():
366
 
    from bzrlib.plugins.git import tests
367
 
    return tests.test_suite()