/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/transform.py

Proper conflicts for removals

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
        self._new_name = {}
28
28
        self._new_parent = {}
29
29
        self._new_contents = {}
 
30
        self._removed_contents = set()
30
31
        self._new_executability = {}
31
32
        self._new_id = {}
32
33
        self._tree_path_ids = {}
113
114
        """
114
115
        unique_add(self._new_contents, trans_id, ('symlink', target))
115
116
 
 
117
    def delete_contents(self, trans_id):
 
118
        """Schedule the contents of a path entry for deletion"""
 
119
        self._removed_contents.add(trans_id)
 
120
 
116
121
    def set_executability(self, executability, trans_id):
117
122
        """Schedule setting of the 'execute' bit"""
118
123
        if executability is None:
135
140
        new_paths.sort()
136
141
        return new_paths
137
142
 
 
143
    def tree_kind(self, trans_id):
 
144
        path = self._tree_id_paths.get(trans_id)
 
145
        if path is None:
 
146
            raise NoSuchFile(None)
 
147
        try:
 
148
            return file_kind(self._tree.abspath(path))
 
149
        except OSError, e:
 
150
            if e.errno != errno.ENOENT:
 
151
                raise
 
152
            else:
 
153
                raise NoSuchFile(path)
 
154
 
138
155
    def final_kind(self, trans_id):
139
156
        """\
140
157
        Determine the final file kind, after any changes applied.
145
162
        """
146
163
        if trans_id in self._new_contents:
147
164
            return self._new_contents[trans_id][0]
 
165
        elif trans_id in self._removed_contents:
 
166
            raise NoSuchFile(None)
148
167
        else:
149
 
            path = self._tree_id_paths.get(trans_id)
150
 
            if path is None:
151
 
                raise NoSuchFile(None)
152
 
            try:
153
 
                return file_kind(self._tree.abspath(path))
154
 
            except OSError, e:
155
 
                if e.errno != errno.ENOENT:
156
 
                    raise
157
 
                else:
158
 
                    raise NoSuchFile(path)
 
168
            return self.tree_kind(trans_id)
159
169
 
160
170
    def final_file_id(self, trans_id):
161
171
        """\
221
231
        return conflicts
222
232
 
223
233
    def _add_tree_children(self):
224
 
        parents = self._by_parent()
 
234
        parents = self._by_parent().keys()
 
235
        parents.extend([t for t in self._removed_contents if 
 
236
                        self.tree_kind(t) == 'directory'])
225
237
        for parent_id in parents:
226
238
            try:
227
239
                path = self._tree_id_paths[parent_id]
291
303
        for trans_id in self._new_executability:
292
304
            if self.final_file_id(trans_id) is None:
293
305
                conflicts.append(('unversioned executability', trans_id))
294
 
            elif self.final_kind(trans_id) != "file":
295
 
                conflicts.append(('non-file executability', trans_id))
 
306
            else:
 
307
                try:
 
308
                    non_file = self.final_kind(trans_id) != "file"
 
309
                except NoSuchFile:
 
310
                    non_file = True
 
311
                if non_file is True:
 
312
                    conflicts.append(('non-file executability', trans_id))
296
313
        return conflicts
297
314
 
298
315
    def _duplicate_entries(self, by_parent):
337
354
        if len(self.find_conflicts()) != 0:
338
355
            raise MalformedTransform()
339
356
        inv = self._tree.inventory
 
357
        for trans_id in self._removed_contents:
 
358
            if trans_id in self._removed_contents:
 
359
                path = self._tree_id_paths[trans_id]
 
360
                try:
 
361
                    os.unlink(path)
 
362
                except OSError, e:
 
363
                    if e.errno != errno.EISDIR:
 
364
                        raise
 
365
                    os.rmdir(path)
 
366
 
340
367
        for path, trans_id in self.new_paths():
341
368
            try:
342
369
                kind = self._new_contents[trans_id][0]