Rev 3207: (vila) Fix 123363 by deleting useless log files and test work dirs in in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Wed Jan 30 10:03:17 GMT 2008


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

------------------------------------------------------------
revno: 3207
revision-id:pqm at pqm.ubuntu.com-20080130100306-p0uqnxt3hodnyiej
parent: pqm at pqm.ubuntu.com-20080130074652-2t36df3w0l3jhwyf
parent: v.ladeuil+lp at free.fr-20080130082023-15b8pg5idmk7pnun
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2008-01-30 10:03:06 +0000
message:
  (vila) Fix 123363 by deleting useless log files and test work dirs in
  	/tmp
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
  bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
  bzrlib/tests/blackbox/test_outside_wt.py test_outside_wt.py-20060116200058-98edd33e7db8bdde
  bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
  bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
  bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
  bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
  bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
  bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3206.1.1
    revision-id:v.ladeuil+lp at free.fr-20080130082023-15b8pg5idmk7pnun
    parent: pqm at pqm.ubuntu.com-20080130074652-2t36df3w0l3jhwyf
    parent: v.ladeuil+lp at free.fr-20080130081525-i47iawe2ghcowoxt
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: trunk
    timestamp: Wed 2008-01-30 09:20:23 +0100
    message:
      Fix 123363 by deleting useless log files and test work dirs in /tmp
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/blackbox/test_outside_wt.py test_outside_wt.py-20060116200058-98edd33e7db8bdde
      bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
      bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
      bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
      bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3199.1.9
    revision-id:v.ladeuil+lp at free.fr-20080130081525-i47iawe2ghcowoxt
    parent: v.ladeuil+lp at free.fr-20080129170643-rz3wt7z5ryw0s4se
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 123363-tmp-pollution
    timestamp: Wed 2008-01-30 09:15:25 +0100
    message:
      Aaron's review feedback.
      
      * bzrlib/builtins.py:
      (cmd_merge._do_preview): Ensure the TransformPreview.finalize is
      always called.
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
    ------------------------------------------------------------
    revno: 3199.1.8
    revision-id:v.ladeuil+lp at free.fr-20080129170643-rz3wt7z5ryw0s4se
    parent: v.ladeuil+lp at free.fr-20080129160337-txsu01vjnpipm5bd
    parent: pqm at pqm.ubuntu.com-20080129045844-u41ywp910i6jv8bz
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 123363-tmp-pollution
    timestamp: Tue 2008-01-29 18:06:43 +0100
    message:
       merge bzr.dev
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/help_topics/__init__.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
      bzrlib/plugin.py               plugin.py-20050622060424-829b654519533d69
      bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
      bzrlib/smart/client.py         client.py-20061116014825-2k6ada6xgulslami-1
      bzrlib/status.py               status.py-20050505062338-431bfa63ec9b19e6
      bzrlib/tests/test_plugins.py   plugins.py-20050622075746-32002b55e5e943e9
      bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
    ------------------------------------------------------------
    revno: 3199.1.7
    revision-id:v.ladeuil+lp at free.fr-20080129160337-txsu01vjnpipm5bd
    parent: v.ladeuil+lp at free.fr-20080129155823-1ext6bebc09p9rvx
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 123363-tmp-pollution
    timestamp: Tue 2008-01-29 17:03:37 +0100
    message:
      Update NEWS.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
    ------------------------------------------------------------
    revno: 3199.1.6
    revision-id:v.ladeuil+lp at free.fr-20080129155823-1ext6bebc09p9rvx
    parent: v.ladeuil+lp at free.fr-20080129151631-vqjd13tb405mobx6
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 123363-tmp-pollution
    timestamp: Tue 2008-01-29 16:58:23 +0100
    message:
      Fiz last leaking tmp dir.
      
      * bzrlib/tests/test_diff.py:
      (TestDiffFromTool.test_from_string): Split the test and cleanup.
    modified:
      bzrlib/tests/test_diff.py      testdiff.py-20050727164403-d1a3496ebb12e339
    ------------------------------------------------------------
    revno: 3199.1.5
    revision-id:v.ladeuil+lp at free.fr-20080129151631-vqjd13tb405mobx6
    parent: v.ladeuil+lp at free.fr-20080129132736-nai2jpv02r2wltgc
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 123363-tmp-pollution
    timestamp: Tue 2008-01-29 16:16:31 +0100
    message:
      Fix two more leaking tmp dirs, by reworking TransformPreview lock handling.
      
      * bzrlib/tests/test_transform.py:
      (TestTransformMerge): Revert previous patch and cleanly call
      preview.finalize now that we can.
      
      * bzrlib/tests/test_merge.py:
      (TestMerge.test_make_preview_transform): Catch TransformPreview
      leak.
      
      * bzrlib/builtins.py:
      (cmd_merge._do_preview): Finalize the TransformPreview or the
      limbodir will stay in /tmp.
      
      * bzrlib/transform.py:
      (TreeTransformBase.__init__): Create the _deletiondir since it's
      reffered to by finalize.
      (TreeTransformBase.finalize): Delete the dir only if _deletiondir
      is set.
      (TreeTransform.__init__): Use a temp var for deletiondir and set
      the attribute after the base class __init__ has been called.
      (TransformPreview.__init__): Read locks the tree since finalize
      wants to unlock it (as suggested by Aaron).
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/tests/test_merge.py     testmerge.py-20050905070950-c1b5aa49ff911024
      bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3199.1.4
    revision-id:v.ladeuil+lp at free.fr-20080129132736-nai2jpv02r2wltgc
    parent: v.ladeuil+lp at free.fr-20080129115331-n7nl3ljtkepljzwi
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 123363-tmp-pollution
    timestamp: Tue 2008-01-29 14:27:36 +0100
    message:
      Fix 16 leaked tmp dirs. Probably indicates a lock handling problem with TransformPreview
      
      * bzrlib/tests/test_transform.py:
      (addPreviewCleanup): New method cleaning the TransformPreview
      limbdodir leaked by the tests.
      
      * bzrlib/transform.py:
      (TransformPreview.__init__): Use a specific prefix for the
      limbodir to make leaks more obvious.
    modified:
      bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3199.1.3
    revision-id:v.ladeuil+lp at free.fr-20080129115331-n7nl3ljtkepljzwi
    parent: v.ladeuil+lp at free.fr-20080129084053-sunwf549ox6zczqr
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 123363-tmp-pollution
    timestamp: Tue 2008-01-29 12:53:31 +0100
    message:
      Fix two more leaked tmp dirs.
      
      * bzrlib/tests/blackbox/test_outside_wt.py:
      (TestOutsideWT.test_cwd_log,
      TestOutsideWT.test_diff_outside_tree): Clean up tmp dir.
    modified:
      bzrlib/tests/blackbox/test_outside_wt.py test_outside_wt.py-20060116200058-98edd33e7db8bdde
    ------------------------------------------------------------
    revno: 3199.1.2
    revision-id:v.ladeuil+lp at free.fr-20080129084053-sunwf549ox6zczqr
    parent: v.ladeuil+lp at free.fr-20080129082119-gerd998iwffytp6i
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 123363-tmp-pollution
    timestamp: Tue 2008-01-29 09:40:53 +0100
    message:
      Fix two more leaked log files.
      
      * bzrlib/tests/test_http.py:
      (TestHttpProxyWhiteBox.tearDown): Call the base class tearDown.
    modified:
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
    ------------------------------------------------------------
    revno: 3199.1.1
    revision-id:v.ladeuil+lp at free.fr-20080129082119-gerd998iwffytp6i
    parent: pqm at pqm.ubuntu.com-20080123180146-9pkott489spjwv8q
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 123363-tmp-pollution
    timestamp: Tue 2008-01-29 09:21:19 +0100
    message:
      Get rid of ~1000 useless log files out of 10.000 tests in /tmp.
      
      * bzrlib/tests/test_selftest.py:
      (TestRunner.test_skipped_log_deleted,
      TestRunner.test_not_aplicable_log_deleted,
      TestRunner.test_known_failure_log_deleted): Add tests checking
      that the log is deleted for skipped, not applicable and known
      failures tests.
      
      * bzrlib/tests/__init__.py:
      (ExtendedTestResult.addError, ExtendedTestResult.addFailure,
      ExtendedTestResult.addSuccess): Keep log only on true failures and
      errors.
    modified:
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
=== modified file 'NEWS'
--- a/NEWS	2008-01-29 06:56:51 +0000
+++ b/NEWS	2008-01-30 08:20:23 +0000
@@ -63,6 +63,9 @@
     * Unknown hostnames when connecting to a ``bzr://`` URL no longer cause
       tracebacks.  (Andrew Bennetts, #182849)
 
+    * Stop polluting /tmp when running selftest.
+      (Vincent Ladeuil, #123623)
+
   API BREAKS:
 
     * Classes implementing Merge types like Merge3Merger must now accept (and

=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2008-01-25 18:19:06 +0000
+++ b/bzrlib/builtins.py	2008-01-30 08:15:25 +0000
@@ -2874,9 +2874,12 @@
         from bzrlib.diff import show_diff_trees
         tree_merger = merger.make_merger()
         tt = tree_merger.make_preview_transform()
-        result_tree = tt.get_preview_tree()
-        show_diff_trees(merger.this_tree, result_tree, self.outf, old_label='',
-                        new_label='')
+        try:
+            result_tree = tt.get_preview_tree()
+            show_diff_trees(merger.this_tree, result_tree, self.outf,
+                            old_label='', new_label='')
+        finally:
+            tt.finalize()
 
     def _do_merge(self, merger, change_reporter, allow_pending, verified):
         merger.change_reporter = change_reporter

=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2008-01-23 16:25:18 +0000
+++ b/bzrlib/tests/__init__.py	2008-01-29 08:21:19 +0000
@@ -275,6 +275,7 @@
         elif isinstance(err[1], UnavailableFeature):
             return self.addNotSupported(test, err[1].args[0])
         else:
+            self._cleanupLogFile(test)
             unittest.TestResult.addError(self, test, err)
             self.error_count += 1
             self.report_error(test, err)
@@ -291,6 +292,7 @@
         if isinstance(err[1], KnownFailure):
             return self._addKnownFailure(test, err)
         else:
+            self._cleanupLogFile(test)
             unittest.TestResult.addFailure(self, test, err)
             self.failure_count += 1
             self.report_failure(test, err)
@@ -310,6 +312,7 @@
                     self._formatTime(benchmark_time),
                     test.id()))
         self.report_success(test)
+        self._cleanupLogFile(test)
         unittest.TestResult.addSuccess(self, test)
 
     def _testConcluded(self, test):
@@ -317,7 +320,7 @@
 
         Called regardless of whether it succeded, failed, etc.
         """
-        self._cleanupLogFile(test)
+        pass
 
     def _addKnownFailure(self, test, err):
         self.known_failure_count += 1
@@ -1310,6 +1313,8 @@
         import bzrlib.trace
         bzrlib.trace._trace_file.flush()
         if self._log_contents:
+            # XXX: this can hardly contain the content flushed above --vila
+            # 20080128
             return self._log_contents
         if self._log_file_name is not None:
             logfile = open(self._log_file_name)

=== modified file 'bzrlib/tests/blackbox/test_outside_wt.py'
--- a/bzrlib/tests/blackbox/test_outside_wt.py	2007-12-12 07:05:52 +0000
+++ b/bzrlib/tests/blackbox/test_outside_wt.py	2008-01-29 11:53:31 +0000
@@ -21,18 +21,23 @@
 import os
 import tempfile
 
-from bzrlib.tests import ChrootedTestCase
-from bzrlib.osutils import getcwd
-import bzrlib.urlutils as urlutils
-
-
-class TestOutsideWT(ChrootedTestCase):
+from bzrlib import (
+    osutils,
+    tests,
+    urlutils,
+    )
+
+
+class TestOutsideWT(tests.ChrootedTestCase):
     """Test that bzr gives proper errors outside of a working tree."""
 
     def test_cwd_log(self):
-        os.chdir(tempfile.mkdtemp())
+        tmp_dir = tempfile.mkdtemp()
+        self.addCleanup(lambda: osutils.rmtree(tmp_dir))
+        os.chdir(tmp_dir)
         out, err = self.run_bzr('log', retcode=3)
-        self.assertEqual(u'bzr: ERROR: Not a branch: "%s/".\n' % (getcwd(),),
+        self.assertEqual(u'bzr: ERROR: Not a branch: "%s/".\n'
+                         % (osutils.getcwd(),),
                          err)
 
     def test_url_log(self):
@@ -41,14 +46,16 @@
         self.assertEqual(u'bzr: ERROR: Not a branch:'
                          u' "%s".\n' % url, err)
 
-    def test_diff_ouside_tree(self):
-        os.chdir(tempfile.mkdtemp())
+    def test_diff_outside_tree(self):
+        tmp_dir = tempfile.mkdtemp()
+        self.addCleanup(lambda: osutils.rmtree(tmp_dir))
+        os.chdir(tmp_dir)
         self.run_bzr('init branch1')
         self.run_bzr(['commit', '-m', 'nothing',
                                '--unchanged', 'branch1'])
         self.run_bzr(['commit', '-m', 'nothing',
                                '--unchanged', 'branch1'])
-        this_dir = getcwd()
+        this_dir = osutils.getcwd()
         branch2 = "%s/branch2" % (this_dir,)
         # -r X..Y
         out, err = self.run_bzr('diff -r revno:2:branch2..revno:1', retcode=3)

=== modified file 'bzrlib/tests/test_diff.py'
--- a/bzrlib/tests/test_diff.py	2008-01-03 19:12:30 +0000
+++ b/bzrlib/tests/test_diff.py	2008-01-29 15:58:23 +0000
@@ -1246,7 +1246,10 @@
         self.addCleanup(diff_obj.finish)
         self.assertEqual(['diff', '%(old_path)s', '%(new_path)s'],
             diff_obj.command_template)
+
+    def test_from_string_u5(self):
         diff_obj = DiffFromTool.from_string('diff -u\\ 5', None, None, None)
+        self.addCleanup(diff_obj.finish)
         self.assertEqual(['diff', '-u 5', '%(old_path)s', '%(new_path)s'],
                          diff_obj.command_template)
         self.assertEqual(['diff', '-u 5', 'old-path', 'new-path'],

=== modified file 'bzrlib/tests/test_http.py'
--- a/bzrlib/tests/test_http.py	2008-01-03 15:12:58 +0000
+++ b/bzrlib/tests/test_http.py	2008-01-29 08:40:53 +0000
@@ -1048,7 +1048,7 @@
         self.assertEqual(l[2], (4096, '0004'))
         self.assertEqual(l[3], (8192, '0008'))
         # The server will refuse to serve the first request (too much ranges),
-        # a second request will succeeds.
+        # a second request will succeed.
         self.assertEqual(2, self.get_readonly_server().GET_request_nb)
 
 
@@ -1064,6 +1064,7 @@
 
     def tearDown(self):
         self._restore_env()
+        tests.TestCase.tearDown(self)
 
     def _install_env(self, env):
         for name, value in env.iteritems():

=== modified file 'bzrlib/tests/test_merge.py'
--- a/bzrlib/tests/test_merge.py	2008-01-05 23:01:50 +0000
+++ b/bzrlib/tests/test_merge.py	2008-01-29 15:16:31 +0000
@@ -385,6 +385,7 @@
         merger.merge_type = _mod_merge.Merge3Merger
         tree_merger = merger.make_merger()
         tt = tree_merger.make_preview_transform()
+        self.addCleanup(tt.finalize)
         preview_tree = tt.get_preview_tree()
         tree_file = this_tree.get_file('file-id')
         try:

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2008-01-21 15:16:38 +0000
+++ b/bzrlib/tests/test_selftest.py	2008-01-29 08:21:19 +0000
@@ -1221,6 +1221,12 @@
             revision_id = workingtree.get_parent_ids()[0]
             self.assertEndsWith(output_string.rstrip(), revision_id)
 
+    def assertLogDeleted(self, test):
+        log = test._get_log()
+        self.assertEqual("DELETED log file to reduce memory footprint", log)
+        self.assertEqual('', test._log_contents)
+        self.assertIs(None, test._log_file_name)
+
     def test_success_log_deleted(self):
         """Successful tests have their log deleted"""
 
@@ -1234,10 +1240,55 @@
         test = LogTester('test_success')
         result = self.run_test_runner(runner, test)
 
-        log = test._get_log()
-        self.assertEqual("DELETED log file to reduce memory footprint", log)
-        self.assertEqual('', test._log_contents)
-        self.assertIs(None, test._log_file_name)
+        self.assertLogDeleted(test)
+
+    def test_skipped_log_deleted(self):
+        """Skipped tests have their log deleted"""
+
+        class LogTester(TestCase):
+
+            def test_skipped(self):
+                self.log('this will be removed\n')
+                raise tests.TestSkipped()
+
+        sio = cStringIO.StringIO()
+        runner = TextTestRunner(stream=sio)
+        test = LogTester('test_skipped')
+        result = self.run_test_runner(runner, test)
+
+        self.assertLogDeleted(test)
+
+    def test_not_aplicable_log_deleted(self):
+        """Not applicable tests have their log deleted"""
+
+        class LogTester(TestCase):
+
+            def test_not_applicable(self):
+                self.log('this will be removed\n')
+                raise tests.TestNotApplicable()
+
+        sio = cStringIO.StringIO()
+        runner = TextTestRunner(stream=sio)
+        test = LogTester('test_not_applicable')
+        result = self.run_test_runner(runner, test)
+
+        self.assertLogDeleted(test)
+
+    def test_known_failure_log_deleted(self):
+        """Know failure tests have their log deleted"""
+
+        class LogTester(TestCase):
+
+            def test_known_failure(self):
+                self.log('this will be removed\n')
+                raise tests.KnownFailure()
+
+        sio = cStringIO.StringIO()
+        runner = TextTestRunner(stream=sio)
+        test = LogTester('test_known_failure')
+        result = self.run_test_runner(runner, test)
+
+        self.assertLogDeleted(test)
 
     def test_fail_log_kept(self):
         """Failed tests have their log kept"""

=== modified file 'bzrlib/tests/test_transform.py'
--- a/bzrlib/tests/test_transform.py	2008-01-17 02:16:39 +0000
+++ b/bzrlib/tests/test_transform.py	2008-01-29 15:16:31 +0000
@@ -22,6 +22,7 @@
 from bzrlib import (
     errors,
     generate_ids,
+    osutils,
     progress,
     revision as _mod_revision,
     symbol_versioning,
@@ -1232,6 +1233,7 @@
 
 
 class TestTransformMerge(TestCaseInTempDir):
+
     def test_text_merge(self):
         root_id = generate_ids.gen_root_id()
         base = TransformGroup("base", root_id)
@@ -1832,20 +1834,25 @@
     def get_empty_preview(self):
         repository = self.make_repository('repo')
         tree = repository.revision_tree(_mod_revision.NULL_REVISION)
-        return TransformPreview(tree)
+        preview = TransformPreview(tree)
+        self.addCleanup(preview.finalize)
+        return preview
 
     def test_transform_preview(self):
         revision_tree = self.create_tree()
         preview = TransformPreview(revision_tree)
+        self.addCleanup(preview.finalize)
 
     def test_transform_preview_tree(self):
         revision_tree = self.create_tree()
         preview = TransformPreview(revision_tree)
+        self.addCleanup(preview.finalize)
         preview.get_preview_tree()
 
     def test_transform_new_file(self):
         revision_tree = self.create_tree()
         preview = TransformPreview(revision_tree)
+        self.addCleanup(preview.finalize)
         preview.new_file('file2', preview.root, 'content B\n', 'file2-id')
         preview_tree = preview.get_preview_tree()
         self.assertEqual(preview_tree.kind('file2-id'), 'file')
@@ -1855,6 +1862,7 @@
     def test_diff_preview_tree(self):
         revision_tree = self.create_tree()
         preview = TransformPreview(revision_tree)
+        self.addCleanup(preview.finalize)
         preview.new_file('file2', preview.root, 'content B\n', 'file2-id')
         preview_tree = preview.get_preview_tree()
         out = StringIO()
@@ -1867,6 +1875,7 @@
     def test_transform_conflicts(self):
         revision_tree = self.create_tree()
         preview = TransformPreview(revision_tree)
+        self.addCleanup(preview.finalize)
         preview.new_file('a', preview.root, 'content 2')
         resolve_conflicts(preview)
         trans_id = preview.trans_id_file_id('a-id')
@@ -1875,6 +1884,7 @@
     def get_tree_and_preview_tree(self):
         revision_tree = self.create_tree()
         preview = TransformPreview(revision_tree)
+        self.addCleanup(preview.finalize)
         a_trans_id = preview.trans_id_file_id('a-id')
         preview.delete_contents(a_trans_id)
         preview.create_file('b content', a_trans_id)
@@ -1932,6 +1942,7 @@
     def test_kind(self):
         revision_tree = self.create_tree()
         preview = TransformPreview(revision_tree)
+        self.addCleanup(preview.finalize)
         preview.new_file('file', preview.root, 'contents', 'file-id')
         preview.new_directory('directory', preview.root, 'dir-id')
         preview_tree = preview.get_preview_tree()

=== modified file 'bzrlib/transform.py'
--- a/bzrlib/transform.py	2008-01-16 13:09:30 +0000
+++ b/bzrlib/transform.py	2008-01-29 15:16:31 +0000
@@ -81,6 +81,7 @@
         object.__init__(self)
         self._tree = tree
         self._limbodir = limbodir
+        self._deletiondir = None
         self._id_number = 0
         # mapping of trans_id -> new basename
         self._new_name = {}
@@ -158,7 +159,8 @@
                 # We don't especially care *why* the dir is immortal.
                 raise ImmortalLimbo(self._limbodir)
             try:
-                os.rmdir(self._deletiondir)
+                if self._deletiondir is not None:
+                    os.rmdir(self._deletiondir)
             except OSError:
                 raise errors.ImmortalPendingDeletion(self._deletiondir)
         finally:
@@ -1136,19 +1138,20 @@
             except OSError, e:
                 if e.errno == errno.EEXIST:
                     raise ExistingLimbo(limbodir)
-            self._deletiondir = urlutils.local_path_from_url(
+            deletiondir = urlutils.local_path_from_url(
                 control_files.controlfilename('pending-deletion'))
             try:
-                os.mkdir(self._deletiondir)
+                os.mkdir(deletiondir)
             except OSError, e:
                 if e.errno == errno.EEXIST:
-                    raise errors.ExistingPendingDeletion(self._deletiondir)
+                    raise errors.ExistingPendingDeletion(deletiondir)
         except:
             tree.unlock()
             raise
 
         TreeTransformBase.__init__(self, tree, limbodir, pb,
                                    tree.case_sensitive)
+        self._deletiondir = deletiondir
 
     def apply(self, no_conflicts=False, _mover=None):
         """Apply all changes to the inventory and filesystem.
@@ -1321,7 +1324,8 @@
     """
 
     def __init__(self, tree, pb=DummyProgress(), case_sensitive=True):
-        limbodir = tempfile.mkdtemp()
+        tree.lock_read()
+        limbodir = tempfile.mkdtemp(prefix='bzr-limbo-')
         TreeTransformBase.__init__(self, tree, limbodir, pb, case_sensitive)
 
     def canonical_path(self, path):




More information about the bazaar-commits mailing list