emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Emacs Bazaar repository


From: Toshio Kuratomi
Subject: Re: Emacs Bazaar repository
Date: Sun, 16 Mar 2008 16:47:37 -0500
User-agent: Thunderbird 2.0.0.12 (X11/20080226)

Stefan Monnier wrote:
After a few false starts I have been successful (at least as far as I
can tell) in importing the Emacs CVS repository into Bazaar.  If anyone
is interested in playing with the results you can check out the HEAD of
the CVS repository with:

Another piece of information that I find missing is all the tags.
It seems they are present in the form of
http://bzr.notengoamigos.org/emacs/tags pseudo branches, but they're not
present in the form of actual Bzr tags.

I wrote a patch about six months to a year ago to deal with this.
https://bugs.launchpad.net/bzr-cvsps-import/+bug/128326

I'm attaching the patch -- but it might need to be updated.

-Toshio
=== 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:

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]