/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
0.217.45 by John Carr
Restore +x flag is file is executable
18
import stat
0.200.292 by Jelmer Vernooij
Fix formatting.
19
import tempfile
20
21
from bzrlib.bzrdir import (
22
    BzrDir,
23
    )
24
from bzrlib.inventory import (
25
    InventoryDirectory,
26
    InventoryFile,
27
    )
28
from bzrlib.osutils import (
29
    splitpath,
30
    )
31
from bzrlib.repository import (
32
    Repository,
33
    )
34
0.200.449 by Jelmer Vernooij
Use BazaarObjectStore to find matching SHA1s for bzr revisions.
35
from bzrlib.plugins.git.converter import (
36
    BazaarObjectStore,
37
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
38
from bzrlib.plugins.git.fetch import (
39
    import_git_objects,
40
    )
41
from bzrlib.plugins.git.mapping import (
42
    default_mapping,
43
    inventory_to_tree_and_blobs,
44
    revision_to_commit,
45
    )
46
47
from dulwich.server import (
48
    Backend,
49
    )
50
from dulwich.pack import (
51
    Pack,
52
    PackData,
53
    write_pack_index_v2,
54
    )
55
from dulwich.objects import (
56
    Blob,
57
    Commit,
58
    ShaFile,
59
    Tree,
60
    )
61
0.217.44 by John Carr
Use proper modes
62
S_IFGITLINK = 0160000
63
0.217.46 by John Carr
Remove debug print. Fetch S_IF* foo from stat module. Fix file mode picker.
64
#S_IFREG | 0664 # *Might* see this; would fail fsck --strict
0.217.44 by John Carr
Use proper modes
65
0.217.32 by John Carr
Dirtyness to help pass tests
66
0.217.1 by John Carr
Start stubbing out rewritten git-serve
67
class BzrBackend(Backend):
68
0.217.2 by John Carr
Fix missing imports. Update TCPGitServer instantiation to latest. BzrBackend needs to know which directory its repo is in.
69
    def __init__(self, directory):
70
        self.directory = directory
0.217.7 by John Carr
Create tips
71
        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.
72
0.217.1 by John Carr
Start stubbing out rewritten git-serve
73
    def get_refs(self):
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 = {}
76
        repo_dir = BzrDir.open(self.directory)
77
        repo = repo_dir.open_repository()
0.217.52 by John Carr
Have a head, any head
78
        branch = None
0.217.12 by John Carr
Support ls-remote against bazaar
79
        for branch in repo.find_branches(using=True):
0.217.52 by John Carr
Have a head, any head
80
            #FIXME: Look for 'master' or 'trunk' in here, and set HEAD accordingly...
0.217.12 by John Carr
Support ls-remote against bazaar
81
            #FIXME: Need to get branch path relative to its repository and use this instead of nick
0.200.449 by Jelmer Vernooij
Use BazaarObjectStore to find matching SHA1s for bzr revisions.
82
            rev, mapping = self.mapping.revision_id_bzr_to_foreign(branch.last_revision())
83
            ret["refs/heads/"+branch.nick] = rev
0.217.52 by John Carr
Have a head, any head
84
        if 'HEAD' not in ret and branch:
0.200.449 by Jelmer Vernooij
Use BazaarObjectStore to find matching SHA1s for bzr revisions.
85
            rev, mapping = self.mapping.revision_id_bzr_to_foreign(branch.last_revision())
86
            ret['HEAD'] = rev
0.217.12 by John Carr
Support ls-remote against bazaar
87
        return ret
0.217.1 by John Carr
Start stubbing out rewritten git-serve
88
89
    def apply_pack(self, refs, read):
90
        """ apply pack from client to current repository """
0.217.4 by John Carr
Easy bits of git pushing to bazaar
91
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
        fd, path = tempfile.mkstemp(suffix=".pack")
93
        f = os.fdopen(fd, 'w')
0.217.6 by John Carr
Fix typos
94
        f.write(read())
0.217.5 by John Carr
Add a temporary hack to test pushing form git to bazaar
95
        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)
96
97
        p = PackData(path)
98
        entries = p.sorted_entries()
99
        write_pack_index_v2(path[:-5]+".idx", entries, p.calculate_checksum())
100
101
        def get_objects():
102
            pack = Pack(path[:-5])
103
            for obj in pack.iterobjects():
104
                yield obj
105
106
        target = Repository.open(self.directory)
