/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

  • Committer: Andrew Bennetts
  • Date: 2008-04-10 06:55:05 UTC
  • mfrom: (3352 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3356.
  • Revision ID: andrew.bennetts@canonical.com-20080410065505-ngvea7132rcinupm
Merge from bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
250
250
        This reflects only files that already exist, not ones that will be
251
251
        added by transactions.
252
252
        """
253
 
        path = self._tree.inventory.id2path(inventory_id)
 
253
        path = self._tree.id2path(inventory_id)
254
254
        return self.trans_id_tree_path(path)
255
255
 
256
256
    def trans_id_file_id(self, file_id):
770
770
        conflicts = []
771
771
        removed_tree_ids = set((self.tree_file_id(trans_id) for trans_id in
772
772
                                self._removed_id))
773
 
        active_tree_ids = set((f for f in self._tree.inventory if
774
 
                               f not in removed_tree_ids))
 
773
        all_ids = self._tree.all_file_ids()
 
774
        active_tree_ids = all_ids.difference(removed_tree_ids)
775
775
        for trans_id, file_id in self._new_id.iteritems():
776
776
            if file_id in active_tree_ids:
777
777
                old_trans_id = self.trans_id_tree_file_id(file_id)
1002
1002
            to_executable = False
1003
1003
        return to_name, to_parent, to_kind, to_executable
1004
1004
 
1005
 
    def _iter_changes(self):
1006
 
        """Produce output in the same format as Tree._iter_changes.
 
1005
    def iter_changes(self):
 
1006
        """Produce output in the same format as Tree.iter_changes.
1007
1007
 
1008
1008
        Will produce nonsensical results if invoked while inventory/filesystem
1009
1009
        conflicts (as reported by TreeTransform.find_conflicts()) are present.
1186
1186
            conflicts = self.find_conflicts()
1187
1187
            if len(conflicts) != 0:
1188
1188
                raise MalformedTransform(conflicts=conflicts)
1189
 
        inv = self._tree.inventory
1190
1189
        inventory_delta = []
1191
1190
        child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1192
1191
        try:
1196
1195
                mover = _mover
1197
1196
            try:
1198
1197
                child_pb.update('Apply phase', 0, 2)
1199
 
                self._apply_removals(inv, inventory_delta, mover)
 
1198
                self._apply_removals(inventory_delta, mover)
1200
1199
                child_pb.update('Apply phase', 1, 2)
1201
 
                modified_paths = self._apply_insertions(inv, inventory_delta,
1202
 
                                                        mover)
 
1200
                modified_paths = self._apply_insertions(inventory_delta, mover)
1203
1201
            except:
1204
1202
                mover.rollback()
1205
1203
                raise
1212
1210
        self.finalize()
1213
1211
        return _TransformResults(modified_paths, self.rename_count)
1214
1212
 
1215
 
    def _apply_removals(self, inv, inventory_delta, mover):
 
1213
    def _apply_removals(self, inventory_delta, mover):
1216
1214
        """Perform tree operations that remove directory/inventory names.
1217
1215
 
1218
1216
        That is, delete files that are to be deleted, and put any files that
1244
1242
                        file_id = self._tree.get_root_id()
1245
1243
                    else:
1246
1244
                        file_id = self.tree_file_id(trans_id)
1247
 
                    if file_id is not None:
1248
 
                        inventory_delta.append((path, None, file_id, None))
 
1245
                    assert file_id is not None
 
1246
                    # File-id isn't really being deleted, just moved
 
1247
                    if file_id in self._r_new_id:
 
1248
                        continue
 
1249
                    inventory_delta.append((path, None, file_id, None))
1249
1250
        finally:
1250
1251
            child_pb.finished()
1251
1252
 
1252
 
    def _apply_insertions(self, inv, inventory_delta, mover):
 
1253
    def _apply_insertions(self, inventory_delta, mover):
1253
1254
        """Perform tree operations that insert directory/inventory names.
1254
1255
 
1255
1256
        That is, create any files that need to be created, and restore from
1264
1265
            for num, (path, trans_id) in enumerate(new_paths):
1265
1266
                new_entry = None
1266
1267
                child_pb.update('adding file', num, len(new_paths))
1267
 
                try:
1268
 
                    kind = self._new_contents[trans_id]
1269
 
                except KeyError:
1270
 
                    kind = contents = None
1271
1268
                if trans_id in self._new_contents or \
1272
1269
                    self.path_changed(trans_id):
1273
1270
                    full_path = self._tree.abspath(path)
1283
1280
                    if trans_id in self._new_contents:
1284
1281
                        modified_paths.append(full_path)
1285
1282
                        completed_new.append(trans_id)
1286
 
 
1287
 
                if trans_id in self._new_id:
1288
 
                    if kind is None:
1289
 
                        kind = file_kind(self._tree.abspath(path))
 
1283
                file_id = self.final_file_id(trans_id)
 
1284
                if file_id is not None and (trans_id in self._new_id or
 
1285
                    trans_id in self._new_name or trans_id in self._new_parent
 
1286
                    or trans_id in self._new_executability):
 
1287
                    try:
 
1288
                        kind = self.final_kind(trans_id)
 
1289
                    except NoSuchFile:
 
1290
                        kind = self._tree.stored_kind(file_id)
1290
1291
                    if trans_id in self._new_reference_revision:
1291
1292
                        new_entry = inventory.TreeReference(
1292
 
                            self._new_id[trans_id],
 
1293
                            self.final_file_id(trans_id),
1293
1294
                            self._new_name[trans_id],
1294
1295
                            self.final_file_id(self._new_parent[trans_id]),
1295
1296
                            None, self._new_reference_revision[trans_id])
1297
1298
                        new_entry = inventory.make_entry(kind,
1298
1299
                            self.final_name(trans_id),
1299
1300
                            self.final_file_id(self.final_parent(trans_id)),
1300
 
                            self._new_id[trans_id])
1301
 
                else:
1302
 
                    if trans_id in self._new_name or trans_id in\
1303
 
                        self._new_parent or\
1304
 
                        trans_id in self._new_executability:
1305
 
                        file_id = self.final_file_id(trans_id)
1306
 
                        if file_id is not None:
1307
 
                            entry = inv[file_id]
1308
 
                            new_entry = entry.copy()
1309
 
 
1310
 
                    if trans_id in self._new_name or trans_id in\
1311
 
                        self._new_parent:
1312
 
                            if new_entry is not None:
1313
 
                                new_entry.name = self.final_name(trans_id)
1314
 
                                parent = self.final_parent(trans_id)
1315
 
                                parent_id = self.final_file_id(parent)
1316
 
                                new_entry.parent_id = parent_id
 
1301
                            self.final_file_id(trans_id))
 
1302
                    try:
 
1303
                        old_path = self._tree.id2path(new_entry.file_id)
 
1304
                    except errors.NoSuchId:
 
1305
                        old_path = None
 
1306
                    inventory_delta.append((old_path, path, new_entry.file_id,
 
1307
                                            new_entry))
1317
1308
 
1318
1309
                if trans_id in self._new_executability:
1319
1310
                    self._set_executability(path, new_entry, trans_id)
1320
 
                if new_entry is not None:
1321
 
                    if new_entry.file_id in inv:
1322
 
                        old_path = inv.id2path(new_entry.file_id)
1323
 
                    else:
1324
 
                        old_path = None
1325
 
                    inventory_delta.append((old_path, path,
1326
 
                                            new_entry.file_id,
1327
 
                                            new_entry))
1328
1311
        finally:
1329
1312
            child_pb.finished()
1330
1313
        for trans_id in completed_new:
1389
1372
    def unlock(self):
1390
1373
        pass
1391
1374
 
1392
 
    def _iter_changes(self, from_tree, include_unchanged=False,
 
1375
    def iter_changes(self, from_tree, include_unchanged=False,
1393
1376
                      specific_files=None, pb=None, extra_trees=None,
1394
1377
                      require_versioned=True, want_unversioned=False):
1395
 
        """See InterTree._iter_changes.
 
1378
        """See InterTree.iter_changes.
1396
1379
 
1397
1380
        This implementation does not support include_unchanged, specific_files,
1398
1381
        or want_unversioned.  extra_trees, require_versioned, and pb are
1406
1389
            raise ValueError('specific_files is not supported')
1407
1390
        if want_unversioned:
1408
1391
            raise ValueError('want_unversioned is not supported')
1409
 
        return self._transform._iter_changes()
 
1392
        return self._transform.iter_changes()
1410
1393
 
1411
1394
    def kind(self, file_id):
1412
1395
        trans_id = self._transform.trans_id_file_id(file_id)
1520
1503
 
1521
1504
def _build_tree(tree, wt, accelerator_tree, hardlink):
1522
1505
    """See build_tree."""
1523
 
    if len(wt.inventory) > 1:  # more than just a root
1524
 
        raise errors.WorkingTreeAlreadyPopulated(base=wt.basedir)
 
1506
    for num, _unused in enumerate(wt.all_file_ids()):
 
1507
        if num > 0:  # more than just a root
 
1508
            raise errors.WorkingTreeAlreadyPopulated(base=wt.basedir)
1525
1509
    file_trans_id = {}
1526
1510
    top_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1527
1511
    pp = ProgressPhase("Build phase", 2, top_pb)
1624
1608
    if accelerator_tree is None:
1625
1609
        new_desired_files = desired_files
1626
1610
    else:
1627
 
        iter = accelerator_tree._iter_changes(tree, include_unchanged=True)
 
1611
        iter = accelerator_tree.iter_changes(tree, include_unchanged=True)
1628
1612
        unchanged = dict((f, p[1]) for (f, p, c, v, d, n, k, e)
1629
1613
                         in iter if not (c or e[0] != e[1]))
1630
1614
        new_desired_files = []
1660
1644
    by_parent = tt.by_parent()
1661
1645
    for child in by_parent[old_parent]:
1662
1646
        tt.adjust_path(tt.final_name(child), new_parent, child)
 
1647
    return by_parent[old_parent]
1663
1648
 
1664
1649
def _content_match(tree, entry, file_id, kind, target_path):
1665
1650
    if entry.kind != kind:
1872
1857
        if change_reporter:
1873
1858
            change_reporter = delta._ChangeReporter(
1874
1859
                unversioned_filter=working_tree.is_ignored)
1875
 
            delta.report_changes(tt._iter_changes(), change_reporter)
 
1860
            delta.report_changes(tt.iter_changes(), change_reporter)
1876
1861
        for conflict in conflicts:
1877
1862
            warning(conflict)
1878
1863
        pp.next_phase()
1888
1873
def _alter_files(working_tree, target_tree, tt, pb, specific_files,
1889
1874
                 backups):
1890
1875
    merge_modified = working_tree.merge_modified()
1891
 
    change_list = target_tree._iter_changes(working_tree,
 
1876
    change_list = target_tree.iter_changes(working_tree,
1892
1877
        specific_files=specific_files, pb=pb)
1893
1878
    if target_tree.inventory.root is None:
1894
1879
        skip_root = True
2035
2020
                new_conflicts.add(('deleting parent', 'Not deleting', 
2036
2021
                                   trans_id))
2037
2022
            except KeyError:
2038
 
                tt.create_directory(trans_id)
2039
 
                new_conflicts.add((c_type, 'Created directory', trans_id))
 
2023
                create = True
2040
2024
                try:
2041
2025
                    tt.final_name(trans_id)
2042
2026
                except NoFinalPath:
2043
2027
                    if path_tree is not None:
2044
2028
                        file_id = tt.final_file_id(trans_id)
 
2029
                        if file_id is None:
 
2030
                            file_id = tt.inactive_file_id(trans_id)
2045
2031
                        entry = path_tree.inventory[file_id]
2046
 
                        parent_trans_id = tt.trans_id_file_id(entry.parent_id)
2047
 
                        tt.adjust_path(entry.name, parent_trans_id, trans_id)
 
2032
                        # special-case the other tree root (move its
 
2033
                        # children to current root)
 
2034
                        if entry.parent_id is None:
 
2035
                            create=False
 
2036
                            moved = _reparent_transform_children(
 
2037
                                tt, trans_id, tt.root)
 
2038
                            for child in moved:
 
2039
                                new_conflicts.add((c_type, 'Moved to root',
 
2040
                                                   child))
 
2041
                        else:
 
2042
                            parent_trans_id = tt.trans_id_file_id(
 
2043
                                entry.parent_id)
 
2044
                            tt.adjust_path(entry.name, parent_trans_id,
 
2045
                                           trans_id)
 
2046
                if create:
 
2047
                    tt.create_directory(trans_id)
 
2048
                    new_conflicts.add((c_type, 'Created directory', trans_id))
2048
2049
        elif c_type == 'unversioned parent':
2049
 
            tt.version_file(tt.inactive_file_id(conflict[1]), conflict[1])
 
2050
            file_id = tt.inactive_file_id(conflict[1])
 
2051
            # special-case the other tree root (move its children instead)
 
2052
            if path_tree and file_id in path_tree:
 
2053
                if path_tree.inventory[file_id].parent_id is None:
 
2054
                    continue
 
2055
            tt.version_file(file_id, conflict[1])
2050
2056
            new_conflicts.add((c_type, 'Versioned directory', conflict[1]))
2051
2057
        elif c_type == 'non-directory parent':
2052
2058
            parent_id = conflict[1]
2056
2062
            new_parent_id = tt.new_directory(parent_name + '.new',
2057
2063
                parent_parent, parent_file_id)
2058
2064
            _reparent_transform_children(tt, parent_id, new_parent_id)
2059
 
            tt.unversion_file(parent_id)
 
2065
            if parent_file_id is not None:
 
2066
                tt.unversion_file(parent_id)
2060
2067
            new_conflicts.add((c_type, 'Created directory', new_parent_id))
2061
2068
    return new_conflicts
2062
2069