/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.217.1 by John Carr
Start stubbing out rewritten git-serve
1
# Copyright (C) 2008 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
0.200.292 by Jelmer Vernooij
Fix formatting.
17
import os
18
import tempfile
19
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
20
from dulwich.server import TCPGitServer
21
0.200.495 by Jelmer Vernooij
Fix import.
22
from bzrlib.bzrdir import (
23
    BzrDir,
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
24
    BzrDirFormat,
0.200.495 by Jelmer Vernooij
Fix import.
25
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
26
from bzrlib.repository import (
27
    Repository,
28
    )
29
30
from bzrlib.plugins.git.fetch import (
31
    import_git_objects,
0.200.496 by Roland Mas
Fix missing import.
32
    BazaarObjectStore,
0.200.292 by Jelmer Vernooij
Fix formatting.
33
    )
34
from bzrlib.plugins.git.mapping import (
35
    default_mapping,
36
    )
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
37
from bzrlib.plugins.git.object_store import (
0.200.485 by Jelmer Vernooij
Use ObjectStore to find revision SHA1s rather than 'simple' looups.
38
    get_object_store
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
39
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
40
41
from dulwich.server import (
42
    Backend,
43
    )
44
from dulwich.pack import (
45
    Pack,
46
    PackData,
47
    write_pack_index_v2,
48
    )
0.200.663 by Roland Mas
Adapt to current import_git_objects API
49
from dulwich.objects import (
50
    ShaFile,
51
    sha_to_hex,
52
    hex_to_sha,
53
    )
0.217.32 by John Carr
Dirtyness to help pass tests
54
0.217.1 by John Carr
Start stubbing out rewritten git-serve
55
class BzrBackend(Backend):
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.217.1 by John Carr
Start stubbing out rewritten git-serve
61
    def get_refs(self):
62
        """ return a dict of all tags and branches in repository (and shas) """
0.217.12 by John Carr
Support ls-remote against bazaar
63
        ret = {}
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
64
        repo_dir = BzrDir.open_from_transport(self.transport)
65
        repo = repo_dir.find_repository()
66
        repo.lock_read()
67
        try:
68
            store = get_object_store(repo)
69
            branch = None
70
            for branch in repo.find_branches(using=True):
71
                #FIXME: Look for 'master' or 'trunk' in here, and set HEAD accordingly...
72
                #FIXME: Need to get branch path relative to its repository and use this instead of nick
73
                ret["refs/heads/"+branch.nick] = store._lookup_revision_sha1(branch.last_revision())
74
            if 'HEAD' not in ret and branch:
75
                ret['HEAD'] = store._lookup_revision_sha1(branch.last_revision())
76
        finally:
77
            repo.unlock()
0.217.12 by John Carr
Support ls-remote against bazaar
78
        return ret
0.217.1 by John Carr
Start stubbing out rewritten git-serve
79
80
    def apply_pack(self, refs, read):
81
        """ apply pack from client to current repository """
0.217.4 by John Carr
Easy bits of git pushing to bazaar
82
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)
83
        fd, path = tempfile.mkstemp(suffix=".pack")
84
        f = os.fdopen(fd, 'w')
0.217.6 by John Carr
Fix typos
85
        f.write(read())
0.217.5 by John Carr
Add a temporary hack to test pushing form git to bazaar
86
        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)
87
88
        p = PackData(path)
89
        entries = p.sorted_entries()
0.200.663 by Roland Mas
Adapt to current import_git_objects API
90
        heads = []
91
        for e in entries:
92
            sha = e[0]
93
            offset = e[1]
94
            t, o = p.get_object_at (offset)
95
            if t == 1 or t == 4:
96
                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)
97
        write_pack_index_v2(path[:-5]+".idx", entries, p.calculate_checksum())
98
0.200.663 by Roland Mas
Adapt to current import_git_objects API
99
        repo_dir = BzrDir.open_from_transport(self.transport)
100
        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)
101
0.200.663 by Roland Mas
Adapt to current import_git_objects API
102
        objects = {}
103
        for tup in p.iterobjects():
104
            obj_type, obj = p.get_object_at (tup[0])
105
            if obj_type in range(1, 4):
106
                sf = ShaFile.from_raw_string (obj_type, obj)
107
                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)
108
109
        target.lock_write()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
110
        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)
111
            target.start_write_group()
112
            try:
0.200.663 by Roland Mas
Adapt to current import_git_objects API
113
                import_git_objects(target, self.mapping, objects,
114
                                   BazaarObjectStore (target, self.mapping),
115
                                   heads)
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)
116
            finally:
117
                target.commit_write_group()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
118
        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)
119
            target.unlock()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
120
0.217.7 by John Carr
Create tips
121
        for oldsha, sha, ref in refs:
122
            if ref[:11] == 'refs/heads/':
123
                branch_nick = ref[11:]
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
124
                transport = self.transport.clone(branch_nick)
0.217.7 by John Carr
Create tips
125
126
                try:
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
127
                    target_dir = BzrDir.open_from_transport(transport)
0.217.7 by John Carr
Create tips
128
                except:
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
129
                    format = BzrDirFormat.get_default_format()
130
                    format.initialize_on_transport(transport)
0.217.7 by John Carr
Create tips
131
132
                try:
133
                    target_branch = target_dir.open_branch()
134
                except:
135
                    target_branch = target_dir.create_branch()
0.217.22 by John Carr
Fix whitespace
136
0.217.7 by John Carr
Create tips
137
                rev_id = self.mapping.revision_id_foreign_to_bzr(sha)
0.217.22 by John Carr
Fix whitespace
138
                target_branch.generate_revision_history(rev_id)
0.217.7 by John Carr
Create tips
139
0.217.1 by John Carr
Start stubbing out rewritten git-serve
140
    def fetch_objects(self, determine_wants, graph_walker, progress):
141
        """ yield git objects to send to client """
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
142
        bzrdir = BzrDir.open_from_transport(self.transport)
143
        repo = bzrdir.find_repository()
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
144
145
        # 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.
146
        if getattr(repo, "fetch_objects", None) is not None:
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
147
            return repo.fetch_objects(determine_wants, graph_walker, None, progress)
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.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
151
        repo.lock_read()
0.200.531 by Jelmer Vernooij
Support 'bzr serve --git'.
152
        store = BazaarObjectStore(repo)
153
        have = store.find_common_revisions(graph_walker)
154
        missing_sha1s = store.find_missing_objects(have, wants, progress)
155
        return store.iter_shas(missing_sha1s)
156
157
158
def serve_git(transport, host=None, port=None, inet=False):
159
    backend = BzrBackend(transport)
160
161
    server = TCPGitServer(backend, 'localhost')
162
    server.serve_forever()