/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
1
# Copyright (C) 2008 Jelmer Vernooij <jelmer@samba.org>
0.200.135 by Jelmer Vernooij
Add stub for fetching data.
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
from cStringIO import (
18
    StringIO,
19
    )
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
20
import dulwich as git
0.200.261 by Jelmer Vernooij
More formatting fixes.
21
from dulwich.client import (
22
    SimpleFetchGraphWalker,
23
    )
24
from dulwich.objects import (
25
    Commit,
26
    )
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
27
28
from bzrlib import (
29
    osutils,
0.200.261 by Jelmer Vernooij
More formatting fixes.
30
    trace,
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
31
    ui,
32
    urlutils,
33
    )
34
from bzrlib.errors import (
35
    InvalidRevisionId,
36
    NoSuchRevision,
37
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
38
from bzrlib.inventory import (
39
    Inventory,
0.229.2 by Jelmer Vernooij
Initial work relying on inventory deltas.
40
    InventoryDirectory,
41
    InventoryFile,
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
42
    InventoryLink,
0.200.261 by Jelmer Vernooij
More formatting fixes.
43
    )
0.200.301 by Jelmer Vernooij
Cache inventories created.
44
from bzrlib.lru_cache import (
45
    LRUCache,
46
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
47
from bzrlib.repository import (
48
    InterRepository,
49
    )
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
50
from bzrlib.revision import (
51
    NULL_REVISION,
52
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
53
from bzrlib.tsort import (
54
    topo_sort,
55
    )
0.200.135 by Jelmer Vernooij
Add stub for fetching data.
56
0.200.261 by Jelmer Vernooij
More formatting fixes.
57
from bzrlib.plugins.git.converter import (
58
    GitObjectConverter,
59
    )
0.200.169 by Jelmer Vernooij
Fix branch cloning.
60
from bzrlib.plugins.git.repository import (
0.200.261 by Jelmer Vernooij
More formatting fixes.
61
    LocalGitRepository, 
62
    GitRepository, 
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
63
    GitRepositoryFormat,
0.200.261 by Jelmer Vernooij
More formatting fixes.
64
    )
65
from bzrlib.plugins.git.remote import (
66
    RemoteGitRepository,
67
    )
0.216.4 by Jelmer Vernooij
Add basic pack fetch infrastructure.
68
69
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
70
class BzrFetchGraphWalker(object):
0.200.196 by Jelmer Vernooij
Add simple tests and docstrings for GraphWalker.
71
    """GraphWalker implementation that uses a Bazaar repository."""
0.216.4 by Jelmer Vernooij
Add basic pack fetch infrastructure.
72
73
    def __init__(self, repository, mapping):
74
        self.repository = repository
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
75
        self.mapping = mapping
76
        self.done = set()
77
        self.heads = set(repository.all_revision_ids())
0.216.4 by Jelmer Vernooij
Add basic pack fetch infrastructure.
78
        self.parents = {}
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
79
0.200.196 by Jelmer Vernooij
Add simple tests and docstrings for GraphWalker.
80
    def __iter__(self):
81
        return iter(self.next, None)
82
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
83
    def ack(self, sha):
84
        revid = self.mapping.revision_id_foreign_to_bzr(sha)
85
        self.remove(revid)
86
87
    def remove(self, revid):
88
        self.done.add(revid)
0.200.177 by Jelmer Vernooij
Add git-import command.
89
        if revid in self.heads:
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
90
            self.heads.remove(revid)
91
        if revid in self.parents:
92
            for p in self.parents[revid]:
93
                self.remove(p)
0.216.4 by Jelmer Vernooij
Add basic pack fetch infrastructure.
94
95
    def next(self):
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
96
        while self.heads:
97
            ret = self.heads.pop()
98
            ps = self.repository.get_parent_map([ret])[ret]
0.216.4 by Jelmer Vernooij
Add basic pack fetch infrastructure.
99
            self.parents[ret] = ps
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
100
            self.heads.update([p for p in ps if not p in self.done])
101
            try:
102
                self.done.add(ret)
0.200.195 by Jelmer Vernooij
Return mapping in revision_id_bzr_to_foreign() as required by the interface.
103
                return self.mapping.revision_id_bzr_to_foreign(ret)[0]
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
104
            except InvalidRevisionId:
105
                pass
0.216.4 by Jelmer Vernooij
Add basic pack fetch infrastructure.
106
        return None
107
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
108
0.229.2 by Jelmer Vernooij
Initial work relying on inventory deltas.
109
def import_git_blob(texts, mapping, path, blob, base_inv, parent_id, 
110
    revision_id, parent_invs, shagitmap, executable):
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
111
    """Import a git blob object into a bzr repository.
112
0.200.261 by Jelmer Vernooij
More formatting fixes.
113
    :param texts: VersionedFiles to add to
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
114
    :param path: Path in the tree
115
    :param blob: A git blob
0.229.1 by Jelmer Vernooij
Start working with inventory deltas.
116
    :return: Inventory delta for this file
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
117
    """
118
    file_id = mapping.generate_file_id(path)
0.200.297 by Jelmer Vernooij
Cope with non-ascii characters in filenames (needs a test..).
119
    # We just have to hope this is indeed utf-8:
0.229.2 by Jelmer Vernooij
Initial work relying on inventory deltas.
120
    ie = InventoryFile(file_id, urlutils.basename(path).decode("utf-8"), 
121
        parent_id)
0.200.158 by Jelmer Vernooij
fetch works \o/
122
    ie.text_size = len(blob.data)
123
    ie.text_sha1 = osutils.sha_string(blob.data)
0.200.159 by Jelmer Vernooij
Fix branch tests.
124
    ie.executable = executable
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
125
    # If there were no changes compared to the base inventory, there's no need 
126
    # for a delta
127
    if (file_id in base_inv and 
128
        base_inv[file_id].parent_id == ie.parent_id and
129
        base_inv[file_id].text_sha1 == ie.text_sha1 and
130
        base_inv[file_id].executable == ie.executable):
131
        return []
132
    # Check what revision we should store
0.200.283 by Jelmer Vernooij
Avoid storing repeated texts for blobs.
133
    parent_keys = []
134
    for pinv in parent_invs:
0.200.285 by Jelmer Vernooij
Simplify blob import code.
135
        if not file_id in pinv:
136
            continue
137
        if pinv[file_id].text_sha1 == ie.text_sha1:
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
138
            # found a revision in one of the parents to use
0.200.283 by Jelmer Vernooij
Avoid storing repeated texts for blobs.
139
            ie.revision = pinv[file_id].revision
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
140
            break
0.200.286 by Jelmer Vernooij
Prevent creating repeated directory texts.
141
        parent_keys.append((file_id, pinv[file_id].revision))
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
142
    if ie.revision is None:
143
        # Need to store a new revision
144
        ie.revision = revision_id
145
        assert file_id is not None
146
        assert ie.revision is not None
147
        texts.add_lines((file_id, ie.revision), parent_keys,
148
            osutils.split_lines(blob.data))
149
        shagitmap.add_entry(blob.sha().hexdigest(), "blob",
150
            (ie.file_id, ie.revision))
151
    if file_id in base_inv:
152
        old_path = base_inv.id2path(file_id)
153
    else:
154
        old_path = None
155
    return [(old_path, path, file_id, ie)]
0.200.261 by Jelmer Vernooij
More formatting fixes.
156
157
0.229.2 by Jelmer Vernooij
Initial work relying on inventory deltas.
158
def import_git_tree(texts, mapping, path, tree, base_inv, parent_id, 
159
    revision_id, parent_invs, shagitmap, lookup_object):
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
160
    """Import a git tree object into a bzr repository.
161
0.200.261 by Jelmer Vernooij
More formatting fixes.
162
    :param texts: VersionedFiles object to add to
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
163
    :param path: Path in the tree
164
    :param tree: A git tree object
0.229.2 by Jelmer Vernooij
Initial work relying on inventory deltas.
165
    :param base_inv: Base inventory against which to return inventory delta
0.229.1 by Jelmer Vernooij
Start working with inventory deltas.
166
    :return: Inventory delta for this subtree
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
167
    """
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
168
    ret = []
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
169
    file_id = mapping.generate_file_id(path)
0.200.297 by Jelmer Vernooij
Cope with non-ascii characters in filenames (needs a test..).
170
    # We just have to hope this is indeed utf-8:
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
171
    ie = InventoryDirectory(file_id, urlutils.basename(path.decode("utf-8")), 
172
        parent_id)
173
    if not file_id in base_inv:
174
        # Newly appeared here
175
        ie.revision = revision_id
176
        texts.add_lines((file_id, ie.revision), [], [])
177
        ret.append((None, path, file_id, ie))
178
    else:
179
        # See if this has changed at all
0.200.287 by Jelmer Vernooij
Skip tree sha's already in the git sha map.
180
        try:
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
181
            base_sha = shagitmap.lookup_tree(path, base_inv.revision_id)
0.200.287 by Jelmer Vernooij
Skip tree sha's already in the git sha map.
182
        except KeyError:
183
            pass
0.200.288 by Jelmer Vernooij
Add test for init-repo.
184
        else:
0.200.300 by Jelmer Vernooij
Fix recursive deletion of dirs.
185
            if base_sha == tree.id:
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
186
                # If nothing has changed since the base revision, we're done
187
                return []
188
    # Remember for next time
0.200.300 by Jelmer Vernooij
Fix recursive deletion of dirs.
189
    existing_children = set()
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
190
    shagitmap.add_entry(tree.id, "tree", (file_id, revision_id))
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
191
    for mode, name, hexsha in tree.entries():
192
        entry_kind = (mode & 0700000) / 0100000
193
        basename = name.decode("utf-8")
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
194
        existing_children.add(basename)
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
195
        if path == "":
196
            child_path = name
197
        else:
198
            child_path = urlutils.join(path, name)
0.200.264 by Jelmer Vernooij
Add more tests.
199
        obj = lookup_object(hexsha)
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
200
        if entry_kind == 0:
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
201
            ret.extend(import_git_tree(texts, mapping, child_path, obj, base_inv, 
202
                file_id, revision_id, parent_invs, shagitmap, lookup_object))
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
203
        elif entry_kind == 1:
0.200.159 by Jelmer Vernooij
Fix branch tests.
204
            fs_mode = mode & 0777
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
205
            ret.extend(import_git_blob(texts, mapping, child_path, obj, base_inv, 
206
                file_id, revision_id, parent_invs, shagitmap, 
207
                bool(fs_mode & 0111)))
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
208
        else:
209
            raise AssertionError("Unknown blob kind, perms=%r." % (mode,))
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
210
    # Remove any children that have disappeared
211
    if file_id in base_inv:
0.200.300 by Jelmer Vernooij
Fix recursive deletion of dirs.
212
        deletable = [v for k,v in base_inv[file_id].children.iteritems() if k not in existing_children]
213
        while deletable:
214
            ie = deletable.pop()
215
            ret.append((base_inv.id2path(ie.file_id), None, ie.file_id, None))
216
            if ie.kind == "directory":
217
                deletable.extend(ie.children.values())
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
218
    return ret
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
219
220
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
221
def import_git_objects(repo, mapping, object_iter, target_git_object_retriever, 
0.200.296 by Jelmer Vernooij
Avoid iterating over all objects just to find the *Commits* to retrieve.
222
        heads, pb=None):
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
223
    """Import a set of git objects into a bzr repository.
224
225
    :param repo: Bazaar repository
226
    :param mapping: Mapping to use
227
    :param object_iter: Iterator over Git objects.
228
    """
229
    # TODO: a more (memory-)efficient implementation of this
0.200.158 by Jelmer Vernooij
fetch works \o/
230
    graph = []
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
231
    root_trees = {}
0.200.158 by Jelmer Vernooij
fetch works \o/
232
    revisions = {}
0.200.296 by Jelmer Vernooij
Avoid iterating over all objects just to find the *Commits* to retrieve.
233
    checked = set()
234
    heads = list(heads)
0.200.301 by Jelmer Vernooij
Cache inventories created.
235
    parent_invs_cache = LRUCache(50)
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
236
    # Find and convert commit objects
0.200.296 by Jelmer Vernooij
Avoid iterating over all objects just to find the *Commits* to retrieve.
237
    while heads:
238
        if pb is not None:
239
            pb.update("finding revisions to fetch", len(graph), None)
240
        head = heads.pop()
241
        assert isinstance(head, str)
242
        o = object_iter[head]
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
243
        if isinstance(o, Commit):
244
            rev = mapping.import_commit(o)
0.200.295 by Jelmer Vernooij
Don't re-import revisions already fetched.
245
            if repo.has_revision(rev.revision_id):
246
                continue
0.200.296 by Jelmer Vernooij
Avoid iterating over all objects just to find the *Commits* to retrieve.
247
            root_trees[rev.revision_id] = o.tree
0.200.158 by Jelmer Vernooij
fetch works \o/
248
            revisions[rev.revision_id] = rev
249
            graph.append((rev.revision_id, rev.parent_ids))
0.200.261 by Jelmer Vernooij
More formatting fixes.
250
            target_git_object_retriever._idmap.add_entry(o.sha().hexdigest(),
251
                "commit", (rev.revision_id, o._tree))
0.200.296 by Jelmer Vernooij
Avoid iterating over all objects just to find the *Commits* to retrieve.
252
            heads.extend([p for p in o.parents if p not in checked])
253
        else:
254
            trace.warning("Unable to import head object %r" % o)
255
        checked.add(head)
0.200.158 by Jelmer Vernooij
fetch works \o/
256
    # Order the revisions
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
257
    # Create the inventory objects
0.200.158 by Jelmer Vernooij
fetch works \o/
258
    for i, revid in enumerate(topo_sort(graph)):
259
        if pb is not None:
260
            pb.update("fetching revisions", i, len(graph))
0.200.296 by Jelmer Vernooij
Avoid iterating over all objects just to find the *Commits* to retrieve.
261
        root_tree = object_iter[root_trees[revid]]
0.200.158 by Jelmer Vernooij
fetch works \o/
262
        rev = revisions[revid]
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
263
        # We have to do this here, since we have to walk the tree and 
0.200.295 by Jelmer Vernooij
Don't re-import revisions already fetched.
264
        # we need to make sure to import the blobs / trees with the right 
0.200.151 by Jelmer Vernooij
Support converting git objects to bzr objects.
265
        # path; this may involve adding them more than once.
266
        def lookup_object(sha):
0.200.301 by Jelmer Vernooij
Cache inventories created.
267
            try:
0.200.217 by Jelmer Vernooij
Avoid reading everything into memory when accessing objects.
268
                return object_iter[sha]
0.200.301 by Jelmer Vernooij
Cache inventories created.
269
            except KeyError:
270
                return target_git_object_retriever[sha]
271
        parent_invs = []
272
        for parent_id in rev.parent_ids:
273
            try:
274
                parent_invs.append(parent_invs_cache[parent_id])
275
            except KeyError:
276
                parent_inv = repo.get_inventory(parent_id)
277
                parent_invs.append(parent_inv)
278
                parent_invs_cache[parent_id] = parent_inv
0.229.1 by Jelmer Vernooij
Start working with inventory deltas.
279
        if parent_invs == []:
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
280
            base_inv = Inventory(root_id=None)
0.229.1 by Jelmer Vernooij
Start working with inventory deltas.
281
        else:
282
            base_inv = parent_invs[0]
0.229.2 by Jelmer Vernooij
Initial work relying on inventory deltas.
283
        inv_delta = import_git_tree(repo.texts, mapping, "", root_tree, 
284
            base_inv, None, revid, parent_invs, 
285
            target_git_object_retriever._idmap, lookup_object)
286
        try:
287
            basis_id = rev.parent_ids[0]
288
        except IndexError:
289
            basis_id = NULL_REVISION
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
290
        rev.inventory_sha1, inv = repo.add_inventory_by_delta(basis_id,
0.229.2 by Jelmer Vernooij
Initial work relying on inventory deltas.
291
                  inv_delta, rev.revision_id, rev.parent_ids)
0.200.301 by Jelmer Vernooij
Cache inventories created.
292
        parent_invs_cache[rev.revision_id] = inv
0.229.1 by Jelmer Vernooij
Start working with inventory deltas.
293
        repo.add_revision(rev.revision_id, rev)
0.200.272 by Jelmer Vernooij
Actually store idmap.
294
    target_git_object_retriever._idmap.commit()
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
295
296
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
297
class InterGitNonGitRepository(InterRepository):
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
298
    """InterRepository that copies revisions from a Git into a non-Git 
299
    repository."""
0.200.135 by Jelmer Vernooij
Add stub for fetching data.
300
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
301
    _matching_repo_format = GitRepositoryFormat()
0.200.143 by Jelmer Vernooij
Reoncile InterGitRepository objects.
302
303
    @staticmethod
304
    def _get_repo_format_to_test():
305
        return None
306
0.200.135 by Jelmer Vernooij
Add stub for fetching data.
307
    def copy_content(self, revision_id=None, pb=None):
308
        """See InterRepository.copy_content."""
309
        self.fetch(revision_id, pb, find_ghosts=False)
310
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
311
    def fetch_objects(self, determine_wants, mapping, pb=None):
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
312
        def progress(text):
0.217.41 by John Carr
Don't fill screen with muttering
313
            pb.update("git: %s" % text.rstrip("\r\n"), 0, 0)
0.200.143 by Jelmer Vernooij
Reoncile InterGitRepository objects.
314
        graph_walker = BzrFetchGraphWalker(self.target, mapping)
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
315
        create_pb = None
316
        if pb is None:
317
            create_pb = pb = ui.ui_factory.nested_progress_bar()
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
318
        target_git_object_retriever = GitObjectConverter(self.target, mapping)
0.200.296 by Jelmer Vernooij
Avoid iterating over all objects just to find the *Commits* to retrieve.
319
        recorded_wants = []
320
321
        def record_determine_wants(heads):
322
            wants = determine_wants(heads)
323
            recorded_wants.extend(wants)
324
            return wants
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
325
        
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
326
        try:
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
327
            self.target.lock_write()
0.200.157 by Jelmer Vernooij
Fix some bit of fetching.
328
            try:
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
329
                self.target.start_write_group()
330
                try:
0.200.296 by Jelmer Vernooij
Avoid iterating over all objects just to find the *Commits* to retrieve.
331
                    objects_iter = self.source.fetch_objects(
332
                                record_determine_wants, 
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
333
                                graph_walker, 
334
                                target_git_object_retriever.__getitem__, 
335
                                progress)
336
                    import_git_objects(self.target, mapping, objects_iter, 
0.200.296 by Jelmer Vernooij
Avoid iterating over all objects just to find the *Commits* to retrieve.
337
                            target_git_object_retriever, recorded_wants, pb)
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
338
                finally:
339
                    self.target.commit_write_group()
0.200.157 by Jelmer Vernooij
Fix some bit of fetching.
340
            finally:
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
341
                self.target.unlock()
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
342
        finally:
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
343
            if create_pb:
344
                create_pb.finished()
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
345
0.200.295 by Jelmer Vernooij
Don't re-import revisions already fetched.
346
    def fetch(self, revision_id=None, pb=None, find_ghosts=False, mapping=None,
347
            fetch_spec=None):
0.200.247 by Jelmer Vernooij
Fix git-import.
348
        self.fetch_refs(revision_id=revision_id, pb=pb, find_ghosts=find_ghosts,
349
                mapping=mapping, fetch_spec=fetch_spec)
350
351
    def fetch_refs(self, revision_id=None, pb=None, find_ghosts=False, 
352
              mapping=None, fetch_spec=None):
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
353
        if mapping is None:
354
            mapping = self.source.get_mapping()
0.226.2 by Jelmer Vernooij
Cope with new fetch_spec argument.
355
        if revision_id is not None:
356
            interesting_heads = [revision_id]
357
        elif fetch_spec is not None:
358
            interesting_heads = fetch_spec.heads
359
        else:
360
            interesting_heads = None
0.200.247 by Jelmer Vernooij
Fix git-import.
361
        self._refs = {}
362
        def determine_wants(refs):
363
            self._refs = refs
0.226.2 by Jelmer Vernooij
Cope with new fetch_spec argument.
364
            if interesting_heads is None:
0.200.247 by Jelmer Vernooij
Fix git-import.
365
                ret = [sha for (ref, sha) in refs.iteritems() if not ref.endswith("^{}")]
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
366
            else:
0.226.2 by Jelmer Vernooij
Cope with new fetch_spec argument.
367
                ret = [mapping.revision_id_bzr_to_foreign(revid)[0] for revid in interesting_heads]
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
368
            return [rev for rev in ret if not self.target.has_revision(mapping.revision_id_foreign_to_bzr(rev))]
0.200.247 by Jelmer Vernooij
Fix git-import.
369
        self.fetch_objects(determine_wants, mapping, pb)
370
        return self._refs
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
371
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
372
    @staticmethod
373
    def is_compatible(source, target):
374
        """Be compatible with GitRepository."""
375
        # FIXME: Also check target uses VersionedFile
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
376
        return (isinstance(source, GitRepository) and 
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
377
                target.supports_rich_root() and
378
                not isinstance(target, GitRepository))
379
380
381
class InterGitRepository(InterRepository):
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
382
    """InterRepository that copies between Git repositories."""
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
383
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
384
    _matching_repo_format = GitRepositoryFormat()
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
385
386
    @staticmethod
387
    def _get_repo_format_to_test():
388
        return None
389
390
    def copy_content(self, revision_id=None, pb=None):
391
        """See InterRepository.copy_content."""
392
        self.fetch(revision_id, pb, find_ghosts=False)
393
394
    def fetch(self, revision_id=None, pb=None, find_ghosts=False, 
0.226.2 by Jelmer Vernooij
Cope with new fetch_spec argument.
395
              mapping=None, fetch_spec=None):
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
396
        if mapping is None:
397
            mapping = self.source.get_mapping()
398
        def progress(text):
0.200.261 by Jelmer Vernooij
More formatting fixes.
399
            trace.info("git: %s", text)
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
400
        r = self.target._git
0.226.2 by Jelmer Vernooij
Cope with new fetch_spec argument.
401
        if revision_id is not None:
0.200.195 by Jelmer Vernooij
Return mapping in revision_id_bzr_to_foreign() as required by the interface.
402
            args = [mapping.revision_id_bzr_to_foreign(revision_id)[0]]
0.226.2 by Jelmer Vernooij
Cope with new fetch_spec argument.
403
        elif fetch_spec is not None:
404
            args = [mapping.revision_id_bzr_to_foreign(revid)[0] for revid in fetch_spec.heads]
0.200.247 by Jelmer Vernooij
Fix git-import.
405
        if fetch_spec is None and revision_id is None:
406
            determine_wants = r.object_store.determine_wants_all
0.226.2 by Jelmer Vernooij
Cope with new fetch_spec argument.
407
        else:
0.200.247 by Jelmer Vernooij
Fix git-import.
408
            determine_wants = lambda x: [y for y in args if not y in r.object_store]
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
409
410
        graphwalker = SimpleFetchGraphWalker(r.heads().values(), r.get_parents)
411
        f, commit = r.object_store.add_pack()
412
        try:
413
            self.source._git.fetch_pack(path, determine_wants, graphwalker, f.write, progress)
414
            f.close()
415
            commit()
416
        except:
417
            f.close()
418
            raise
419
420
    @staticmethod
421
    def is_compatible(source, target):
422
        """Be compatible with GitRepository."""
423
        return (isinstance(source, GitRepository) and 
424
                isinstance(target, GitRepository))