~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transform.py

  • Committer: Vincent Ladeuil
  • Date: 2008-01-29 15:16:31 UTC
  • mto: (3206.1.1 trunk)
  • mto: This revision was merged to the branch mainline in revision 3207.
  • Revision ID: v.ladeuil+lp@free.fr-20080129151631-vqjd13tb405mobx6
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).

Show diffs side-by-side

added added

removed removed

Lines of Context:
81
81
        object.__init__(self)
82
82
        self._tree = tree
83
83
        self._limbodir = limbodir
 
84
        self._deletiondir = None
84
85
        self._id_number = 0
85
86
        # mapping of trans_id -> new basename
86
87
        self._new_name = {}
158
159
                # We don't especially care *why* the dir is immortal.
159
160
                raise ImmortalLimbo(self._limbodir)
160
161
            try:
161
 
                os.rmdir(self._deletiondir)
 
162
                if self._deletiondir is not None:
 
163
                    os.rmdir(self._deletiondir)
162
164
            except OSError:
163
165
                raise errors.ImmortalPendingDeletion(self._deletiondir)
164
166
        finally:
1136
1138
            except OSError, e:
1137
1139
                if e.errno == errno.EEXIST:
1138
1140
                    raise ExistingLimbo(limbodir)
1139
 
            self._deletiondir = urlutils.local_path_from_url(
 
1141
            deletiondir = urlutils.local_path_from_url(
1140
1142
                control_files.controlfilename('pending-deletion'))
1141
1143
            try:
1142
 
                os.mkdir(self._deletiondir)
 
1144
                os.mkdir(deletiondir)
1143
1145
            except OSError, e:
1144
1146
                if e.errno == errno.EEXIST:
1145
 
                    raise errors.ExistingPendingDeletion(self._deletiondir)
 
1147
                    raise errors.ExistingPendingDeletion(deletiondir)
1146
1148
        except:
1147
1149
            tree.unlock()
1148
1150
            raise
1149
1151
 
1150
1152
        TreeTransformBase.__init__(self, tree, limbodir, pb,
1151
1153
                                   tree.case_sensitive)
 
1154
        self._deletiondir = deletiondir
1152
1155
 
1153
1156
    def apply(self, no_conflicts=False, _mover=None):
1154
1157
        """Apply all changes to the inventory and filesystem.
1321
1324
    """
1322
1325
 
1323
1326
    def __init__(self, tree, pb=DummyProgress(), case_sensitive=True):
 
1327
        tree.lock_read()
1324
1328
        limbodir = tempfile.mkdtemp(prefix='bzr-limbo-')
1325
1329
        TreeTransformBase.__init__(self, tree, limbodir, pb, case_sensitive)
1326
1330