Rev 2857: Add revert --forget-merges in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Tue Sep 25 04:21:11 BST 2007


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 2857
revision-id: pqm at pqm.ubuntu.com-20070925032108-y6nxt0xmghqldn4g
parent: pqm at pqm.ubuntu.com-20070925020712-sf3qg1j3wh0l0hz8
parent: mbp at sourcefrog.net-20070924051837-6qvnc9tca3y4xflp
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Tue 2007-09-25 04:21:08 +0100
message:
  Add revert --forget-merges
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
  bzrlib/tests/blackbox/test_revert.py test_revert.py-20060124160917-485ce9de629c182c
    ------------------------------------------------------------
    revno: 2851.2.1
    merged: mbp at sourcefrog.net-20070924051837-6qvnc9tca3y4xflp
    parent: pqm at pqm.ubuntu.com-20070924042807-nfjwj1voh6a8zddf
    committer: Martin Pool <mbp at sourcefrog.net>
    branch nick: forget-merges
    timestamp: Mon 2007-09-24 15:18:37 +1000
    message:
      Add revert --forget-merges
=== modified file 'NEWS'
--- a/NEWS	2007-09-24 20:13:29 +0000
+++ b/NEWS	2007-09-25 03:21:08 +0000
@@ -25,7 +25,10 @@
 
   FEATURES:
 
-   * New ``reconfigure`` command (Aaron Bentley)
+   * New ``reconfigure`` command. (Aaron Bentley)
+
+   * New ``revert --forget-merges`` command, which removes the record of a pending 
+     merge without affecting the working tree contents.  (Martin Pool)
 
   PERFORMANCE:
 

=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2007-09-24 11:05:05 +0000
+++ b/bzrlib/builtins.py	2007-09-25 03:21:08 +0000
@@ -3048,19 +3048,24 @@
 
     _see_also = ['cat', 'export']
     takes_options = [
-            'revision',
-            Option('no-backup', "Do not save backups of reverted files."),
-            ]
+        'revision',
+        Option('no-backup', "Do not save backups of reverted files."),
+        Option('forget-merges',
+               'Remove pending merge marker, without changing any files.'),
+        ]
     takes_args = ['file*']
 
-    def run(self, revision=None, no_backup=False, file_list=None):
-        if file_list is not None:
-            if len(file_list) == 0:
-                raise errors.BzrCommandError("No files specified")
-        
+    def run(self, revision=None, no_backup=False, file_list=None,
+            forget_merges=None):
         tree, file_list = tree_files(file_list)
+        if forget_merges:
+            tree.set_parent_ids(tree.get_parent_ids()[:1])
+        else:
+            self._revert_tree_to_revision(tree, revision, file_list, no_backup)
+
+    @staticmethod
+    def _revert_tree_to_revision(tree, revision, file_list, no_backup):
         if revision is None:
-            # FIXME should be tree.last_revision
             rev_id = tree.last_revision()
         elif len(revision) != 1:
             raise errors.BzrCommandError('bzr revert --revision takes exactly 1 argument')
@@ -3068,7 +3073,7 @@
             rev_id = revision[0].in_history(tree.branch).rev_id
         pb = ui.ui_factory.nested_progress_bar()
         try:
-            tree.revert(file_list, 
+            tree.revert(file_list,
                         tree.branch.repository.revision_tree(rev_id),
                         not no_backup, pb, report_changes=True)
         finally:

=== modified file 'bzrlib/tests/blackbox/test_revert.py'
--- a/bzrlib/tests/blackbox/test_revert.py	2007-06-27 19:13:50 +0000
+++ b/bzrlib/tests/blackbox/test_revert.py	2007-09-24 05:18:37 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2005 Canonical Ltd
+# Copyright (C) 2005, 2007 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -186,3 +186,24 @@
         out, err = self.run_bzr('revert -r -2')
         self.assertEqual('', out)
         self.assertEqual('-D  file\n', err)
+
+    def test_revert_forget_merges(self):
+        # revert --forget-merges removes any pending merges into the tree, but
+        # leaves the files unchanged
+        tree = self.make_branch_and_tree('.')
+        # forget-merges before first commit, though pointless, does not fail
+        self.run_bzr(['revert', '--forget-merges'])
+        self.build_tree(['file'])
+        first_rev_id = tree.commit('initial commit')
+        self.build_tree_contents([('file', 'new content')])
+        existing_parents = tree.get_parent_ids()
+        self.assertEquals([first_rev_id], existing_parents)
+        merged_parents = existing_parents + ['merged-in-rev']
+        tree.set_parent_ids(merged_parents)
+        self.assertEquals(merged_parents, tree.get_parent_ids())
+        self.run_bzr(['revert', '--forget-merges'])
+        self.assertEquals([first_rev_id], tree.get_parent_ids())
+        # changed files are not reverted
+        self.assertFileEqual('new content', 'file')
+        # you can give it the path of a tree
+        self.run_bzr(['revert', '--forget-merges', tree.abspath('.')])




More information about the bazaar-commits mailing list