Rev 115: Add --new-nick option to replay and rebase commands. in http://people.ubuntu.com/~robertc/baz2.0/plugins/rebase/dev

Robert Collins robertc at robertcollins.net
Thu Jan 15 06:07:30 GMT 2009


At http://people.ubuntu.com/~robertc/baz2.0/plugins/rebase/dev

------------------------------------------------------------
revno: 115
revision-id: robertc at robertcollins.net-20090115060729-fj1p5208cujanmzc
parent: jelmer at samba.org-20081208203251-vjastxd191b2hr13
committer: Robert Collins <robertc at robertcollins.net>
branch nick: dev
timestamp: Thu 2009-01-15 17:07:29 +1100
message:
  Add --new-nick option to replay and rebase commands.
=== modified file 'NEWS'
--- a/NEWS	2008-11-18 00:23:44 +0000
+++ b/NEWS	2009-01-15 06:07:29 +0000
@@ -1,5 +1,10 @@
 0.4.3	UNRELEASED
 
+ FEATURES
+
+  * --new-nick to replay and rebase will recreate the nick for revisions that
+    are rewritten. (Robert Collins)
+
 0.4.2	2008-11-18
 
  FEATURES

=== modified file '__init__.py'
--- a/__init__.py	2008-11-18 00:23:44 +0000
+++ b/__init__.py	2009-01-15 06:07:29 +0000
@@ -100,12 +100,15 @@
         Option('pending-merges',
             help="Rebase pending merges onto local branch."),
         Option('onto', help='Different revision to replay onto.',
-            type=str)]
+            type=str),
+        Option('new-nick',
+            help='Change revisions to have the target branch nick.'),
+        ]
     
     @display_command
     def run(self, upstream_location=None, onto=None, revision=None,
-            merge_type=None, verbose=False, dry_run=False,
-            always_rebase_merges=False, pending_merges=False):
+        merge_type=None, verbose=False, dry_run=False,
+        always_rebase_merges=False, pending_merges=False, new_nick=False):
         from bzrlib.branch import Branch
         from bzrlib.revisionspec import RevisionSpec
         from bzrlib.workingtree import WorkingTree
