/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to fetch.py

Add FOSDEM roundtripping notes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
from bzrlib import osutils, ui, urlutils
18
 
from bzrlib.errors import InvalidRevisionId, NoSuchRevision
 
18
from bzrlib.errors import InvalidRevisionId
19
19
from bzrlib.inventory import Inventory
20
20
from bzrlib.repository import InterRepository
21
21
from bzrlib.trace import info
26
26
        GitRepository, 
27
27
        GitFormat,
28
28
        )
29
 
from bzrlib.plugins.git.shamap import GitObjectConverter
30
29
from bzrlib.plugins.git.remote import RemoteGitRepository
31
30
 
32
31
import dulwich as git
127
126
            raise AssertionError("Unknown blob kind, perms=%r." % (mode,))
128
127
 
129
128
 
130
 
def import_git_objects(repo, mapping, object_iter, target_git_object_retriever, 
131
 
        pb=None):
 
129
def import_git_objects(repo, mapping, object_iter, pb=None):
132
130
    """Import a set of git objects into a bzr repository.
133
131
 
134
132
    :param repo: Bazaar repository
161
159
        def lookup_object(sha):
162
160
            if sha in object_iter:
163
161
                return object_iter[sha]
164
 
            return target_git_object_retriever(sha)
 
162
            return reconstruct_git_object(repo, mapping, sha)
165
163
        parent_invs = [repo.get_inventory(r) for r in rev.parent_ids]
166
164
        import_git_tree(repo, mapping, "", root_tree, inv, parent_invs, 
167
165
            lookup_object)
168
166
        repo.add_revision(rev.revision_id, rev, inv)
169
167
 
170
168
 
 
169
def reconstruct_git_commit(repo, rev):
 
170
    raise NotImplementedError(self.reconstruct_git_commit)
 
171
 
 
172
 
171
173
def reconstruct_git_object(repo, mapping, sha):
172
 
    import pdb; pdb.set_trace()
 
174
    # Commit
 
175
    revid = mapping.revision_id_foreign_to_bzr(sha)
 
176
    try:
 
177
        rev = repo.get_revision(revid)
 
178
    except NoSuchRevision:
 
179
        pass
 
180
    else:
 
181
        return reconstruct_git_commit(rev)
173
182
 
174
183
    # TODO: Tree
175
184
    # TODO: Blob
188
197
        """See InterRepository.copy_content."""
189
198
        self.fetch(revision_id, pb, find_ghosts=False)
190
199
 
191
 
    def fetch_objects(self, determine_wants, mapping, pb=None):
 
200
    def fetch(self, revision_id=None, pb=None, find_ghosts=False, 
 
201
              mapping=None):
 
202
        if mapping is None:
 
203
            mapping = self.source.get_mapping()
192
204
        def progress(text):
193
205
            pb.update("git: %s" % text.rstrip("\r\n"), 0, 0)
 
206
        def determine_wants(heads):
 
207
            if revision_id is None:
 
208
                ret = heads.values()
 
209
            else:
 
210
                ret = [mapping.revision_id_bzr_to_foreign(revision_id)[0]]
 
211
            return [rev for rev in ret if not self.target.has_revision(mapping.revision_id_foreign_to_bzr(rev))]
194
212
        graph_walker = BzrFetchGraphWalker(self.target, mapping)
195
213
        create_pb = None
196
214
        if pb is None:
197
215
            create_pb = pb = ui.ui_factory.nested_progress_bar()
198
 
        target_git_object_retriever = GitObjectConverter(self.target, mapping)
199
 
        
200
216
        try:
201
217
            self.target.lock_write()
202
218
            try:
203
219
                self.target.start_write_group()
204
220
                try:
205
221
                    objects_iter = self.source.fetch_objects(determine_wants, 
206
 
                                graph_walker, 
207
 
                                target_git_object_retriever.__getitem__, 
208
 
                                progress)
209
 
                    import_git_objects(self.target, mapping, objects_iter, 
210
 
                            target_git_object_retriever, pb)
 
222
                                graph_walker, progress)
 
223
                    import_git_objects(self.target, mapping, objects_iter, pb)
211
224
                finally:
212
225
                    self.target.commit_write_group()
213
226
            finally:
216
229
            if create_pb:
217
230
                create_pb.finished()
218
231
 
219
 
    def fetch(self, revision_id=None, pb=None, find_ghosts=False, 
220
 
              mapping=None):
221
 
        if mapping is None:
222
 
            mapping = self.source.get_mapping()
223
 
        def determine_wants(heads):
224
 
            if revision_id is None:
225
 
                ret = heads.values()
226
 
            else:
227
 
                ret = [mapping.revision_id_bzr_to_foreign(revision_id)[0]]
228
 
            return [rev for rev in ret if not self.target.has_revision(mapping.revision_id_foreign_to_bzr(rev))]
229
 
        return self.fetch_objects(determine_wants, mapping, pb)
230
 
 
231
232
    @staticmethod
232
233
    def is_compatible(source, target):
233
234
        """Be compatible with GitRepository."""