Rev 4141: (jamesw) Shelve now supports shelving changes to symlink targets. in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Fri Mar 13 03:16:29 GMT 2009


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

------------------------------------------------------------
revno: 4141
revision-id: pqm at pqm.ubuntu.com-20090313031626-cy59iwvd5csfcmez
parent: pqm at pqm.ubuntu.com-20090313023629-g9v7xglb6rvfopba
parent: james.westby at canonical.com-20090313012436-w3ui1gnjjv5b42oe
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Fri 2009-03-13 03:16:26 +0000
message:
  (jamesw) Shelve now supports shelving changes to symlink targets.
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/shelf.py                prepare_shelf.py-20081005181341-n74qe6gu1e65ad4v-1
  bzrlib/shelf_ui.py             shelver.py-20081005210102-33worgzwrtdw0yrm-1
  bzrlib/tests/test_shelf.py     test_prepare_shelf.p-20081005181341-n74qe6gu1e65ad4v-2
  bzrlib/tests/test_shelf_ui.py  test_shelf_ui.py-20081027155203-wtcuazg85wp9u4fv-1
    ------------------------------------------------------------
    revno: 4137.1.2
    revision-id: james.westby at canonical.com-20090313012436-w3ui1gnjjv5b42oe
    parent: james.westby at canonical.com-20090313001311-qbjce58f0fcke5p4
    parent: james.westby at canonical.com-20090312082635-s0ofpsqb647kleru
    committer: James Westby <james.westby at canonical.com>
    branch nick: jamesw-integration
    timestamp: Fri 2009-03-13 11:24:36 +1000
    message:
      Shelve can now shelve changes to a symlink's target.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/shelf.py                prepare_shelf.py-20081005181341-n74qe6gu1e65ad4v-1
      bzrlib/shelf_ui.py             shelver.py-20081005210102-33worgzwrtdw0yrm-1
      bzrlib/tests/test_shelf.py     test_prepare_shelf.p-20081005181341-n74qe6gu1e65ad4v-2
      bzrlib/tests/test_shelf_ui.py  test_shelf_ui.py-20081027155203-wtcuazg85wp9u4fv-1
    ------------------------------------------------------------
    revno: 4119.5.1
    revision-id: james.westby at canonical.com-20090312082635-s0ofpsqb647kleru
    parent: james.westby at canonical.com-20090312030241-8owjma3iw40a8ulv
    committer: James Westby <james.westby at canonical.com>
    branch nick: bzr.dev.shelve-symlink
    timestamp: Thu 2009-03-12 18:26:35 +1000
    message:
      Shelve can now shelve changes to a symlink's target.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/shelf.py                prepare_shelf.py-20081005181341-n74qe6gu1e65ad4v-1
      bzrlib/shelf_ui.py             shelver.py-20081005210102-33worgzwrtdw0yrm-1
      bzrlib/tests/test_shelf.py     test_prepare_shelf.p-20081005181341-n74qe6gu1e65ad4v-2
      bzrlib/tests/test_shelf_ui.py  test_shelf_ui.py-20081027155203-wtcuazg85wp9u4fv-1
=== modified file 'NEWS'
--- a/NEWS	2009-03-13 01:27:47 +0000
+++ b/NEWS	2009-03-13 03:16:26 +0000
@@ -47,6 +47,9 @@
       the delta is empty, and now correctly claims not to support tags.
       (Andrea Bolognani)
 
