/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
1
# Copyright (C) 2008 Jelmer Vernooij
2
# Copyright (C) 2008 John Carr
0.217.1 by John Carr
Start stubbing out rewritten git-serve
3
# Copyright (C) 2008 Canonical Ltd
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
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
19
from dulwich.server import TCPGitServer
20
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
21
from bzrlib import trace
22
0.200.495 by Jelmer Vernooij
Fix import.
23
from bzrlib.bzrdir import (
24
    BzrDir,
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
25
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
26
27
from bzrlib.plugins.git.mapping import (
28
    default_mapping,
29
    )
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
30
from bzrlib.plugins.git.object_store import (
0.200.1433 by Jelmer Vernooij
Fix fetching between git repositories.
31
    get_object_store,
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
32
    )
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
33
from bzrlib.plugins.git.refs import (
0.200.1433 by Jelmer Vernooij
Fix fetching between git repositories.
34
    get_refs_container,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
35
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
36
37
from dulwich.server import (
38
    Backend,
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
39
    BackendRepo,
0.200.292 by Jelmer Vernooij
Fix formatting.
40
    )
0.217.32 by John Carr
Dirtyness to help pass tests
41
0.217.1 by John Carr
Start stubbing out rewritten git-serve
42
class BzrBackend(Backend):
0.200.828 by Jelmer Vernooij
Fix formatting.
43
    """A git serve backend that can use a Bazaar repository."""
0.217.1 by John Carr
Start stubbing out rewritten git-serve
44
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
45
    def __init__(self, transport):
46
        self.transport = transport
0.217.7 by John Carr
Create tips
47
        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.
48
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
49
    def open_repository(self, path):
0.249.1 by Jelmer Vernooij
More work on server side.
50
        # FIXME: More secure path sanitization
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
51
        transport = self.transport.clone(path.lstrip("/"))
52
        trace.mutter('client opens %r: %r', path, transport)
53
        return BzrBackendRepo(transport, self.mapping)
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
54
55
56
class BzrBackendRepo(BackendRepo):
57
58
    def __init__(self, transport, mapping):
59
        self.transport = transport
60
        self.mapping = mapping
61
        self.repo_dir = BzrDir.open_from_transport(self.transport)
62
        self.repo = self.repo_dir.find_repository()
63
        self.object_store = get_object_store(self.repo)
0.200.1433 by Jelmer Vernooij
Fix fetching between git repositories.
64
        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.
65
66
    def get_refs(self):
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
67
        self.object_store.lock_read()
68
        try:
69
            return self.refs.as_dict()
70
        finally:
71
            self.object_store.unlock()
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
72
0.200.862 by Jelmer Vernooij
Fix locking.
73
    def get_peeled(self, name):
74
        return self.get_refs()[name]
75
76
    def fetch_objects(self, determine_wants, graph_walker, progress,
77
        get_tagged=None):
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
78
        """Yield git objects to send to client """
0.200.1212 by Jelmer Vernooij
Support read locking object stores.
79
        self.object_store.lock_read()
0.200.862 by Jelmer Vernooij
Fix locking.
80
        try:
0.200.1431 by Jelmer Vernooij
add test for fetching from 'bzr serve --git' server.
81
            wants = determine_wants(self.get_refs())
0.200.862 by Jelmer Vernooij
Fix locking.
82
            have = self.object_store.find_common_revisions(graph_walker)
0.271.4 by Jelmer Vernooij
Cope with determine_wants returning None.
83
            if wants is None:
84
                return
0.200.871 by Jelmer Vernooij
Fix fetching from bzr-git's server.
85
            return self.object_store.generate_pack_contents(have, wants, progress,
86
                get_tagged)
0.200.862 by Jelmer Vernooij
Fix locking.
87
        finally:
0.200.1212 by Jelmer Vernooij
Support read locking object stores.
88
            self.object_store.unlock()
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
89
90
0.200.1437 by Jelmer Vernooij
Add bzr-git tcp server class, for better logging.
91
class BzrTCPGitServer(TCPGitServer):
92
93
    def handle_error(self, request, client_address):
94
        trace.log_exception_quietly()
95
        trace.warning('Exception happened during processing of request '
96
                      'from %s', client_address)
97
98
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
99
def serve_git(transport, host=None, port=None, inet=False):
100
    backend = BzrBackend(transport)
101
0.248.1 by David Coles
Use host specified, not localhost
102
    if host is None:
0.248.2 by Jelmer Vernooij
Still default to localhost, update NEWS
103
        host = 'localhost'
0.248.1 by David Coles
Use host specified, not localhost
104
    if port:
0.200.1437 by Jelmer Vernooij
Add bzr-git tcp server class, for better logging.
105
        server = BzrTCPGitServer(backend, host, port)
0.248.1 by David Coles
Use host specified, not localhost
106
    else:
0.200.1437 by Jelmer Vernooij
Add bzr-git tcp server class, for better logging.
107
        server = BzrTCPGitServer(backend, host)
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
108
    server.serve_forever()
0.271.5 by Jelmer Vernooij
Hook into loggerhead.
109
110
111
def git_http_hook(branch, method, path):
112
    from dulwich.web import HTTPGitApplication, HTTPGitRequest, DEFAULT_HANDLERS
113
    handler = None
114
    for (smethod, spath) in HTTPGitApplication.services:
115
        if smethod != method:
116
            continue
117
        mat = spath.search(path)
118
        if mat:
119
            handler = HTTPGitApplication.services[smethod, spath]
120
            break
121
    if handler is None:
122
        return None
123
    backend = BzrBackend(branch.user_transport)
124
    def git_call(environ, start_response):
125
        req = HTTPGitRequest(environ, start_response, dumb=False,
126
                             handlers=DEFAULT_HANDLERS)
127
        return handler(req, backend, mat)
128
    return git_call