/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.200.1528 by Jelmer Vernooij
Use absolute_import in __init__.
24
from __future__ import absolute_import
25
0.224.1 by Alexander Belchenko
bzr.exe support: allow import of dulwich from _lib subdirectory
26
import os
27
import sys
28
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
29
import breezy
0.200.519 by Jelmer Vernooij
Move imports down, might not be available in older bzr-git versions.
30
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
31
from .info import (
0.200.583 by Jelmer Vernooij
Add plugin api info.
32
    bzr_compatible_versions,
33
    bzr_plugin_version as version_info,
34
    dulwich_minimum_version,
35
    )
0.200.519 by Jelmer Vernooij
Move imports down, might not be available in older bzr-git versions.
36
37
if version_info[3] == 'final':
38
    version_string = '%d.%d.%d' % version_info[:3]
39
else:
40
    version_string = '%d.%d.%d%s%d' % version_info
41
__version__ = version_string
42
0.200.1647 by Jelmer Vernooij
Drop api support.
43
if breezy.version_info[:3] not in bzr_compatible_versions:
44
    from ...errors import IncompatibleVersion
45
    raise IncompatibleVersion(breezy,
46
            bzr_compatible_versions, breezy.version_info[:3])
0.200.519 by Jelmer Vernooij
Move imports down, might not be available in older bzr-git versions.
47
0.200.1406 by Jelmer Vernooij
Import gettext.
48
try:
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
49
    from ...i18n import load_plugin_translations
0.200.1406 by Jelmer Vernooij
Import gettext.
50
except ImportError: # No translations for bzr < 2.5
51
    gettext = lambda x: x
52
else:
53
    translation = load_plugin_translations("bzr-git")
54
    gettext = translation.gettext
0.200.519 by Jelmer Vernooij
Move imports down, might not be available in older bzr-git versions.
55
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
56
from ... import (
0.200.292 by Jelmer Vernooij
Fix formatting.
57
    errors as bzr_errors,
0.200.1384 by Jelmer Vernooij
Skip post commit hook when dulwich is not installed.
58
    trace,
0.200.292 by Jelmer Vernooij
Fix formatting.
59
    )
0.200.1111 by Jelmer Vernooij
Drop support for Bazaar < 2.3.
60
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
61
from ...controldir import (
0.200.1111 by Jelmer Vernooij
Drop support for Bazaar < 2.3.
62
    ControlDirFormat,
63
    Prober,
64
    format_registry,
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
65
    network_format_registry as controldir_network_format_registry,
0.200.1111 by Jelmer Vernooij
Drop support for Bazaar < 2.3.
66
    )