+    * Shelve can now shelve changes to a symlink target.
+      (James Westby, #341558)
+
   DOCUMENTATION:
 
     * The generated manpage now explicitly lists aliases as commands.

=== modified file 'bzrlib/shelf.py'
--- a/bzrlib/shelf.py	2009-03-12 05:35:18 +0000
+++ b/bzrlib/shelf.py	2009-03-13 01:24:36 +0000
@@ -69,6 +69,7 @@
            ('rename', file_id, target_path, work_path)
            ('change kind', file_id, target_kind, work_kind, target_path)
            ('modify text', file_id)
+           ('modify target', file_id, target_target, work_target)
         """
         for (file_id, paths, changed, versioned, parents, names, kind,
              executable) in self.iter_changes:
@@ -87,6 +88,11 @@
 
                 if kind[0] != kind [1]:
                     yield ('change kind', file_id, kind[0], kind[1], paths[0])
+                elif kind[0] == 'symlink':
+                    t_target = self.target_tree.get_symlink_target(file_id)
+                    w_target = self.work_tree.get_symlink_target(file_id)
+                    yield ('modify target', file_id, paths[0], t_target,
+                            w_target)
                 elif changed:
                     yield ('modify text', file_id)
 
@@ -104,6 +110,23 @@
         shelf_parent = self.shelf_transform.trans_id_file_id(parents[1])
         self.shelf_transform.adjust_path(names[1], shelf_parent, s_trans_id)
 
+    def shelve_modify_target(self, file_id):
+        """Shelve a change of symlink target.
+
+        :param file_id: The file id of the symlink which changed target.
+        :param new_target: The target that the symlink should have due
+            to shelving.
+        """
+        new_target = self.target_tree.get_symlink_target(file_id)
+        w_trans_id = self.work_transform.trans_id_file_id(file_id)
+        self.work_transform.delete_contents(w_trans_id)
+        self.work_transform.create_symlink(new_target, w_trans_id)
+
+        old_target = self.work_tree.get_symlink_target(file_id)
+        s_trans_id = self.shelf_transform.trans_id_file_id(file_id)
+        self.shelf_transform.delete_contents(s_trans_id)
+        self.shelf_transform.create_symlink(old_target, s_trans_id)
+
     def shelve_lines(self, file_id, new_lines):
         """Shelve text changes to a file, using provided lines.
 

=== modified file 'bzrlib/shelf_ui.py'
--- a/bzrlib/shelf_ui.py	2009-03-12 05:03:38 +0000
+++ b/bzrlib/shelf_ui.py	2009-03-13 01:24:36 +0000
@@ -121,6 +121,11 @@
                                    change[2:]):
                         creator.shelve_rename(change[1])
                         changes_shelved += 1
+                if change[0] == 'modify target':
+                    if self.prompt_bool('Shelve changing target of "%s" '
+                            'from "%s" to "%s"?' % change[2:]):
+                        creator.shelve_modify_target(change[1])
+                        changes_shelved += 1
             if changes_shelved > 0:
                 trace.note("Selected changes:")
                 changes = creator.work_transform.iter_changes()

=== modified file 'bzrlib/tests/test_shelf.py'
--- a/bzrlib/tests/test_shelf.py	2009-03-10 23:34:43 +0000
+++ b/bzrlib/tests/test_shelf.py	2009-03-13 01:24:36 +0000
@@ -140,6 +140,27 @@
         limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
         self.assertEqual('bar', os.readlink(limbo_name))
 
+    def test_shelve_symlink_target_change(self):
+        self.requireFeature(tests.SymlinkFeature)
+        tree = self.make_branch_and_tree('.')
+        tree.lock_write()
+        self.addCleanup(tree.unlock)
+        os.symlink('bar', 'foo')
+        tree.add('foo', 'foo-id')
+        tree.commit("commit symlink")
+        os.unlink("foo")
+        os.symlink('baz', 'foo')
+        creator = shelf.ShelfCreator(tree, tree.basis_tree())
+        self.addCleanup(creator.finalize)
+        self.assertEqual([('modify target', 'foo-id', 'foo', 'bar', 'baz')],
+                         list(creator.iter_shelvable()))
+        creator.shelve_modify_target('foo-id')
+        creator.transform()
+        self.assertEqual('bar', os.readlink('foo'))
+        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
+        limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
+        self.assertEqual('baz', os.readlink(limbo_name))
+
     def test_shelve_creation_no_contents(self):
         tree = self.make_branch_and_tree('.')
         tree.lock_write()

=== modified file 'bzrlib/tests/test_shelf_ui.py'
--- a/bzrlib/tests/test_shelf_ui.py	2009-03-12 05:58:11 +0000
+++ b/bzrlib/tests/test_shelf_ui.py	2009-03-13 01:24:36 +0000
@@ -164,6 +164,20 @@
                        'y')
         shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
 
+    def test_shelve_modify_target(self):
+        tree = self.create_shelvable_tree()
+        os.symlink('bar', 'tree/baz')
+        tree.add('baz', 'baz-id')
+        tree.commit("Add symlink")
+        os.unlink('tree/baz')
+        os.symlink('vax', 'tree/baz')
+        shelver = ExpectShelver(tree, tree.basis_tree())
+        shelver.expect('Shelve changing target of "baz" from "bar" to '
+                '"vax"? [yNfq?]', 'y')
+        shelver.expect('Shelve 1 change(s)? [yNfq?]', 'y')
+        shelver.run()
+        self.assertEqual('bar', os.readlink('tree/baz'))
+
     def test_shelve_finish(self):
         tree = self.create_shelvable_tree()
         shelver = ExpectShelver(tree, tree.basis_tree())




More information about the bazaar-commits mailing list