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
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
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)