107
108
        target.lock_write()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
109
        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)
110
            target.start_write_group()
111
            try:
112
                import_git_objects(target, self.mapping, iter(get_objects()))
113
            finally:
114
                target.commit_write_group()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
115
        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)
116
            target.unlock()
0.217.4 by John Carr
Easy bits of git pushing to bazaar
117
0.217.7 by John Carr
Create tips
118
        for oldsha, sha, ref in refs:
119
            if ref[:11] == 'refs/heads/':
120
                branch_nick = ref[11:]
121
122
                try:
123
                    target_dir = BzrDir.open(self.directory + "/" + branch_nick)
124
                except:
125
                    target_dir = BzrDir.create(self.directory + "/" + branch_nick)
126
127
                try:
128
                    target_branch = target_dir.open_branch()
129
                except:
130
                    target_branch = target_dir.create_branch()
0.217.22 by John Carr
Fix whitespace
131
0.217.7 by John Carr
Create tips
132
                rev_id = self.mapping.revision_id_foreign_to_bzr(sha)
0.217.22 by John Carr
Fix whitespace
133
                target_branch.generate_revision_history(rev_id)
0.217.7 by John Carr
Create tips
134
0.217.1 by John Carr
Start stubbing out rewritten git-serve
135
    def fetch_objects(self, determine_wants, graph_walker, progress):
136
        """ 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.
137
        repo = Repository.open(self.directory)
138
139
        # 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.
140
        if getattr(repo, "fetch_objects", None) is not None:
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
141
            return repo.fetch_objects(determine_wants, graph_walker, None, progress)
0.200.449 by Jelmer Vernooij
Use BazaarObjectStore to find matching SHA1s for bzr revisions.
142
        store = BazaarObjectStore(repo)
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
143
0.217.12 by John Carr
Support ls-remote against bazaar
144
        wants = determine_wants(self.get_refs())
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
145
        commits_to_send = set([self.mapping.revision_id_foreign_to_bzr(w) for w in wants])
146
        rev_done = set()
0.217.31 by John Carr
At the moment, we have to convert an object to know its sha :\ - the same sha can be made multiple times... lets at least not add it the pack if its already there.
147
        obj_sent = set()
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
148
0.200.188 by Jelmer Vernooij
Merge dulwich.
149
        objects = set()
150
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
151
        repo.lock_read()
152
        try:
153
            have = graph_walker.next()
154
            while have:
155
                rev_done.add(have)
0.200.212 by Jelmer Vernooij
Move conversion functions to mapping, use fetch_objects() from repository if present.
156
                if repo.has_revision(self.mapping.revision_id_foreign_to_bzr(sha)):
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
157
                    graph_walker.ack(have)
158
                have = graph_walker.next()
159
160
            while commits_to_send:
0.217.15 by John Carr
Start traversing commits and inventories
161
                commit = commits_to_send.pop()
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
162
                if commit in rev_done:
163
                    continue
164
                rev_done.add(commit)
165
0.217.15 by John Carr
Start traversing commits and inventories
166
                rev = repo.get_revision(commit)
167
168
                commits_to_send.update([p for p in rev.parent_ids if not p in rev_done])
169
0.200.349 by Jelmer Vernooij
Specify inventory and texts to inventory_to_tree_and_blobs rather than full repository.
170
                for sha, obj, path in inventory_to_tree_and_blobs(repo.get_inventory(commit), repo.texts, self.mapping):
0.217.31 by John Carr
At the moment, we have to convert an object to know its sha :\ - the same sha can be made multiple times... lets at least not add it the pack if its already there.
171
                    if sha not in obj_sent:
172
                        obj_sent.add(sha)
0.217.50 by John Carr
Make fetch_objects return a list of (object, path)
173
                        objects.add((obj, path))
0.217.15 by John Carr
Start traversing commits and inventories
174
0.200.449 by Jelmer Vernooij
Use BazaarObjectStore to find matching SHA1s for bzr revisions.
175
                objects.add((revision_to_commit(rev, sha, store._lookup_revision_sha1), None))
0.217.15 by John Carr
Start traversing commits and inventories
176
0.217.14 by John Carr
Negotiate which revisions need to be sent to client, and iterate over them all
177
        finally:
178
            repo.unlock()
0.217.15 by John Carr
Start traversing commits and inventories
179
0.200.188 by Jelmer Vernooij
Merge dulwich.
180
        return (len(objects), iter(objects))
181