=== modified file '__init__.py' --- __init__.py 2007-01-19 17:03:04 +0000 +++ __init__.py 2007-07-25 16:36:34 +0000 @@ -64,10 +64,14 @@ help='Use cvs to extract texts.'), option.Option('use-rcs', help='Use rcs to extract texts. (default)'), + option.Option('use-dirstate-tags', + help='Use bzr metadata tags rather than' + ' a branch per tag'), ] def run(self, cvsroot=None, module=None, output=None, cvsps_dump=None, - encoding=None, verify=True, use_cvs=False, use_rcs=False): + encoding=None, verify=True, use_cvs=False, use_rcs=False, + use_dirstate_tags=False): from cvsps import importer if cvsroot.startswith(':pserver:') or cvsroot.startswith(':ext:'): @@ -78,11 +82,18 @@ if not use_cvs and not use_rcs: # Default is to use rcs, since it is slightly faster. use_cvs = False + + if use_dirstate_tags: + tag_style = 'dirstate' + else: + tag_style = 'branch' + importer = importer.Importer(cvsroot, module, output, cvsps_dump=cvsps_dump, encoding=encoding, verify=verify, - use_cvs_for_text=use_cvs) + use_cvs_for_text=use_cvs, + tag_style=tag_style) importer.process() === modified file 'cvsps/importer.py' --- cvsps/importer.py 2007-02-12 18:03:03 +0000 +++ cvsps/importer.py 2007-07-25 18:14:22 +0000 @@ -597,11 +597,12 @@ """ def __init__(self, bzr_repo, cvs_root, cvs_module, map_file, - verify=True, use_cvs_for_text=True): + verify=True, use_cvs_for_text=True, tag_style=None): self._bzr_repo = bzr_repo self._map_file = map_file self._cvs_root = cvs_root self._cvs_module = cvs_module + self._tag_style = tag_style or 'branch' self._working_path = osutils.pathjoin( self._bzr_repo.bzrdir.root_transport.local_abspath('.'), @@ -623,7 +624,7 @@ self._n_existing_patches = 0 self._n_tags = 0 - def handle_patchset(self, patchset): + def handle_patchset(self, patchset, pb): """Handle one of the patchsets from cvs to bzr""" revision_id = self._map_file.get(patchset.num) @@ -653,7 +654,11 @@ self._n_patches += 1 if patchset.tag is not None: - self._handle_tag(patchset, revision_id) + if self._tag_style == 'dirstate': + self._handle_tag_dirstate(patchset, revision_id, pb) + else: + self._handle_tag_branch(patchset, revision_id) + action += '+tag' return revision_id, action @@ -830,8 +835,13 @@ os.makedirs(branch_path) # Create a new one + format = bzrdir.BzrDirFormat.get_default_format() + if self._tag_style == 'dirstate' and not format.get_branch_format().supports_tags(): + format = bzrdir.format_registry.get('dirstate-tags')() + target_branch = bzrdir.BzrDir.create_branch_convenience(branch_path, - force_new_tree=False) + force_new_tree=False, + format=format) self._set_repo(target_branch) target_branch.lock_write() self._cache_branch(patchset.branch, target_branch) @@ -875,7 +885,23 @@ return revision_id - def _handle_tag(self, patchset, revision_id): + def _handle_tag_dirstate(self, patchset, revision_id, pb): + """Create a tag with the given revision id.""" + # TODO: toshio 20070725 We probably want to check that the branch + # format supports tags and convert it if it doesn't. However, the + # repository is locked at this point so it's not as simple as the + # below code. + # + # Currently, I'm making sure that the branches support tags when + # we create them. + #if not self._cur_bzr_branch.supports_tags(): + # newFormat = bzrdir.format_registry.get('dirstate-tags')() + # converter = self._cur_bzr_branch.bzrdir._format.get_converter(newFormat) + # self._cur_bzr_branch = converter.convert(self._cur_bzr_branch.bzrdir, pb) + self._cur_bzr_branch.tags.set_tag(patchset.tag, revision_id) + self._n_tags += 1 + + def _handle_tag_branch(self, patchset, revision_id): """Create a tag with the given revision id.""" tag_branch_path = self._get_tag_branch_path(patchset.tag) try: @@ -969,10 +995,12 @@ """Import a CVS project into bzr.""" def __init__(self, cvsroot, cvs_module, output_base, cvsps_dump=None, - encoding=None, verify=True, use_cvs_for_text=True): + encoding=None, verify=True, use_cvs_for_text=True, + tag_style=None): self._cvs_root = osutils.abspath(cvsroot) self._cvs_module = cvs_module self._use_cvs_for_text = use_cvs_for_text + self._tag_style = tag_style or 'branch' self._verify = verify self.output_base = output_base @@ -1016,7 +1044,7 @@ os.makedirs(path) self._paths_created = True - def open_or_create_bzr_repo(self): + def open_or_create_bzr_repo(self, pb): """Open the bzr repository, creating it if needed.""" self.setup_directories() bzr_repo_transport = transport.get_transport(self._repo_path) @@ -1024,6 +1052,11 @@ a_bzrdir = bzrdir.BzrDir.open_from_transport(bzr_repo_transport) except errors.NotBranchError: return self._create_bzr_repo(bzr_repo_transport) + if self._tag_style == 'dirstate' and ( + not a_bzrdir.find_branch_format().supports_tags()): + newFormat = bzrdir.format_registry.get('dirstate-tags')() + converter = a_bzrdir._format.get_converter(newFormat) + a_bzrdir = converter.convert(a_bzrdir, pb) return a_bzrdir.open_repository() def _create_bzr_repo(self, a_transport): @@ -1033,6 +1066,10 @@ except errors.FileExists: pass fmt = bzrdir.BzrDirFormat.get_default_format() + if self._tag_style == 'dirstate' and not ( + fmt.get_branch_format().supports_tags()): + fmt = bzrdir.format_registry.get('dirstate-tags')() + control = fmt.initialize_on_transport(a_transport) repo = control.create_repository(shared=True) repo.set_make_working_trees(False) @@ -1065,7 +1102,7 @@ n_patchsets = len(patchsets) for i, patchset in enumerate(patchsets): try: - rev_id, action = cvs_to_bzr.handle_patchset(patchset) + rev_id, action = cvs_to_bzr.handle_patchset(patchset, pb) except KeyboardInterrupt: if pb is not None: pb.clear() @@ -1101,7 +1138,11 @@ def process(self): """Start converting the repository.""" - repo = self.open_or_create_bzr_repo() + pb = ui.ui_factory.nested_progress_bar() + try: + repo = self.open_or_create_bzr_repo(pb=pb) + finally: + pb.finished() # Maintain a repository wide lock for the whole transaction # that should help cache stuff. # TODO: jam 20061121 This may actually cache *too* much. Consider @@ -1115,7 +1156,8 @@ try: cvs_to_bzr = CVSToBzr(repo, self._cvs_root, self._cvs_module, map_file, verify=self._verify, - use_cvs_for_text=self._use_cvs_for_text) + use_cvs_for_text=self._use_cvs_for_text, + tag_style=self._tag_style) start_time = time.time() pb = ui.ui_factory.nested_progress_bar() try: