/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.292 by Jelmer Vernooij
Fix formatting.
19
import os
20
import tempfile
21
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
22
from dulwich.server import TCPGitServer
23
0.200.495 by Jelmer Vernooij
Fix import.
24
from bzrlib.bzrdir import (
25
    BzrDir,
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
26
    )
27
from bzrlib.errors import (
28
    NotBranchError,
0.200.495 by Jelmer Vernooij
Fix import.
29
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
30
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
31
from bzrlib.plugins.git.branch import (
32
    branch_name_to_ref,
33
    ref_to_branch_name,
34
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
35
from bzrlib.plugins.git.fetch import (
36
    import_git_objects,
37
    )
38
from bzrlib.plugins.git.mapping import (
39
    default_mapping,
40
    )
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
41
from bzrlib.plugins.git.object_store import (
0.200.485 by Jelmer Vernooij
Use ObjectStore to find revision SHA1s rather than 'simple' looups.
42
    get_object_store
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
43
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
44
45
from dulwich.server import (
46
    Backend,
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
47
    BackendRepo,
0.200.292 by Jelmer Vernooij
Fix formatting.
48
    )
49
from dulwich.pack import (
50
    PackData,
0.200.862 by Jelmer Vernooij
Fix locking.
51
    Pack,
0.200.663 by Roland Mas
Adapt to current import_git_objects API
52
    )
0.217.32 by John Carr
Dirtyness to help pass tests
53
0.217.1 by John Carr
Start stubbing out rewritten git-serve
54
class BzrBackend(Backend):
0.200.828 by Jelmer Vernooij
Fix formatting.
55
    """A git serve backend that can use a Bazaar repository."""
0.217.1 by John Carr
Start stubbing out rewritten git-serve
56
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
57
    def __init__(self, transport):
58
        self.transport = transport
0.217.7 by John Carr
Create tips
59
        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.
60
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
61
    def open_repository(self, path):
0.249.1 by Jelmer Vernooij
More work on server side.
62
        # FIXME: More secure path sanitization
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
63
        return BzrBackendRepo(self.transport.clone(path.lstrip("/")),
64
            self.mapping)
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
65
66
67
class BzrBackendRepo(BackendRepo):
68
69
    def __init__(self, transport, mapping):
70
        self.transport = transport
71
        self.mapping = mapping
72
        self.repo_dir = BzrDir.open_from_transport(self.transport)
73
        self.repo = self.repo_dir.find_repository()
74
        self.object_store = get_object_store(self.repo)
75
0.200.862 by Jelmer Vernooij
Fix locking.
76
    def get_peeled(self, name):
77
        return self.get_refs()[name]
78
0.217.1 by John Carr
Start stubbing out rewritten git-serve
79
    def get_refs(self):
0.200.828 by Jelmer Vernooij
Fix formatting.
80
        """Return a dict of all tags and branches in repository (and shas) """
0.217.12 by John Carr
Support ls-remote against bazaar
81
        ret = {}
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
82
        self.repo.lock_read()
83
        try:
84
            for branch in self.repo_dir.list_branches():
0.200.862 by Jelmer Vernooij
Fix locking.
85
                ref = branch_name_to_ref(branch.name, "refs/heads/master")
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
86
                ret[ref] = self.object_store._lookup_revision_sha1(
87
                    branch.last_revision())
88
                assert type(ref) == str and type(ret[ref]) == str, \
89
                        "(%s) %r -> %r" % (branch.name, ref, ret[ref])
90
91
        finally:
92
            self.repo.unlock()
0.217.12 by John Carr
Support ls-remote against bazaar
93
        return ret
0.217.1 by John Carr
Start stubbing out rewritten git-serve
94
95
    def apply_pack(self, refs, read):
0.200.828 by Jelmer Vernooij
Fix formatting.
96
        """Apply pack from client to current repository"""
0.217.4 by John Carr
Easy bits of git pushing to bazaar
97
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
98
        fd, path = tempfile.mkstemp(suffix=".pack")
99
        f = os.fdopen(fd, 'w')
0.217.6 by John Carr
Fix typos
100
        f.write(read())
0.217.5 by John Carr
Add a temporary hack to test pushing form git to bazaar
101
        f.close()
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
102
0.200.862 by Jelmer Vernooij
Fix locking.
103
        pd = PackData(path)
104
        pd.create_index_v2(path[:-5]+".idx", self.object_store.get_raw)
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
105
0.200.862 by Jelmer Vernooij
Fix locking.
106
        p = Pack(path[:-5])
107
        heads = [k[1] for k in refs]
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
108
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
109
        self.repo.lock_write()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
110
        try:
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
111
            self.repo.start_write_group()
0.217.8 by John Carr
Don't bother using InterRepo, use import_git_objects directly. Don't need a full repository (just operating on a pack and index)
112
            try:
0.200.862 by Jelmer Vernooij
Fix locking.
113
                import_git_objects(self.repo, self.mapping, 
114
                    p.iterobjects(get_raw=self.object_store.get_raw),
115
                    self.object_store, heads)
0.200.684 by Jelmer Vernooij
Properly close write groups.
116
            except:
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
117
                self.repo.abort_write_group()
0.200.684 by Jelmer Vernooij
Properly close write groups.
118
                raise
119
            else:
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
120
                self.repo.commit_write_group()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
121
        finally:
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
122
            self.repo.unlock()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
123
0.217.7 by John Carr
Create tips
124
        for oldsha, sha, ref in refs:
0.200.861 by Jelmer Vernooij
Simplify ref determination, add asserts.
125
            try:
126
                branch_name = ref_to_branch_name(ref)
127
            except ValueError:
128
                # FIXME: Cope with tags!
129
                continue
130
            try:
131
                target_branch = self.repo_dir.open_branch(branch_name)
132
            except NotBranchError:
133
                target_branch = self.repo.create_branch(branch_name)
134
135
            rev_id = self.mapping.revision_id_foreign_to_bzr(sha)
0.200.862 by Jelmer Vernooij
Fix locking.
136
            target_branch.lock_write()
137
            try:
138
                target_branch.generate_revision_history(rev_id)
139
            finally:
140
                target_branch.unlock()
0.217.7 by John Carr
Create tips
141
0.200.862 by Jelmer Vernooij
Fix locking.
142
    def fetch_objects(self, determine_wants, graph_walker, progress,
143
        get_tagged=None):
0.217.1 by John Carr
Start stubbing out rewritten git-serve
144
        """ yield git objects to send to client """
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
145
        # If this is a Git repository, just use the existing fetch_objects implementation.
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
146
        if getattr(self.repo, "fetch_objects", None) is not None:
147
            return self.repo.fetch_objects(determine_wants, graph_walker, None, progress)[0]
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
148
0.217.12 by John Carr
Support ls-remote against bazaar
149
        wants = determine_wants(self.get_refs())
0.240.1 by Roland Mas
Use ProtocolGraphWalker's cache
150
        graph_walker.reset()
0.200.862 by Jelmer Vernooij
Fix locking.
151
152
        self.repo.lock_read()
153
        try:
154
            have = self.object_store.find_common_revisions(graph_walker)
155
            return self.object_store.generate_pack_contents(have, wants)
156
        finally:
157
            self.repo.unlock()
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
158
159
160
def serve_git(transport, host=None, port=None, inet=False):
161
    backend = BzrBackend(transport)
162
0.248.1 by David Coles
Use host specified, not localhost
163
    if host is None:
0.248.2 by Jelmer Vernooij
Still default to localhost, update NEWS
164
        host = 'localhost'
0.248.1 by David Coles
Use host specified, not localhost
165
    if port:
166
        server = TCPGitServer(backend, host, port)
167
    else:
168
        server = TCPGitServer(backend, host)
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
169
    server.serve_forever()