/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.531 by Jelmer Vernooij
Support 'bzr serve --git'.
26
    BzrDirFormat,
0.200.495 by Jelmer Vernooij
Fix import.
27
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
28
29
from bzrlib.plugins.git.fetch import (
30
    import_git_objects,
0.200.496 by Roland Mas
Fix missing import.
31
    BazaarObjectStore,
0.200.292 by Jelmer Vernooij
Fix formatting.
32
    )
33
from bzrlib.plugins.git.mapping import (
34
    default_mapping,
35
    )
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
36
from bzrlib.plugins.git.object_store import (
0.200.485 by Jelmer Vernooij
Use ObjectStore to find revision SHA1s rather than 'simple' looups.
37
    get_object_store
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
38
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
39
40
from dulwich.server import (
41
    Backend,
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
42
    BackendRepo,
0.200.292 by Jelmer Vernooij
Fix formatting.
43
    )
44
from dulwich.pack import (
45
    PackData,
46
    write_pack_index_v2,
47
    )
0.200.663 by Roland Mas
Adapt to current import_git_objects API
48
from dulwich.objects import (
49
    ShaFile,
50
    hex_to_sha,
51
    )
0.217.32 by John Carr
Dirtyness to help pass tests
52
0.217.1 by John Carr
Start stubbing out rewritten git-serve
53
class BzrBackend(Backend):
0.200.828 by Jelmer Vernooij
Fix formatting.
54
    """A git serve backend that can use a Bazaar repository."""
0.217.1 by John Carr
Start stubbing out rewritten git-serve
55
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
56
    def __init__(self, transport):
57
        self.transport = transport
0.217.7 by John Carr
Create tips
58
        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.
59
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
60
    def open_repository(self, path):
61
        return BzrBackendRepo(self.transport.clone(path), self.mapping)
62
63
64
class BzrBackendRepo(BackendRepo):
65
66
    def __init__(self, transport, mapping):
67
        self.transport = transport
68
        self.mapping = mapping
69
        self.repo_dir = BzrDir.open_from_transport(self.transport)
70
        self.repo = self.repo_dir.find_repository()
71
        self.object_store = get_object_store(self.repo)
72
0.217.1 by John Carr
Start stubbing out rewritten git-serve
73
    def get_refs(self):
0.200.828 by Jelmer Vernooij
Fix formatting.
74
        """Return a dict of all tags and branches in repository (and shas) """
0.217.12 by John Carr
Support ls-remote against bazaar
75
        ret = {}
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
76
        branch = None
77
        for branch in self.repo.find_branches(using=True):
78
            #FIXME: Look for 'master' or 'trunk' in here, and set HEAD
79
            # accordingly...
80
            #FIXME: Need to get branch path relative to its repository and
81
            # use this instead of nick
82
            ret["refs/heads/"+branch.nick] = self.object_store._lookup_revision_sha1(branch.last_revision())
83
        if 'HEAD' not in ret and branch:
84
            ret['HEAD'] = self.object_store._lookup_revision_sha1(branch.last_revision())
0.217.12 by John Carr
Support ls-remote against bazaar
85
        return ret
0.217.1 by John Carr
Start stubbing out rewritten git-serve
86
87
    def apply_pack(self, refs, read):
0.200.828 by Jelmer Vernooij
Fix formatting.
88
        """Apply pack from client to current repository"""
0.217.4 by John Carr
Easy bits of git pushing to bazaar
89
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)
90
        fd, path = tempfile.mkstemp(suffix=".pack")
91
        f = os.fdopen(fd, 'w')
0.217.6 by John Carr
Fix typos
92
        f.write(read())
0.217.5 by John Carr
Add a temporary hack to test pushing form git to bazaar
93
        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)
94
95
        p = PackData(path)
96
        entries = p.sorted_entries()
0.200.663 by Roland Mas
Adapt to current import_git_objects API
97
        heads = []
98
        for e in entries:
99
            sha = e[0]
100
            offset = e[1]
101
            t, o = p.get_object_at (offset)