0.200.1012 by Jelmer Vernooij
Rename BzrDir to ControlDir.
67
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
68
from ...transport import (
0.200.292 by Jelmer Vernooij
Fix formatting.
69
    register_lazy_transport,
0.200.308 by Jelmer Vernooij
Register git protocols.
70
    register_transport_proto,
0.276.1 by Jelmer Vernooij
Use register_lazy.
71
    transport_server_registry,
0.200.292 by Jelmer Vernooij
Fix formatting.
72
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
73
from ...commands import (
0.200.292 by Jelmer Vernooij
Fix formatting.
74
    plugin_cmds,
75
    )
0.200.341 by Jelmer Vernooij
Add stanza with git commit info in 'bzr version-info'
76
0.200.192 by Jelmer Vernooij
use system-provided dulwich, remove own copy.
77
0.224.1 by Alexander Belchenko
bzr.exe support: allow import of dulwich from _lib subdirectory
78
if getattr(sys, "frozen", None):
79
    # allow import additional libs from ./_lib for bzr.exe only
0.200.926 by Jelmer Vernooij
Fix formatting, drop support for Bazaar < 2.0.
80
    sys.path.append(os.path.normpath(
81
        os.path.join(os.path.dirname(__file__), '_lib')))
0.224.1 by Alexander Belchenko
bzr.exe support: allow import of dulwich from _lib subdirectory
82
0.200.987 by Jelmer Vernooij
Add DulwichFeature.
83
84
def import_dulwich():
0.200.200 by Jelmer Vernooij
Register lazily where possible.
85
    try:
86
        from dulwich import __version__ as dulwich_version
87
    except ImportError:
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
88
        raise bzr_errors.DependencyNotPresent("dulwich",
89
            "bzr-git: Please install dulwich, https://launchpad.net/dulwich")
0.200.200 by Jelmer Vernooij
Register lazily where possible.
90
    else:
0.200.583 by Jelmer Vernooij
Add plugin api info.
91
        if dulwich_version < dulwich_minimum_version:
0.200.926 by Jelmer Vernooij
Fix formatting, drop support for Bazaar < 2.0.
92
            raise bzr_errors.DependencyNotPresent("dulwich",
93
                "bzr-git: Dulwich is too old; at least %d.%d.%d is required" %
94
                    dulwich_minimum_version)
0.200.199 by Jelmer Vernooij
Check for bzrlib API version.
95
0.200.987 by Jelmer Vernooij
Add DulwichFeature.
96
97
_versions_checked = False
98
def lazy_check_versions():
99
    global _versions_checked
100
    if _versions_checked:
101
        return
102
    import_dulwich()
103
    _versions_checked = True
104
0.200.1012 by Jelmer Vernooij
Rename BzrDir to ControlDir.
105
format_registry.register_lazy('git',
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
106
    __name__ + ".dir", "LocalGitControlDirFormat",
0.200.1018 by Jelmer Vernooij
Fix use with new control dir API.
107
    help='GIT repository.', native=False, experimental=False,
0.200.200 by Jelmer Vernooij
Register lazily where possible.
108
    )
0.200.204 by Jelmer Vernooij
Support bzr 1.11.
109
0.200.1032 by Jelmer Vernooij
Support bare repositories.
110
format_registry.register_lazy('git-bare',
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
111
    __name__ + ".dir", "BareLocalGitControlDirFormat",
0.200.1032 by Jelmer Vernooij
Support bare repositories.
112
    help='Bare GIT repository (no working tree).', native=False,
113
    experimental=False,
114
    )
115
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
116
from ...revisionspec import (RevisionSpec_dwim, revspec_registry)
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
117
revspec_registry.register_lazy("git:", __name__ + ".revspec",
0.200.292 by Jelmer Vernooij
Fix formatting.
118
    "RevisionSpec_git")
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
119
RevisionSpec_dwim.append_possible_lazy_revspec(
0.200.1649 by Jelmer Vernooij
Fix imports.
120
    __name__ + ".revspec", "RevisionSpec_git")
0.200.645 by Jelmer Vernooij
Support DWIM git: revspecs.
121
0.200.328 by Jelmer Vernooij
Support stacking, depend on bzr 1.15.
122
0.200.1014 by Jelmer Vernooij
Fix tests.
123
class LocalGitProber(Prober):
124
125
    def probe_transport(self, transport):
0.200.720 by Jelmer Vernooij
Avoid loading bzr-git/dulwich when not necessary.
126
        try:
0.268.1 by Jelmer Vernooij
Fix probing of http repositories when pycurl is used.
127
            external_url = transport.external_url()
128
        except bzr_errors.InProcessTransport:
129
            raise bzr_errors.NotBranchError(path=transport.base)
130
        if (external_url.startswith("http:") or
131
            external_url.startswith("https:")):
132
            # Already handled by RemoteGitProber
133
            raise bzr_errors.NotBranchError(path=transport.base)
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
134
        from ... import urlutils
0.200.730 by Jelmer Vernooij
Don't claim control directories can be accessed directly, always open the
135
        if urlutils.split(transport.base)[1] == ".git":
136
            raise bzr_errors.NotBranchError(path=transport.base)
0.200.1387 by Jelmer Vernooij
Avoid using HEAD.
137
        if not transport.has_any(['objects', '.git/objects']):
138
            raise bzr_errors.NotBranchError(path=transport.base)
0.239.13 by Jelmer Vernooij
Don't break "bzr info -v" when Dulwich is not installed.
139
        lazy_check_versions()
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
140
        from .dir import (
0.200.1387 by Jelmer Vernooij
Avoid using HEAD.
141
            BareLocalGitControlDirFormat,
142
            LocalGitControlDirFormat,
143
            )
144
        if transport.has_any(['.git/objects']):
145
            return LocalGitControlDirFormat()
146
        if transport.has('info') and transport.has('objects'):
147
            return BareLocalGitControlDirFormat()
0.200.1399 by Jelmer Vernooij
In prober, always return or raise NotBranchError.
148
        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.
149
0.200.1139 by Jelmer Vernooij
Prober.known_formats is a class method.
150
    @classmethod
151
    def known_formats(cls):
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
152
        from .dir import (
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
153
            BareLocalGitControlDirFormat,
154
            LocalGitControlDirFormat,
155
            )
156
        return set([BareLocalGitControlDirFormat(), LocalGitControlDirFormat()])
0.200.1032 by Jelmer Vernooij
Support bare repositories.
157
158
0.200.1014 by Jelmer Vernooij
Fix tests.
159
class RemoteGitProber(Prober):
160
0.200.1334 by Jelmer Vernooij
Detect smart servers.
161
    def probe_http_transport(self, transport):
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
162
        from ... import urlutils
0.200.1554 by Jelmer Vernooij
Fix probing over http with colocated branches.
163
        base_url, _ = urlutils.split_segment_parameters(transport.external_url())
164
        url = urlutils.join(base_url, "info/refs") + "?service=git-upload-pack"
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
165
        from ...transport.http._urllib import HttpTransport_urllib, Request
0.200.1334 by Jelmer Vernooij
Detect smart servers.
166
        if isinstance(transport, HttpTransport_urllib):
167
            req = Request('GET', url, accepted_errors=[200, 403, 404, 405],
168
                          headers={"Content-Type": "application/x-git-upload-pack-request"})
169
            req.follow_redirections = True
170
            resp = transport._perform(req)
0.200.1471 by Jelmer Vernooij
ignore 405 replies when probing.
171
            if resp.code in (404, 405):
0.200.1334 by Jelmer Vernooij
Detect smart servers.
172
                raise bzr_errors.NotBranchError(transport.base)
173
            headers = resp.headers
0.200.1485 by Jelmer Vernooij
Keep track of refs text when opening bare repository.
174
            refs_text = resp.read()
0.200.1334 by Jelmer Vernooij
Detect smart servers.
175
        else:
176
            try:
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
177
                from ...transport.http._pycurl import PyCurlTransport
0.200.1334 by Jelmer Vernooij
Detect smart servers.
178
            except bzr_errors.DependencyNotPresent:
179
                raise bzr_errors.NotBranchError(transport.base)
180
            else:
181
                import pycurl
182
                from cStringIO import StringIO
183
                if isinstance(transport, PyCurlTransport):
184
                    conn = transport._get_curl()
185
                    conn.setopt(pycurl.URL, url)
0.200.1445 by Jelmer Vernooij
Follow redirects for pycurl, too.
186
                    conn.setopt(pycurl.FOLLOWLOCATION, 1)
0.200.1334 by Jelmer Vernooij
Detect smart servers.
187
                    transport._set_curl_options(conn)
188
                    conn.setopt(pycurl.HTTPGET, 1)
189
                    header = StringIO()
190
                    data = StringIO()
191
                    conn.setopt(pycurl.HEADERFUNCTION, header.write)
192
                    conn.setopt(pycurl.WRITEFUNCTION, data.write)
193
                    transport._curl_perform(conn, header,
194
                        ["Content-Type: application/x-git-upload-pack-request"])
195
                    code = conn.getinfo(pycurl.HTTP_CODE)
0.200.1471 by Jelmer Vernooij
ignore 405 replies when probing.
196
                    if code in (404, 405):
0.200.1334 by Jelmer Vernooij
Detect smart servers.
197
                        raise bzr_errors.NotBranchError(transport.base)
0.268.1 by Jelmer Vernooij
Fix probing of http repositories when pycurl is used.
198
                    if code != 200:
199
                        raise bzr_errors.InvalidHttpResponse(transport._path,
200
                            str(code))
0.200.1334 by Jelmer Vernooij
Detect smart servers.
201
                    headers = transport._parse_headers(header)
202
                else:
203
                    raise bzr_errors.NotBranchError(transport.base)
0.200.1485 by Jelmer Vernooij
Keep track of refs text when opening bare repository.
204
                refs_text = data.getvalue()
0.200.1334 by Jelmer Vernooij
Detect smart servers.
205
        ct = headers.getheader("Content-Type")
0.200.1405 by Jelmer Vernooij
Add i18n support.
206
        if ct is None:
207
            raise bzr_errors.NotBranchError(transport.base)
0.200.1334 by Jelmer Vernooij
Detect smart servers.
208
        if ct.startswith("application/x-git"):
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
209
            from .remote import RemoteGitControlDirFormat
0.200.1334 by Jelmer Vernooij
Detect smart servers.
210
            return RemoteGitControlDirFormat()
211
        else:
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
212
            from .dir import (
0.200.1334 by Jelmer Vernooij
Detect smart servers.
213
                BareLocalGitControlDirFormat,
214
                )
0.200.1485 by Jelmer Vernooij
Keep track of refs text when opening bare repository.
215
            ret = BareLocalGitControlDirFormat()
216
            ret._refs_text = refs_text
217
            return ret
0.200.1334 by Jelmer Vernooij
Detect smart servers.
218
0.200.1014 by Jelmer Vernooij
Fix tests.
219
    def probe_transport(self, transport):
0.200.1334 by Jelmer Vernooij
Detect smart servers.
220
        try:
221
            external_url = transport.external_url()
222
        except bzr_errors.InProcessTransport:
223
            raise bzr_errors.NotBranchError(path=transport.base)
224
225
        if (external_url.startswith("http:") or
226
            external_url.startswith("https:")):
227
            return self.probe_http_transport(transport)
228
229
        if (not external_url.startswith("git://") and
230
            not external_url.startswith("git+")):
0.200.1014 by Jelmer Vernooij
Fix tests.
231
            raise bzr_errors.NotBranchError(transport.base)
0.200.1334 by Jelmer Vernooij
Detect smart servers.
232
0.200.1014 by Jelmer Vernooij
Fix tests.
233
        # little ugly, but works
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
234
        from .remote import (
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
235
            GitSmartTransport,
236
            RemoteGitControlDirFormat,
237
            )
0.200.1334 by Jelmer Vernooij
Detect smart servers.
238
        if isinstance(transport, GitSmartTransport):
239
            return RemoteGitControlDirFormat()
240
        raise bzr_errors.NotBranchError(path=transport.base)
0.200.1014 by Jelmer Vernooij
Fix tests.
241
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
242
    @classmethod
0.200.1139 by Jelmer Vernooij
Prober.known_formats is a class method.
243
    def known_formats(cls):
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
244
        from .remote import RemoteGitControlDirFormat
0.200.1012 by Jelmer Vernooij
Rename BzrDir to ControlDir.
245
        return set([RemoteGitControlDirFormat()])
0.200.201 by Jelmer Vernooij
Try to import nothing other than __init__ when not opening git repositories.
246
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
247
0.200.1111 by Jelmer Vernooij
Drop support for Bazaar < 2.3.
248
ControlDirFormat.register_prober(LocalGitProber)
0.200.1556 by Jelmer Vernooij
Add 'github:' directory service.
249
ControlDirFormat._server_probers.append(RemoteGitProber)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
250
0.200.674 by Jelmer Vernooij
Fix formatting.
251
register_transport_proto('git://',
0.200.308 by Jelmer Vernooij
Register git protocols.
252
        help="Access using the Git smart server protocol.")
0.200.674 by Jelmer Vernooij
Fix formatting.
253
register_transport_proto('git+ssh://',
0.200.308 by Jelmer Vernooij
Register git protocols.
254
        help="Access using the Git smart server protocol over SSH.")
255
0.200.1645 by Jelmer Vernooij
Use __name__.
256
register_lazy_transport("git://", __name__ + '.remote',
0.200.307 by Jelmer Vernooij
Support git+ssh.
257
                        'TCPGitSmartTransport')
0.200.1645 by Jelmer Vernooij
Use __name__.
258
register_lazy_transport("git+ssh://", __name__ + '.remote',
0.200.307 by Jelmer Vernooij
Support git+ssh.
259
                        'SSHGitSmartTransport')
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
260
0.208.5 by Jelmer Vernooij
Add log show function for git.
261
0.200.1645 by Jelmer Vernooij
Use __name__.
262
plugin_cmds.register_lazy("cmd_git_import", [], __name__ + ".commands")
0.200.674 by Jelmer Vernooij
Fix formatting.
263
plugin_cmds.register_lazy("cmd_git_object", ["git-objects", "git-cat"],
0.200.1645 by Jelmer Vernooij
Use __name__.
264
    __name__ + ".commands")
265
plugin_cmds.register_lazy("cmd_git_refs", [], __name__ + ".commands")
266
plugin_cmds.register_lazy("cmd_git_apply", [], __name__ + ".commands")
0.277.6 by Jelmer Vernooij
Add 'bzr git-push-pristine-tar' command.
267
plugin_cmds.register_lazy("cmd_git_push_pristine_tar_deltas",
268
        ['git-push-pristine-tar', 'git-push-pristine'],
0.200.1645 by Jelmer Vernooij
Use __name__.
269
    __name__ + ".commands")
0.200.177 by Jelmer Vernooij
Add git-import command.
270
0.200.1262 by Jelmer Vernooij
Add extract git foreign revid.
271
def extract_git_foreign_revid(rev):
272
    try:
273
        foreign_revid = rev.foreign_revid
274
    except AttributeError:
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
275
        from .mapping import mapping_registry
0.200.1262 by Jelmer Vernooij
Add extract git foreign revid.
276
        foreign_revid, mapping = \
277
            mapping_registry.parse_revision_id(rev.revision_id)
278
        return foreign_revid
279
    else:
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
280
        from .mapping import foreign_vcs_git
0.200.1262 by Jelmer Vernooij
Add extract git foreign revid.
281
        if rev.mapping.vcs == foreign_vcs_git:
282
            return foreign_revid
283
        else:
284
            raise bzr_errors.InvalidRevisionId(rev.revision_id, None)
285
286
0.200.341 by Jelmer Vernooij
Add stanza with git commit info in 'bzr version-info'
287
def update_stanza(rev, stanza):
288
    mapping = getattr(rev, "mapping", None)
0.200.1262 by Jelmer Vernooij
Add extract git foreign revid.
289
    try:
290
        git_commit = extract_git_foreign_revid(rev)
291
    except bzr_errors.InvalidRevisionId:
292
        pass
293
    else:
294
        stanza.add("git-commit", git_commit)
0.200.341 by Jelmer Vernooij
Add stanza with git commit info in 'bzr version-info'
295
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
296
from ...hooks import install_lazy_named_hook
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
297
install_lazy_named_hook("breezy.version_info_formats.format_rio",
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
298
    "RioVersionInfoBuilder.hooks", "revision", update_stanza,
299
    "git commits")
0.200.341 by Jelmer Vernooij
Add stanza with git commit info in 'bzr version-info'
300
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
301
0.239.6 by Jelmer Vernooij
Remove pre-1.15 incompatible code.
302
transport_server_registry.register_lazy('git',
0.200.1645 by Jelmer Vernooij
Use __name__.
303
    __name__ + '.server',
0.239.6 by Jelmer Vernooij
Remove pre-1.15 incompatible code.
304
    'serve_git',
305
    'Git Smart server protocol over TCP. (default port: 9418)')
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
306
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
307
transport_server_registry.register_lazy('git-receive-pack',
0.200.1645 by Jelmer Vernooij
Use __name__.
308
    __name__ + '.server',
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
309
    'serve_git_receive_pack',
0.200.1595 by Jelmer Vernooij
Fix formatting of option names.
310
    help='Git Smart server receive pack command. (inetd mode only)')
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
311
transport_server_registry.register_lazy('git-upload-pack',
0.200.1645 by Jelmer Vernooij
Use __name__.
312
    __name__ + 'git.server',
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
313
    'serve_git_upload_pack',
0.200.1595 by Jelmer Vernooij
Fix formatting of option names.
314
    help='Git Smart server upload pack command. (inetd mode only)')
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
315
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
316
from ...repository import (
0.200.1083 by Jelmer Vernooij
Register repository format.
317
    format_registry as repository_format_registry,
0.200.926 by Jelmer Vernooij
Fix formatting, drop support for Bazaar < 2.0.
318
    network_format_registry as repository_network_format_registry,
319
    )
0.200.674 by Jelmer Vernooij
Fix formatting.
320
repository_network_format_registry.register_lazy('git',
0.200.1645 by Jelmer Vernooij
Use __name__.
321
    __name__ + '.repository', 'GitRepositoryFormat')
0.200.536 by Jelmer Vernooij
Implement network name.
322
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
323
register_extra_lazy_repository_format = getattr(repository_format_registry,
324
    "register_extra_lazy")
0.200.1645 by Jelmer Vernooij
Use __name__.
325
register_extra_lazy_repository_format(__name__ + '.repository',
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
326
    'GitRepositoryFormat')
0.200.1083 by Jelmer Vernooij
Register repository format.
327
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
328
from ...branch import (
0.200.1127 by Jelmer Vernooij
Register branch format network name.
329
    network_format_registry as branch_network_format_registry,
330
    )
331
branch_network_format_registry.register_lazy('git',
0.200.1645 by Jelmer Vernooij
Use __name__.
332
    __name__ + '.branch', 'GitBranchFormat')
0.200.1127 by Jelmer Vernooij
Register branch format network name.
333
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
334
from ...branch import (
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
335
    format_registry as branch_format_registry,
336
    )
337
branch_format_registry.register_extra_lazy(
0.200.1645 by Jelmer Vernooij
Use __name__.
338
    __name__ + '.branch',
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
339
    'GitBranchFormat',
340
    )
0.200.1090 by Jelmer Vernooij
Register branch format for testing.
341
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
342
from ...workingtree import (
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
343
    format_registry as workingtree_format_registry,
344
    )
345
workingtree_format_registry.register_extra_lazy(
0.200.1645 by Jelmer Vernooij
Use __name__.
346
    __name__ + '.workingtree',
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
347
    'GitWorkingTreeFormat',
348
    )
0.200.1093 by Jelmer Vernooij
Register working tree format for testing.
349
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
350
controldir_network_format_registry.register_lazy('git',
0.200.1645 by Jelmer Vernooij
Use __name__.
351
    __name__ + ".dir", "GitControlDirFormat")
0.200.536 by Jelmer Vernooij
Implement network name.
352
0.276.1 by Jelmer Vernooij
Use register_lazy.
353
354
try:
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
355
    from ...registry import register_lazy
0.276.1 by Jelmer Vernooij
Use register_lazy.
356
except ImportError:
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
357
    from ...diff import format_registry as diff_format_registry
0.200.1645 by Jelmer Vernooij
Use __name__.
358
    diff_format_registry.register_lazy('git', __name__ + '.send',
0.276.1 by Jelmer Vernooij
Use register_lazy.
359
        'GitDiffTree', 'Git am-style diff format')
360
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
361
    from ...send import (
0.276.1 by Jelmer Vernooij
Use register_lazy.
362
        format_registry as send_format_registry,
363
        )
0.200.1645 by Jelmer Vernooij
Use __name__.
364
    send_format_registry.register_lazy('git', __name__ + '.send',
0.276.1 by Jelmer Vernooij
Use register_lazy.
365
                                       'send_git', 'Git am-style diff format')
366
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
367
    from ...directory_service import directories
0.200.1645 by Jelmer Vernooij
Use __name__.
368
    directories.register_lazy('github:', __name__ + '.directory',
0.276.1 by Jelmer Vernooij
Use register_lazy.
369
                              'GitHubDirectory',
370
                              'GitHub directory.')
0.200.1645 by Jelmer Vernooij
Use __name__.
371
    directories.register_lazy('git@github.com:', __name__ + '.directory',
0.276.1 by Jelmer Vernooij
Use register_lazy.
372
                              'GitHubDirectory',
373
                              'GitHub directory.')
374
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
375
    from ...help_topics import (
0.276.1 by Jelmer Vernooij
Use register_lazy.
376
        topic_registry,
377
        )
0.200.1645 by Jelmer Vernooij
Use __name__.
378
    topic_registry.register_lazy('git', __name__ + '.help', 'help_git',
0.276.1 by Jelmer Vernooij
Use register_lazy.
379
        'Using Bazaar with Git')
380
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
381
    from ...foreign import (
0.276.1 by Jelmer Vernooij
Use register_lazy.
382
        foreign_vcs_registry,
383
        )
384
    foreign_vcs_registry.register_lazy("git",
0.200.1645 by Jelmer Vernooij
Use __name__.
385
        __name__ + ".mapping", "foreign_vcs_git", "Stupid content tracker")
0.276.1 by Jelmer Vernooij
Use register_lazy.
386
else:
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
387
    register_lazy("breezy.diff", "format_registry",
0.200.1645 by Jelmer Vernooij
Use __name__.
388
        'git', __name__ + '.send', 'GitDiffTree',
0.276.1 by Jelmer Vernooij
Use register_lazy.
389
        'Git am-style diff format')
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
390
    register_lazy("breezy.send", "format_registry",
0.200.1645 by Jelmer Vernooij
Use __name__.
391
        'git', __name__ + '.send', 'send_git',
0.276.1 by Jelmer Vernooij
Use register_lazy.
392
        'Git am-style diff format')
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
393
    register_lazy('breezy.directory_service', 'directories', 'github:',
0.200.1645 by Jelmer Vernooij
Use __name__.
394
            __name__ + '.directory', 'GitHubDirectory',
0.276.1 by Jelmer Vernooij
Use register_lazy.
395
            'GitHub directory.')
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
396
    register_lazy('breezy.directory_service', 'directories',
0.200.1649 by Jelmer Vernooij
Fix imports.
397
            'git@github.com:', __name__ + '.directory',
0.276.1 by Jelmer Vernooij
Use register_lazy.
398
            'GitHubDirectory', 'GitHub directory.')
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
399
    register_lazy('breezy.help_topics', 'topic_registry',
0.200.1645 by Jelmer Vernooij
Use __name__.
400
            'git', __name__ + '.help', 'help_git',
0.276.1 by Jelmer Vernooij
Use register_lazy.
401
            'Using Bazaar with Git')
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
402
    register_lazy('breezy.foreign', 'foreign_vcs_registry', "git",
0.200.1645 by Jelmer Vernooij
Use __name__.
403
        __name__ + ".mapping", "foreign_vcs_git", "Stupid content tracker")
0.200.1291 by Jelmer Vernooij
add hook for updating to local git cache.
404
405
def update_git_cache(repository, revid):
406
    """Update the git cache after a local commit."""
407
    if getattr(repository, "_git", None) is not None:
408
        return # No need to update cache for git repositories
409
410
    if not repository.control_transport.has("git"):
411
        return # No existing cache, don't bother updating
0.200.1384 by Jelmer Vernooij
Skip post commit hook when dulwich is not installed.
412
    try:
413
        lazy_check_versions()
414
    except bzr_errors.DependencyNotPresent, e:
415
        # dulwich is probably missing. silently ignore
416
        trace.mutter("not updating git map for %r: %s",
417
            repository, e)
418
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
419
    from .object_store import BazaarObjectStore
0.200.1291 by Jelmer Vernooij
add hook for updating to local git cache.
420
    store = BazaarObjectStore(repository)
421
    store.lock_write()
422
    try:
0.200.1583 by Jelmer Vernooij
Use config stacks.
423
        try:
424
            parent_revisions = set(repository.get_parent_map([revid])[revid])
425
        except KeyError:
426
            # Isn't this a bit odd - how can a revision that was just committed be missing?
427
            return
0.200.1319 by Jelmer Vernooij
Only update git cache during post-commit if parents are already in the cache.
428
        missing_revisions = store._missing_revisions(parent_revisions)
429
        if not missing_revisions:
430
            # Only update if the cache was up to date previously
431
            store._update_sha_map_revision(revid)
0.200.1291 by Jelmer Vernooij
add hook for updating to local git cache.
432
    finally:
433
        store.unlock()
434
435
436
def post_commit_update_cache(local_branch, master_branch, old_revno, old_revid,
437
        new_revno, new_revid):
438
    if local_branch is not None:
439
        update_git_cache(local_branch.repository, new_revid)
440
    update_git_cache(master_branch.repository, new_revid)
441
442
0.271.5 by Jelmer Vernooij
Hook into loggerhead.
443
def loggerhead_git_hook(branch_app, environ):
444
    branch = branch_app.branch
0.200.1583 by Jelmer Vernooij
Use config stacks.
445
    config_stack = branch.get_config_stack()
446
    if config_stack.get('http_git'):
0.271.5 by Jelmer Vernooij
Hook into loggerhead.
447
        return None
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
448
    from .server import git_http_hook
0.271.5 by Jelmer Vernooij
Hook into loggerhead.
449
    return git_http_hook(branch, environ['REQUEST_METHOD'],
450
        environ['PATH_INFO'])
451
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
452
install_lazy_named_hook("breezy.branch",
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
453
    "Branch.hooks", "post_commit", post_commit_update_cache,
454
    "git cache")
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
455
install_lazy_named_hook("breezy.plugins.loggerhead.apps.branch",
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
456
    "BranchWSGIApp.hooks", "controller",
457
    loggerhead_git_hook, "git support")
0.200.1291 by Jelmer Vernooij
add hook for updating to local git cache.
458
459
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
460
from ...config import (
0.200.1583 by Jelmer Vernooij
Use config stacks.
461
    option_registry,
462
    Option,
463
    bool_from_store,
464
    )
465
466
option_registry.register(
467
    Option('git.http',
468
           default=None, from_unicode=bool_from_store, invalid='warning',
469
           help='''\
470
Allow fetching of Git packs over HTTP.
471
472
This enables support for fetching Git packs over HTTP in Loggerhead.
473
'''))
474
0.201.1 by Jelmer Vernooij
Add very small initial testsuite.
475
def test_suite():
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
476
    from . import tests
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
477
    return tests.test_suite()