/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,
31
    )
32
from bzrlib.plugins.git.mapping import (
33
    default_mapping,
34
    )
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
35
from bzrlib.plugins.git.object_store import (
0.200.485 by Jelmer Vernooij
Use ObjectStore to find revision SHA1s rather than 'simple' looups.
36
    get_object_store
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
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
    )
43
from dulwich.pack import (
44
    PackData,
45
    write_pack_index_v2,
46
    )
0.200.663 by Roland Mas
Adapt to current import_git_objects API
47
from dulwich.objects import (
48
    ShaFile,
49
    hex_to_sha,
50
    )
0.217.32 by John Carr
Dirtyness to help pass tests
51
0.217.1 by John Carr
Start stubbing out rewritten git-serve
52
class BzrBackend(Backend):
0.200.828 by Jelmer Vernooij
Fix formatting.
53
    """A git serve backend that can use a Bazaar repository."""
0.217.1 by John Carr
Start stubbing out rewritten git-serve
54
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
55
    def __init__(self, transport):
56
        self.transport = transport
0.217.7 by John Carr
Create tips
57
        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.
58
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
59
    def open_repository(self, path):
0.249.1 by Jelmer Vernooij
More work on server side.
60
        # FIXME: More secure path sanitization
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
61
        return BzrBackendRepo(self.transport.clone(path.lstrip("/")), self.mapping)
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
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
0.249.1 by Jelmer Vernooij
More work on server side.
77
        for branch in self.repo_dir.list_branches():
0.200.831 by Jelmer Vernooij
Implement new git server backend API.
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
0.249.1 by Jelmer Vernooij
More work on server side.
82
            ret["refs/heads/"+branch.name] = self.object_store._lookup_revision_sha1(branch.last_revision())
0.217.12 by John Carr
Support ls-remote against bazaar
83
        return ret
0.217.1 by John Carr
Start stubbing out rewritten git-serve
84
85
    def apply_pack(self, refs, read):
0.200.828 by Jelmer Vernooij
Fix formatting.
86
        """Apply pack from client to current repository"""
0.217.4 by John Carr
Easy bits of git pushing to bazaar
87
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)
88
        fd, path = tempfile.mkstemp(suffix=".pack")
89
        f = os.fdopen(fd, 'w')
0.217.6 by John Carr
Fix typos
90
        f.write(read())
0.217.5 by John Carr
Add a temporary hack to test pushing form git to bazaar
91
        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)
92
93
        p = PackData(path)
94
        entries = p.sorted_entries()
0.200.663 by Roland Mas
Adapt to current import_git_objects API
95
        heads = []
96
        for e in entries:
97
            sha = e[0]
98
            offset = e[1]
99
            t, o = p.get_object_at (offset)
100
            if t == 1 or t == 4:
101
                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)
102
        write_pack_index_v2(path[:-5]+".idx", entries, p.calculate_checksum())
103
0.200.663 by Roland Mas
Adapt to current import_git_objects API
104
        objects = {}
105
        for tup in p.iterobjects():
106
            obj_type, obj = p.get_object_at (tup[0])
107
            if obj_type in range(1, 4):
108
                sf = ShaFile.from_raw_string (obj_type, obj)
109
                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)
110
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
111
        self.repo.lock_write()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
112
        try:
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
113
            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)
114
            try:
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
115
                import_git_objects(self.repo, self.mapping, objects,
116
                                   self.object_store,
0.200.663 by Roland Mas
Adapt to current import_git_objects API
117
                                   heads)
0.200.684 by Jelmer Vernooij
Properly close write groups.
118
            except:
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
119
                self.repo.abort_write_group()
0.200.684 by Jelmer Vernooij
Properly close write groups.
120
                raise
121
            else:
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
122
                self.repo.commit_write_group()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
123
        finally:
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
124
            self.repo.unlock()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
125
0.217.7 by John Carr
Create tips
126
        for oldsha, sha, ref in refs:
127
            if ref[:11] == 'refs/heads/':
128
                branch_nick = ref[11:]
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
129
                transport = self.repo.root_transport.clone(branch_nick)
0.217.7 by John Carr
Create tips
130
131
                try:
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
132
                    target_dir = BzrDir.open_from_transport(transport)
0.217.7 by John Carr
Create tips
133
                except:
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
134
                    format = BzrDirFormat.get_default_format()
135
                    format.initialize_on_transport(transport)
0.217.7 by John Carr
Create tips
136
137
                try:
138
                    target_branch = target_dir.open_branch()
139
                except:
140
                    target_branch = target_dir.create_branch()
0.217.22 by John Carr
Fix whitespace
141
0.217.7 by John Carr
Create tips
142
                rev_id = self.mapping.revision_id_foreign_to_bzr(sha)
0.217.22 by John Carr
Fix whitespace
143
                target_branch.generate_revision_history(rev_id)
0.217.7 by John Carr
Create tips
144
0.249.1 by Jelmer Vernooij
More work on server side.
145
    def fetch_objects(self, determine_wants, graph_walker, progress, get_tagged=None):
0.217.1 by John Carr
Start stubbing out rewritten git-serve
146
        """ 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.
147
        # If this is a Git repository, just use the existing fetch_objects implementation.
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
148
        if getattr(self.repo, "fetch_objects", None) is not None:
149
            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.
150
0.217.12 by John Carr
Support ls-remote against bazaar
151
        wants = determine_wants(self.get_refs())
0.240.1 by Roland Mas
Use ProtocolGraphWalker's cache
152
        graph_walker.reset()
0.200.834 by Jelmer Vernooij
Simplify repository opening code.
153
        have = self.object_store.find_common_revisions(graph_walker)
154
        return self.object_store.generate_pack_contents(have, wants)
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
155
156
157
def serve_git(transport, host=None, port=None, inet=False):
158
    backend = BzrBackend(transport)
159
0.248.1 by David Coles
Use host specified, not localhost
160
    if host is None:
0.248.2 by Jelmer Vernooij
Still default to localhost, update NEWS
161
        host = 'localhost'
0.248.1 by David Coles
Use host specified, not localhost
162
    if port:
163
        server = TCPGitServer(backend, host, port)
164
    else:
165
        server = TCPGitServer(backend, host)
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
166
    server.serve_forever()