/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: Canonical.com Patch Queue Manager
  • Date: 2008-04-28 18:43:56 UTC
  • mfrom: (3363.2.11 preview-tree-changed)
  • Revision ID: pqm@pqm.ubuntu.com-20080428184356-qic5mhqzrgxlwwhs
(abentley) Get _PreviewTree under test

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
    bzrdir,
26
26
    delta,
27
27
    errors,
28
 
    inventory
 
28
    inventory,
 
29
    revision as _mod_revision,
29
30
    )
30
31
""")
31
32
from bzrlib.errors import (DuplicateKey, MalformedTransform, NoSuchFile,
1359
1360
            yield self.trans_id_tree_path(childpath)
1360
1361
 
1361
1362
 
1362
 
class _PreviewTree(object):
 
1363
class _PreviewTree(tree.Tree):
1363
1364
    """Partial implementation of Tree to support show_diff_trees"""
1364
1365
 
1365
1366
    def __init__(self, transform):
1366
1367
        self._transform = transform
 
1368
        self._final_paths = FinalPaths(transform)
 
1369
 
 
1370
    def _changes(self, file_id):
 
1371
        for changes in self._transform.iter_changes():
 
1372
            if changes[0] == file_id:
 
1373
                return changes
 
1374
 
 
1375
    def _content_change(self, file_id):
 
1376
        changes = self._changes(file_id)
 
1377
        return (changes is not None and changes[2])
 
1378
 
 
1379
    def _get_file_revision(self, file_id, vf, tree_revision):
 
1380
        return self._transform._tree._get_file_revision(file_id, vf,
 
1381
                                                        tree_revision)
 
1382
 
 
1383
    def _stat_limbo_file(self, file_id):
 
1384
        trans_id = self._transform.trans_id_file_id(file_id)
 
1385
        name = self._transform._limbo_name(trans_id)
 
1386
        return os.lstat(name)
1367
1387
 
1368
1388
    def lock_read(self):
1369
1389
        # Perhaps in theory, this should lock the TreeTransform?
1372
1392
    def unlock(self):
1373
1393
        pass
1374
1394
 
 
1395
    @property
 
1396
    def inventory(self):
 
1397
        """This Tree does not use inventory as its backing data."""
 
1398
        raise NotImplementedError(_PreviewTree.inventory)
 
1399
 
 
1400
    def get_root_id(self):
 
1401
        return self._transform.final_file_id(self._transform.root)
 
1402
 
 
1403
    def all_file_ids(self):
 
1404
        return self._transform._tree.all_file_ids()
 
1405
 
 
1406
    def __iter__(self):
 
1407
        return iter(self.all_file_ids())
 
1408
 
 
1409
    def paths2ids(self, specific_files, trees=None, require_versioned=False):
 
1410
        """See Tree.paths2ids"""
 
1411
        to_find = set(specific_files)
 
1412
        result = set()
 
1413
        for (file_id, paths, changed, versioned, parent, name, kind,
 
1414
             executable) in self._transform.iter_changes():
 
1415
            if paths[1] in to_find:
 
1416
                result.append(file_id)
 
1417
                to_find.remove(paths[1])
 
1418
        result.update(self._transform._tree.paths2ids(to_find,
 
1419
                      trees=[], require_versioned=require_versioned))
 
1420
        return result
 
1421
 
 
1422
    def path2id(self, path):
 
1423
        return self._transform._tree.path2id(path)
 
1424
 
 
1425
    def id2path(self, file_id):
 
1426
        trans_id = self._transform.trans_id_file_id(file_id)
 
1427
        try:
 
1428
            return self._final_paths._determine_path(trans_id)
 
1429
        except NoFinalPath:
 
1430
            raise errors.NoSuchId(self, file_id)
 
1431
 
 
1432
    def iter_entries_by_dir(self, specific_file_ids=None):
 
1433
        return self._transform._tree.iter_entries_by_dir(specific_file_ids)
 
1434
 
 
1435
    def kind(self, file_id):
 
1436
        trans_id = self._transform.trans_id_file_id(file_id)
 
1437
        return self._transform.final_kind(trans_id)
 
1438
 
 
1439
    def stored_kind(self, file_id):
 
1440
        return self._transform._tree.stored_kind(file_id)
 
1441
 
 
1442
    def get_file_mtime(self, file_id, path=None):
 
1443
        """See Tree.get_file_mtime"""
 
1444
        if not self._content_change(file_id):
 
1445
            return self._transform._tree.get_file_mtime(file_id, path)
 
1446
        return self._stat_limbo_file(file_id).st_mtime
 
1447
 
 
1448
    def get_file_size(self, file_id):
 
1449
        if self.kind(file_id) == 'file':
 
1450
            return self._transform._tree.get_file_size(file_id)
 
1451
 
 
1452
    def get_file_sha1(self, file_id, path=None, stat_value=None):
 
1453
        return self._transform._tree.get_file_sha1(file_id)
 
1454
 
 
1455
    def is_executable(self, file_id, path=None):
 
1456
        return self._transform._tree.is_executable(file_id, path)
 
1457
 
 
1458
    def path_content_summary(self, path):
 
1459
        return self._transform._tree.path_content_summary(path)
 
1460
 
1375
1461
    def iter_changes(self, from_tree, include_unchanged=False,
1376
1462
                      specific_files=None, pb=None, extra_trees=None,
1377
1463
                      require_versioned=True, want_unversioned=False):
1391
1477
            raise ValueError('want_unversioned is not supported')
1392
1478
        return self._transform.iter_changes()
1393
1479
 
1394
 
    def kind(self, file_id):
1395
 
        trans_id = self._transform.trans_id_file_id(file_id)
1396
 
        return self._transform.final_kind(trans_id)
1397
 
 
1398
 
    def get_file_mtime(self, file_id, path=None):
1399
 
        """See Tree.get_file_mtime"""
1400
 
        trans_id = self._transform.trans_id_file_id(file_id)
1401
 
        name = self._transform._limbo_name(trans_id)
1402
 
        return os.stat(name).st_mtime
1403
 
 
1404
 
    def get_file(self, file_id):
 
1480
    def get_file(self, file_id, path=None):
1405
1481
        """See Tree.get_file"""
 
1482
        if not self._content_change(file_id):
 
1483
            return self._transform._tree.get_file(file_id, path)
1406
1484
        trans_id = self._transform.trans_id_file_id(file_id)
1407
1485
        name = self._transform._limbo_name(trans_id)
1408
1486
        return open(name, 'rb')
1409
1487
 
 
1488
    def get_file_text(self, file_id):
 
1489
        text_file = self.get_file(file_id)
 
1490
        try:
 
1491
            return text_file.read()
 
1492
        finally:
 
1493
            text_file.close()
 
1494
 
 
1495
    def annotate_iter(self, file_id,
 
1496
                      default_revision=_mod_revision.CURRENT_REVISION):
 
1497
        return self._transform._tree.annotate_iter(file_id,
 
1498
            default_revision=default_revision)
 
1499
 
1410
1500
    def get_symlink_target(self, file_id):
1411
1501
        """See Tree.get_symlink_target"""
 
1502
        if not self._content_change(file_id):
 
1503
            return self._transform._tree.get_symlink_target(file_id)
1412
1504
        trans_id = self._transform.trans_id_file_id(file_id)
1413
1505
        name = self._transform._limbo_name(trans_id)
1414
1506
        return os.readlink(name)
1415
1507
 
1416
 
    def paths2ids(self, specific_files, trees=None, require_versioned=False):
1417
 
        """See Tree.paths2ids"""
1418
 
        return 'not_empty'
 
1508
    def list_files(self, include_root=False):
 
1509
        return self._transform._tree.list_files(include_root)
 
1510
 
 
1511
    def walkdirs(self, prefix=""):
 
1512
        return self._transform._tree.walkdirs(prefix)
 
1513
 
 
1514
    def get_parent_ids(self):
 
1515
        return self._transform._tree.get_parent_ids()
 
1516
 
 
1517
    def get_revision_tree(self, revision_id):
 
1518
        return self._transform._tree.get_revision_tree(revision_id)
1419
1519
 
1420
1520
 
1421
1521
def joinpath(parent, child):
1839
1939
    tt = TreeTransform(working_tree, pb)
1840
1940
    try:
1841
1941
        pp = ProgressPhase("Revert phase", 3, pb)
1842
 
        pp.next_phase()
1843
 
        child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1844
 
        try:
1845
 
            merge_modified = _alter_files(working_tree, target_tree, tt,
1846
 
                                          child_pb, filenames, backups)
1847
 
        finally:
1848
 
            child_pb.finished()
1849
 
        pp.next_phase()
1850
 
        child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1851
 
        try:
1852
 
            raw_conflicts = resolve_conflicts(tt, child_pb,
1853
 
                lambda t, c: conflict_pass(t, c, target_tree))
1854
 
        finally:
1855
 
            child_pb.finished()
1856
 
        conflicts = cook_conflicts(raw_conflicts, tt)
 
1942
        conflicts, merge_modified = _prepare_revert_transform(
 
1943
            working_tree, target_tree, tt, filenames, backups, pp)
1857
1944
        if change_reporter:
1858
1945
            change_reporter = delta._ChangeReporter(
1859
1946
                unversioned_filter=working_tree.is_ignored)
1870
1957
    return conflicts
1871
1958
 
1872
1959
 
 
1960
def _prepare_revert_transform(working_tree, target_tree, tt, filenames,
 
1961
                              backups, pp):
 
1962
    pp.next_phase()
 
1963
    child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
 
1964
    try:
 
1965
        merge_modified = _alter_files(working_tree, target_tree, tt,
 
1966
                                      child_pb, filenames, backups)
 
1967
    finally:
 
1968
        child_pb.finished()
 
1969
    pp.next_phase()
 
1970
    child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
 
1971
    try:
 
1972
        raw_conflicts = resolve_conflicts(tt, child_pb,
 
1973
            lambda t, c: conflict_pass(t, c, target_tree))
 
1974
    finally:
 
1975
        child_pb.finished()
 
1976
    conflicts = cook_conflicts(raw_conflicts, tt)
 
1977
    return conflicts, merge_modified
 
1978
 
 
1979
 
1873
1980
def _alter_files(working_tree, target_tree, tt, pb, specific_files,
1874
1981
                 backups):
1875
1982
    merge_modified = working_tree.merge_modified()