102
            if t == 1 or t == 4:
103
                heads.append(sha)
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)
104
        write_pack_index_v2(path[:-5]+".idx", entries, p.calculate_checksum())
105
0.200.663 by Roland Mas
Adapt to current import_git_objects API
106
        repo_dir = BzrDir.open_from_transport(self.transport)
107
        target = repo_dir.find_repository()
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.663 by Roland Mas
Adapt to current import_git_objects API
109
        objects = {}
110
        for tup in p.iterobjects():
111
            obj_type, obj = p.get_object_at (tup[0])
112
            if obj_type in range(1, 4):
113
                sf = ShaFile.from_raw_string (obj_type, obj)
114
                objects[hex_to_sha(sf.id)] = sf
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)
115
116
        target.lock_write()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
117
        try:
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)
118
            target.start_write_group()
119
            try:
0.200.663 by Roland Mas
Adapt to current import_git_objects API
120
                import_git_objects(target, self.mapping, objects,
121
                                   BazaarObjectStore (target, self.mapping),
122
                                   heads)
0.200.684 by Jelmer Vernooij
Properly close write groups.
123
            except:
124
                target.abort_write_group()
125
                raise
126
            else:
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)
127
                target.commit_write_group()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
128
        finally:
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)
129
            target.unlock()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
130
0.217.7 by John Carr
Create tips
131
        for oldsha, sha, ref in refs:
132
            if ref[:11] == 'refs/heads/':
133
                branch_nick = ref[11:]
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
134
                transport = self.transport.clone(branch_nick)
0.217.7 by John Carr
Create tips
135
136
                try:
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
137
                    target_dir = BzrDir.open_from_transport(transport)
0.217.7 by John Carr
Create tips
138
                except:
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
139
                    format = BzrDirFormat.get_default_format()
140
                    format.initialize_on_transport(transport)
0.217.7 by John Carr
Create tips
141
142
                try:
143
                    target_branch = target_dir.open_branch()
144
                except:
145
                    target_branch = target_dir.create_branch()
0.217.22 by John Carr
Fix whitespace
146
0.217.7 by John Carr
Create tips
147
                rev_id = self.mapping.revision_id_foreign_to_bzr(sha)
0.217.22 by John Carr
Fix whitespace
148
                target_branch.generate_revision_history(rev_id)
0.217.7 by John Carr
Create tips
149
0.217.1 by John Carr
Start stubbing out rewritten git-serve
150
    def fetch_objects(self, determine_wants, graph_walker, progress):
151
        """ yield git objects to send to client """
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
152
        bzrdir = BzrDir.open_from_transport(self.transport)
153
        repo = bzrdir.find_repository()
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
154
155
        # If this is a Git repository, just use the existing fetch_objects implementation.
0.200.442 by Jelmer Vernooij
Fix trivial bug checking for git repositories.
156
        if getattr(repo, "fetch_objects", None) is not None:
0.247.2 by Michael Hudson
this works for my tests, but i'm pretty sure it's wrong in general
157
            return 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.
158
0.217.12 by John Carr
Support ls-remote against bazaar
159
        wants = determine_wants(self.get_refs())
0.240.1 by Roland Mas
Use ProtocolGraphWalker's cache
160
        graph_walker.reset()
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
161
        repo.lock_read()
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
162
        store = BazaarObjectStore(repo)
163
        have = store.find_common_revisions(graph_walker)
164
        missing_sha1s = store.find_missing_objects(have, wants, progress)
165
        return store.iter_shas(missing_sha1s)
166
167
168
def serve_git(transport, host=None, port=None, inet=False):
169
    backend = BzrBackend(transport)
170
0.248.1 by David Coles
Use host specified, not localhost
171
    if host is None:
0.248.2 by Jelmer Vernooij
Still default to localhost, update NEWS
172
        host = 'localhost'
0.248.1 by David Coles
Use host specified, not localhost
173
    if port:
174
        server = TCPGitServer(backend, host, port)
175
    else:
176
        server = TCPGitServer(backend, host)
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
177
    server.serve_forever()