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