/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.495 by Jelmer Vernooij
Fix import.
21
from bzrlib.bzrdir import (
22
    BzrDir,
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
23
    )
24
from bzrlib.errors import (
25
    NotBranchError,
0.200.495 by Jelmer Vernooij
Fix import.
26
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
27
28
from bzrlib.plugins.git.mapping import (
29
    default_mapping,
30
    )
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
31
from bzrlib.plugins.git.object_store import (
0.200.485 by Jelmer Vernooij
Use ObjectStore to find revision SHA1s rather than 'simple' looups.
32
    get_object_store
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
33
    )
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
34
from bzrlib.plugins.git.refs import (
35
    branch_name_to_ref,
36
    ref_to_branch_name,
37
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
38
39
from dulwich.server import (
40
    Backend,
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
41
    BackendRepo,
0.200.292 by Jelmer Vernooij
Fix formatting.
42
    )
0.217.32 by John Carr
Dirtyness to help pass tests
43
0.217.1 by John Carr
Start stubbing out rewritten git-serve
44
class BzrBackend(Backend):
0.200.828 by Jelmer Vernooij
Fix formatting.
45
    """A git serve backend that can use a Bazaar repository."""
0.217.1 by John Carr
Start stubbing out rewritten git-serve
46
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
47
    def __init__(self, transport):
48
        self.transport = transport
0.217.7 by John Carr
Create tips
49
        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.
50
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
51
    def open_repository(self, path):
0.249.1 by Jelmer Vernooij
More work on server side.
52
        # FIXME: More secure path sanitization
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
53
        return BzrBackendRepo(self.transport.clone(path.lstrip("/")),
54
            self.mapping)
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
55
56
57
class BzrBackendRepo(BackendRepo):
58
59
    def __init__(self, transport, mapping):
60
        self.transport = transport
61
        self.mapping = mapping
62
        self.repo_dir = BzrDir.open_from_transport(self.transport)
63
        self.repo = self.repo_dir.find_repository()
64
        self.object_store = get_object_store(self.repo)
65
0.200.862 by Jelmer Vernooij
Fix locking.
66
    def get_peeled(self, name):
67
        return self.get_refs()[name]
68
0.217.1 by John Carr
Start stubbing out rewritten git-serve
69
    def get_refs(self):
0.200.828 by Jelmer Vernooij
Fix formatting.
70
        """Return a dict of all tags and branches in repository (and shas) """
0.217.12 by John Carr
Support ls-remote against bazaar
71
        ret = {}
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
72
        self.repo.lock_read()
73
        try:
74
            for branch in self.repo_dir.list_branches():
0.200.862 by Jelmer Vernooij
Fix locking.
75
                ref = branch_name_to_ref(branch.name, "refs/heads/master")
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
76
                ret[ref] = self.object_store._lookup_revision_sha1(
77
                    branch.last_revision())
78
                assert type(ref) == str and type(ret[ref]) == str, \
79
                        "(%s) %r -> %r" % (branch.name, ref, ret[ref])
80
        finally:
81
            self.repo.unlock()
0.217.12 by John Carr
Support ls-remote against bazaar
82
        return ret
0.217.1 by John Carr
Start stubbing out rewritten git-serve
83
0.251.1 by Jelmer Vernooij
Implement ObjectStore.add_{thin_,}pack.
84
    def set_refs(self, refs):
0.217.7 by John Carr
Create tips
85
        for oldsha, sha, ref in refs:
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
86
            try:
87
                branch_name = ref_to_branch_name(ref)
88
            except ValueError:
89
                # FIXME: Cope with tags!
90
                continue
91
            try:
92
                target_branch = self.repo_dir.open_branch(branch_name)
93
            except NotBranchError:
94
                target_branch = self.repo.create_branch(branch_name)
95
96
            rev_id = self.mapping.revision_id_foreign_to_bzr(sha)
0.200.862 by Jelmer Vernooij
Fix locking.
97
            target_branch.lock_write()
98
            try:
99
                target_branch.generate_revision_history(rev_id)
100
            finally:
101
                target_branch.unlock()
0.217.7 by John Carr
Create tips
102
0.200.862 by Jelmer Vernooij
Fix locking.
103
    def fetch_objects(self, determine_wants, graph_walker, progress,
104
        get_tagged=None):
0.217.1 by John Carr
Start stubbing out rewritten git-serve
105
        """ yield git objects to send to client """
0.251.1 by Jelmer Vernooij
Implement ObjectStore.add_{thin_,}pack.
106
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
107
        # If this is a Git repository, just use the existing fetch_objects implementation.
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
108
        if getattr(self.repo, "fetch_objects", None) is not None:
0.251.1 by Jelmer Vernooij
Implement ObjectStore.add_{thin_,}pack.
109
            return self.repo.fetch_objects(determine_wants, graph_walker, progress,
110
                get_tagged)
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
111
0.217.12 by John Carr
Support ls-remote against bazaar
112
        wants = determine_wants(self.get_refs())
0.200.862 by Jelmer Vernooij
Fix locking.
113
        self.repo.lock_read()
114
        try:
115
            have = self.object_store.find_common_revisions(graph_walker)
0.200.871 by Jelmer Vernooij
Fix fetching from bzr-git's server.
116
            return self.object_store.generate_pack_contents(have, wants, progress,
117
                get_tagged)
0.200.862 by Jelmer Vernooij
Fix locking.
118
        finally:
119
            self.repo.unlock()
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
120
121
122
def serve_git(transport, host=None, port=None, inet=False):
123
    backend = BzrBackend(transport)
124
0.248.1 by David Coles
Use host specified, not localhost
125
    if host is None:
0.248.2 by Jelmer Vernooij
Still default to localhost, update NEWS
126
        host = 'localhost'
0.248.1 by David Coles
Use host specified, not localhost
127
    if port:
128
        server = TCPGitServer(backend, host, port)
129
    else:
130
        server = TCPGitServer(backend, host)
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
131
    server.serve_forever()