/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.358.2 by Jelmer Vernooij
Refresh copyright headers, add my email.
1
# Copyright (C) 2008-2018 Jelmer Vernooij <jelmer@jelmer.uk>
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
2
# Copyright (C) 2008 John Carr
0.200.1613 by Jelmer Vernooij
Handle encoding better in working tree iter changes.
3
# Copyright (C) 2008-2011 Canonical Ltd
0.217.1 by John Carr
Start stubbing out rewritten git-serve
4
#
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
9
#
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
# GNU General Public License for more details.
14
#
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
0.358.1 by Jelmer Vernooij
Fix FSF address.
17
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0.217.1 by John Carr
Start stubbing out rewritten git-serve
18
0.200.1594 by Jelmer Vernooij
Use absolute_import everywhere.
19
from __future__ import absolute_import
20
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
21
from dulwich.server import TCPGitServer
22
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
23
import sys
24
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
25
from .. import (
0.200.1497 by Jelmer Vernooij
Fix inetd handle.
26
    errors,
27
    trace,
28
    )
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
29
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
30
from ..controldir import (
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
31
    ControlDir,
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
32
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
33
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
34
from .mapping import (
0.200.292 by Jelmer Vernooij
Fix formatting.
35
    default_mapping,
7490.70.1 by Jelmer Vernooij
Add functions for encoding/decoding git paths.
36
    decode_git_path,
0.200.292 by Jelmer Vernooij
Fix formatting.
37
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
38
from .object_store import (
6997.3.1 by Jelmer Vernooij
Fix 'brz git --serve' for native git repositories.
39
    BazaarObjectStore,
0.200.1433 by Jelmer Vernooij
Fix fetching between git repositories.
40
    get_object_store,
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
41
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
42
from .refs import (
0.200.1433 by Jelmer Vernooij
Fix fetching between git repositories.
43
    get_refs_container,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
44
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
45
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
46
from dulwich.protocol import Protocol
0.200.292 by Jelmer Vernooij
Fix formatting.
47
from dulwich.server import (
48
    Backend,
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
49
    BackendRepo,
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
50
    ReceivePackHandler,
51
    UploadPackHandler,
0.200.292 by Jelmer Vernooij
Fix formatting.
52
    )
0.217.32 by John Carr
Dirtyness to help pass tests
53
7143.15.2 by Jelmer Vernooij
Run autopep8.
54
0.217.1 by John Carr
Start stubbing out rewritten git-serve
55
class BzrBackend(Backend):
0.200.828 by Jelmer Vernooij
Fix formatting.
56
    """A git serve backend that can use a Bazaar repository."""
0.217.1 by John Carr
Start stubbing out rewritten git-serve
57
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
58
    def __init__(self, transport):
59
        self.transport = transport
0.217.7 by John Carr
Create tips
60
        self.mapping = default_mapping
0.217.2 by John Carr
Fix missing imports. Update TCPGitServer instantiation to latest. BzrBackend needs to know which directory its repo is in.
61
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
62
    def open_repository(self, path):
0.249.1 by Jelmer Vernooij
More work on server side.
63
        # FIXME: More secure path sanitization
7490.70.1 by Jelmer Vernooij
Add functions for encoding/decoding git paths.
64
        transport = self.transport.clone(decode_git_path(path).lstrip("/"))
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
65
        trace.mutter('client opens %r: %r', path, transport)
66
        return BzrBackendRepo(transport, self.mapping)
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
67
68
69
class BzrBackendRepo(BackendRepo):
70
71
    def __init__(self, transport, mapping):
72
        self.mapping = mapping
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
73
        self.repo_dir = ControlDir.open_from_transport(transport)
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
74
        self.repo = self.repo_dir.find_repository()
75
        self.object_store = get_object_store(self.repo)
0.200.1433 by Jelmer Vernooij
Fix fetching between git repositories.
76
        self.refs = get_refs_container(self.repo_dir, self.object_store)
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
77
78
    def get_refs(self):
0.200.1788 by Jelmer Vernooij
Use context managers.
79
        with self.object_store.lock_read():
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
80
            return self.refs.as_dict()
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
81
0.200.862 by Jelmer Vernooij
Fix locking.
82
    def get_peeled(self, name):
0.200.1487 by Jelmer Vernooij
Use peeling.
83
        cached = self.refs.get_peeled(name)
84
        if cached is not None:
85
            return cached
86
        return self.object_store.peel_sha(self.refs[name]).id
0.200.862 by Jelmer Vernooij
Fix locking.
87
88
    def fetch_objects(self, determine_wants, graph_walker, progress,
7143.15.2 by Jelmer Vernooij
Run autopep8.
89
                      get_tagged=None):
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
90
        """Yield git objects to send to client """
0.200.1788 by Jelmer Vernooij
Use context managers.
91
        with self.object_store.lock_read():
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
92
            wants = determine_wants(self.get_refs())
0.200.862 by Jelmer Vernooij
Fix locking.
93
            have = self.object_store.find_common_revisions(graph_walker)
0.271.4 by Jelmer Vernooij
Cope with determine_wants returning None.
94
            if wants is None:
95
                return
7490.26.1 by Jelmer Vernooij
Fix shallow handling in Git.
96
            shallows = getattr(graph_walker, 'shallow', frozenset())
6997.3.1 by Jelmer Vernooij
Fix 'brz git --serve' for native git repositories.
97
            if isinstance(self.object_store, BazaarObjectStore):
7143.15.3 by Jelmer Vernooij
Fix pep8 issues in breezy.git.
98
                return self.object_store.generate_pack_contents(
7490.26.1 by Jelmer Vernooij
Fix shallow handling in Git.
99
                    have, wants, shallow=shallows,
100
                    progress=progress, get_tagged=get_tagged, lossy=True)
6997.3.1 by Jelmer Vernooij
Fix 'brz git --serve' for native git repositories.
101
            else:
7490.26.1 by Jelmer Vernooij
Fix shallow handling in Git.
102
                if shallows:
103
                    return self.object_store.generate_pack_contents(
104
                        have, wants, shallow=shallows, progress=progress)
105
                else:
106
                    return self.object_store.generate_pack_contents(
107
                        have, wants, progress=progress)
108
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
109
0.200.1437 by Jelmer Vernooij
Add bzr-git tcp server class, for better logging.
110
class BzrTCPGitServer(TCPGitServer):
111
112
    def handle_error(self, request, client_address):
113
        trace.log_exception_quietly()
114
        trace.warning('Exception happened during processing of request '
115
                      'from %s', client_address)
116
117
0.200.1611 by Jelmer Vernooij
Support optional new timeout argument to serve_git.
118
def serve_git(transport, host=None, port=None, inet=False, timeout=None):
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
119
    backend = BzrBackend(transport)
120
0.248.1 by David Coles
Use host specified, not localhost
121
    if host is None:
0.248.2 by Jelmer Vernooij
Still default to localhost, update NEWS
122
        host = 'localhost'
0.248.1 by David Coles
Use host specified, not localhost
123
    if port:
0.200.1437 by Jelmer Vernooij
Add bzr-git tcp server class, for better logging.
124
        server = BzrTCPGitServer(backend, host, port)
0.248.1 by David Coles
Use host specified, not localhost
125
    else:
0.200.1437 by Jelmer Vernooij
Add bzr-git tcp server class, for better logging.
126
        server = BzrTCPGitServer(backend, host)
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
127
    server.serve_forever()
0.271.5 by Jelmer Vernooij
Hook into loggerhead.
128
129
130
def git_http_hook(branch, method, path):
131
    from dulwich.web import HTTPGitApplication, HTTPGitRequest, DEFAULT_HANDLERS
132
    handler = None
133
    for (smethod, spath) in HTTPGitApplication.services:
134
        if smethod != method:
135
            continue
136
        mat = spath.search(path)
137
        if mat:
138
            handler = HTTPGitApplication.services[smethod, spath]
139
            break
140
    if handler is None:
141
        return None
142
    backend = BzrBackend(branch.user_transport)
7143.15.2 by Jelmer Vernooij
Run autopep8.
143
0.271.5 by Jelmer Vernooij
Hook into loggerhead.
144
    def git_call(environ, start_response):
145
        req = HTTPGitRequest(environ, start_response, dumb=False,
146
                             handlers=DEFAULT_HANDLERS)
147
        return handler(req, backend, mat)
148
    return git_call
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
149
150
151
def serve_command(handler_cls, backend, inf=sys.stdin, outf=sys.stdout):
152
    """Serve a single command.
153
154
    This is mostly useful for the implementation of commands used by e.g. git+ssh.
155
156
    :param handler_cls: `Handler` class to use for the request
157
    :param argv: execv-style command-line arguments. Defaults to sys.argv.
158
    :param backend: `Backend` to use
159
    :param inf: File-like object to read from, defaults to standard input.
160
    :param outf: File-like object to write to, defaults to standard output.
161
    :return: Exit code for use with sys.exit. 0 on success, 1 on failure.
162
    """
163
    def send_fn(data):
164
        outf.write(data)
165
        outf.flush()
166
    proto = Protocol(inf.read, send_fn)
167
    handler = handler_cls(backend, ["/"], proto)
168
    # FIXME: Catch exceptions and write a single-line summary to outf.
169
    handler.handle()
170
    return 0
171
172
173
def serve_git_receive_pack(transport, host=None, port=None, inet=False):
0.200.1497 by Jelmer Vernooij
Fix inetd handle.
174
    if not inet:
7490.61.1 by Jelmer Vernooij
Rename BzrCommandError to CommandError.
175
        raise errors.CommandError(
0.200.1497 by Jelmer Vernooij
Fix inetd handle.
176
            "git-receive-pack only works in inetd mode")
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
177
    backend = BzrBackend(transport)
178
    sys.exit(serve_command(ReceivePackHandler, backend=backend))
179
180
181
def serve_git_upload_pack(transport, host=None, port=None, inet=False):
0.200.1497 by Jelmer Vernooij
Fix inetd handle.
182
    if not inet:
7490.61.1 by Jelmer Vernooij
Rename BzrCommandError to CommandError.
183
        raise errors.CommandError(
0.200.1497 by Jelmer Vernooij
Fix inetd handle.
184
            "git-receive-pack only works in inetd mode")
0.200.1496 by Jelmer Vernooij
Provide --git-receive-pack and --git-upload-pack options for 'bzr serve'.
185
    backend = BzrBackend(transport)
186
    sys.exit(serve_command(UploadPackHandler, backend=backend))