@@ -218,7 +221,8 @@
                 # Start executing plan
                 try:
                     rebase(wt.branch.repository, replace_map,
-                           workingtree_replay(wt, merge_type=merge_type))
+                           workingtree_replay(wt, merge_type=merge_type,
+                           new_nick=new_nick))
                 except ConflictsInTree:
                     raise BzrCommandError("A conflict occurred replaying a "
                         "commit. Resolve the conflict and run "
@@ -322,11 +326,14 @@
 
     """
     
-    takes_options = ['revision', 'merge-type']
+    takes_options = ['revision', 'merge-type',
+        Option('new-nick',
+            help='Change revisions to have the target branch nick.'),
+        ]
     takes_args = ['location']
     hidden = True
 
-    def run(self, location, revision=None, merge_type=None):
+    def run(self, location, revision=None, merge_type=None, new_nick=False):
         from bzrlib.branch import Branch
         from bzrlib.workingtree import WorkingTree
         from bzrlib import ui
@@ -361,8 +368,8 @@
                 wt.branch.repository.fetch(from_branch.repository, revid)
                 newrevid = regenerate_default_revid(wt.branch.repository, revid)
                 replay_delta_workingtree(wt, revid, newrevid,
-                                         [wt.last_revision()],
-                                         merge_type=merge_type)
+                    [wt.last_revision()], merge_type=merge_type,
+                    new_nick=new_nick)
         finally:
             pb.finished()
             wt.unlock()

=== modified file 'rebase.py'
--- a/rebase.py	2008-08-31 20:30:21 +0000
+++ b/rebase.py	2009-01-15 06:07:29 +0000
@@ -147,7 +147,8 @@
     """
     assert start_revid is None or start_revid in todo_set, \
         "invalid start revid(%r), todo_set(%r)" % (start_revid, todo_set)
-    assert stop_revid is None or stop_revid in todo_set, "invalid stop_revid"
+    assert stop_revid is None or stop_revid in todo_set, \
+        "invalid stop_revid (%r), todo_set(%r)" % (stop_revid, todo_set)
     replace_map = {}
     parent_map = graph.get_parent_map(todo_set)
     order = topo_sort(parent_map)
@@ -395,12 +396,14 @@
         raise
 
 
-def commit_rebase(wt, oldrev, newrevid):
+def commit_rebase(wt, oldrev, newrevid, new_nick=False):
     """Commit a rebase.
     
     :param wt: Mutable tree with the changes.
     :param oldrev: Revision info of new revision to commit.
-    :param newrevid: New revision id."""
+    :param newrevid: New revision id.
+    :param new_nick: Generate new nick's in revisions.
+    """
     assert oldrev.revision_id != newrevid, "Invalid revid %r" % newrevid
     revprops = dict(oldrev.properties)
     revprops[REVPROP_REBASE_OF] = oldrev.revision_id
@@ -408,6 +411,8 @@
     author = oldrev.get_apparent_author()
     if author == committer or 'author' in revprops:
         author = None
+    if new_nick and 'branch-nick' in revprops:
+        del revprops['branch-nick']
     wt.commit(message=oldrev.message, timestamp=oldrev.timestamp, 
               timezone=oldrev.timezone, revprops=revprops, rev_id=newrevid,
               committer=committer, author=author)
@@ -447,14 +452,15 @@
         return oldparents[0]
 
 
-def replay_delta_workingtree(wt, oldrevid, newrevid, newparents, 
-                             merge_type=None):
+def replay_delta_workingtree(wt, oldrevid, newrevid, newparents,
+    merge_type=None, new_nick=False):
     """Replay a commit in a working tree, with a different base.
 
     :param wt: Working tree in which to do the replays.
     :param oldrevid: Old revision id
     :param newrevid: New revision id
     :param newparents: New parent revision ids
+    :param new_nick: Generate new nick's in revisions.
     """
     repository = wt.branch.repository
     if merge_type is None:
@@ -480,19 +486,21 @@
     merger.do_merge()
     for newparent in newparents[1:]:
         wt.add_pending_merge(newparent)
-    commit_rebase(wt, oldrev, newrevid)
-
-
-def workingtree_replay(wt, map_ids=False, merge_type=None):
+    commit_rebase(wt, oldrev, newrevid, new_nick=new_nick)
+
+
+def workingtree_replay(wt, map_ids=False, merge_type=None, new_nick=False):
     """Returns a function that can replay revisions in wt.
 
     :param wt: Working tree in which to do the replays.
-    :param map_ids: Whether to try to map between file ids (False for path-based merge)
+    :param map_ids: Whether to try to map between file ids (False for
+        path-based merge)
+    :param new_nick: Generate new nicks for revisions that are copied across.
     """
     def replay(repository, oldrevid, newrevid, newparents):
         assert wt.branch.repository == repository, "Different repository"
-        return replay_delta_workingtree(wt, oldrevid, newrevid, newparents, 
-                                        merge_type=merge_type)
+        return replay_delta_workingtree(wt, oldrevid, newrevid, newparents,
+            merge_type=merge_type, new_nick=new_nick)
     return replay
 
 

=== modified file 'test_blackbox.py'
--- a/test_blackbox.py	2008-09-01 17:51:22 +0000
+++ b/test_blackbox.py	2009-01-15 06:07:29 +0000
@@ -237,27 +237,19 @@
         self.run_bzr('commit -m merge')
         self.run_bzr('rebase')
 
-class ReplayTests(ExternalBase):
-    def test_replay(self):
-        os.mkdir('main')
-        os.chdir('main')
-        self.run_bzr('init')
-        open('bar', 'w').write('42')
-        self.run_bzr('add')
-        self.run_bzr('commit -m that')
-        os.mkdir('../feature')
-        os.chdir('../feature')
-        self.run_bzr('init')
-        branch = Branch.open('.')
-        open('hello', 'w').write("my data")
-        self.run_bzr('add')
-        self.run_bzr('commit -m this')
-        self.assertEquals(1, len(branch.revision_history()))
-        self.run_bzr('replay -r1 ../main')
-        self.assertEquals(2, len(branch.revision_history()))
-        self.assertTrue(os.path.exists('bar'))
-
-class ReplayTests(ExternalBase):
+    def test_new_nick(self):
+        source = self.make_branch_and_tree('main')
+        revid = source.commit('1')
+        other = source.bzrdir.sprout('other').open_workingtree()
+        other.commit('2', revprops={'branch-nick':'bad-nick'})
+        source.commit('trigger')
+        self.run_bzr('rebase --new-nick ../main', working_dir='other')
+        rev = other.branch.repository.get_revision(other.last_revision())
+        self.assertEqual('other', rev.properties['branch-nick'])
+    
+
+class ReplayTests(ExternalBase):
+
     def test_replay(self):
         os.mkdir('main')
         os.chdir('main')
@@ -278,3 +270,13 @@
         self.run_bzr('replay -r1.. ../main')
         self.assertEquals(3, len(branch.revision_history()))
         self.assertTrue(os.path.exists('bar'))
+
+    def test_new_nick(self):
+        source = self.make_branch_and_tree('main')
+        revid = source.commit('1')
+        other = source.bzrdir.sprout('other').open_workingtree()
+        source.commit('2')
+        self.run_bzr('replay -r -1  --new-nick ../main', working_dir='other')
+        rev = other.branch.repository.get_revision(other.last_revision())
+        self.assertEqual('other', rev.properties['branch-nick'])
+    




More information about the bazaar-commits mailing list