Exemple #1
0
    def _unpack_changesets(self, chunkiter, mapping, pb, limit=None):
        def lookup_foreign_revid(foreign_revid):
            lookup_foreign_revid = getattr(self.source,
                                           "lookup_foreign_revision_id", None)
            if lookup_foreign_revid is not None:
                return lookup_foreign_revid(foreign_revid, mapping)
            return mapping.revision_id_foreign_to_bzr(foreign_revid)

        def get_hg_revision(hgid):
            revid = lookup_foreign_revid(hgid)
            return self._target_overlay.get_changeset_text_by_revid(revid)

        for i, (fulltext, hgkey, hgparents, csid) in enumerate(
                unpack_chunk_iter(chunkiter, get_hg_revision)):
            pb.update("fetching changesets", i)
            if limit is not None and i >= limit:
                continue
            (manifest, user, (time, timezone), files, desc, extra) = \
                parse_changeset(fulltext)
            key = mapping.revision_id_foreign_to_bzr(hgkey)
            parent_ids = as_bzr_parents(hgparents, lookup_foreign_revid)
            rev, fileids = mapping.import_revision(key, parent_ids, hgkey,
                                                   manifest, user,
                                                   (time, timezone), desc,
                                                   extra)
            self._files[rev.revision_id] = files
            self._manifest2rev_map[manifest].add(rev.revision_id)
            self._revisions[rev.revision_id] = rev
Exemple #2
0
    def _unpack_texts(self, cg, mapping, kind_map, pb):
        i = 0
        # Texts
        while True:
            path = mercurial.changegroup.getchunk(cg)
            if not path:
                break
            i += 1
            pb.update("fetching texts", i, len(kind_map))
            itertextchunks = chunkiter(cg)

            def get_text(node):
                try:
                    key, kind, text_parents = kind_map[(path, node)][0]
                except KeyError:
                    return self._target_overlay.get_text_by_path_and_node(
                        path, node)
                else:
                    return self._get_target_fulltext(key)

            for fulltext, hgkey, hgparents, csid in unpack_chunk_iter(
                    itertextchunks, get_text):
                for (fileid,
                     revision), kind, text_parents in kind_map[(path, hgkey)]:
                    record = self._create_text_record(fileid, revision,
                                                      text_parents, kind,
                                                      fulltext)
                    self._target_overlay.idmap.insert_text(
                        path, hgkey, fileid, revision)
                    self._text_metadata[record.key] = (
                        record.sha1, len(record.get_bytes_as("fulltext")))
                    yield record
Exemple #3
0
    def _unpack_manifests(self, chunkiter, mapping, kind_map, todo, pb):
        """Unpack the manifest deltas.

        :param chunkiter: Iterator over delta chunks for the manifest.
        :param mapping: Bzr<->Hg mapping
        :param pb: Progress bar
        """
        chunks = unpack_chunk_iter(chunkiter,
                                   self._target_overlay.get_manifest_text)
        for i, (fulltext, hgkey, hgparents, csid) in enumerate(chunks):
            pb.update("fetching manifests", i, len(self._revisions))
            (manifest, flags) = parse_manifest(fulltext)
            for revid in self._manifest2rev_map[hgkey]:
                todo.append(revid)
                yield (revid, self._revisions[revid].parent_ids, fulltext)
                self._process_manifest(manifest, flags, revid, mapping,
                                       kind_map)