/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: Martin Pool
  • Date: 2008-05-08 04:33:38 UTC
  • mfrom: (3414 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3415.
  • Revision ID: mbp@sourcefrog.net-20080508043338-ru3vflx8z641a76k
Merge trunk

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,
38
39
from bzrlib.progress import DummyProgress, ProgressPhase
39
40
from bzrlib.symbol_versioning import (
40
41
        deprecated_function,
41
 
        zero_fifteen,
42
 
        zero_ninety,
43
42
        )
44
43
from bzrlib.trace import mutter, warning
45
44
from bzrlib import tree
1357
1356
            yield self.trans_id_tree_path(childpath)
1358
1357
 
1359
1358
 
1360
 
class _PreviewTree(object):
 
1359
class _PreviewTree(tree.Tree):
1361
1360
    """Partial implementation of Tree to support show_diff_trees"""
1362
1361
 
1363
1362
    def __init__(self, transform):
1364
1363
        self._transform = transform
 
1364
        self._final_paths = FinalPaths(transform)
 
1365
 
 
1366
    def _changes(self, file_id):
 
1367
        for changes in self._transform.iter_changes():
 
1368
            if changes[0] == file_id:
 
1369
                return changes
 
1370
 
 
1371
    def _content_change(self, file_id):
 
1372
        """Return True if the content of this file changed"""
 
1373
        changes = self._changes(file_id)
 
1374
        # changes[2] is true if the file content changed.  See
 
1375
        # InterTree.iter_changes.
 
1376
        return (changes is not None and changes[2])
 
1377
 
 
1378
    def _get_file_revision(self, file_id, vf, tree_revision):
 
1379
        return self._transform._tree._get_file_revision(file_id, vf,
 
1380
                                                        tree_revision)
 
1381
 
 
1382
    def _stat_limbo_file(self, file_id):
 
1383
        trans_id = self._transform.trans_id_file_id(file_id)
 
1384
        name = self._transform._limbo_name(trans_id)
 
1385
        return os.lstat(name)
1365
1386
 
1366
1387
    def lock_read(self):
1367
1388
        # Perhaps in theory, this should lock the TreeTransform?
1370
1391
    def unlock(self):
1371
1392
        pass
1372
1393
 
 
1394
    @property
 
1395
    def inventory(self):
 
1396
        """This Tree does not use inventory as its backing data."""
 
1397
        raise NotImplementedError(_PreviewTree.inventory)
 
1398
 
 
1399
    def get_root_id(self):
 
1400
        return self._transform.final_file_id(self._transform.root)
 
1401
 
 
1402
    def all_file_ids(self):
 
1403
        return self._transform._tree.all_file_ids()
 
1404
 
 
1405
    def __iter__(self):
 
1406
        return iter(self.all_file_ids())
 
1407
 
 
1408
    def paths2ids(self, specific_files, trees=None, require_versioned=False):
 
1409
        """See Tree.paths2ids"""
 
1410
        to_find = set(specific_files)
 
1411
        result = set()
 
1412
        for (file_id, paths, changed, versioned, parent, name, kind,
 
1413
             executable) in self._transform.iter_changes():
 
1414
            if paths[1] in to_find:
 
1415
                result.append(file_id)
 
1416
                to_find.remove(paths[1])
 
1417
        result.update(self._transform._tree.paths2ids(to_find,
 
1418
                      trees=[], require_versioned=require_versioned))
 
1419
        return result
 
1420
 
 
1421
    def path2id(self, path):
 
1422
        return self._transform._tree.path2id(path)
 
1423
 
 
1424
    def id2path(self, file_id):
 
1425
        trans_id = self._transform.trans_id_file_id(file_id)
 
1426
        try:
 
1427
            return self._final_paths._determine_path(trans_id)
 
1428
        except NoFinalPath:
 
1429
            raise errors.NoSuchId(self, file_id)
 
1430
 
 
1431
    def iter_entries_by_dir(self, specific_file_ids=None):
 
1432
        return self._transform._tree.iter_entries_by_dir(specific_file_ids)
 
1433
 
 
1434
    def kind(self, file_id):
 
1435
        trans_id = self._transform.trans_id_file_id(file_id)
 
1436
        return self._transform.final_kind(trans_id)
 
1437
 
 
1438
    def stored_kind(self, file_id):
 
1439
        return self._transform._tree.stored_kind(file_id)
 
1440
 
 
1441
    def get_file_mtime(self, file_id, path=None):
 
1442
        """See Tree.get_file_mtime"""
 
1443
        if not self._content_change(file_id):
 
1444
            return self._transform._tree.get_file_mtime(file_id, path)
 
1445
        return self._stat_limbo_file(file_id).st_mtime
 
1446
 
 
1447
    def get_file_size(self, file_id):
 
1448
        """See Tree.get_file_size"""
 
1449
        if self.kind(file_id) == 'file':
 
1450
            return self._transform._tree.get_file_size(file_id)
 
1451
        else:
 
1452
            return None
 
1453
 
 
1454
    def get_file_sha1(self, file_id, path=None, stat_value=None):
 
1455
        return self._transform._tree.get_file_sha1(file_id)
 
1456
 
 
1457
    def is_executable(self, file_id, path=None):
 
1458
        return self._transform._tree.is_executable(file_id, path)
 
1459
 
 
1460
    def path_content_summary(self, path):
 
1461
        return self._transform._tree.path_content_summary(path)
 
1462
 
1373
1463
    def iter_changes(self, from_tree, include_unchanged=False,
1374
1464
                      specific_files=None, pb=None, extra_trees=None,
1375
1465
                      require_versioned=True, want_unversioned=False):
1389
1479
            raise ValueError('want_unversioned is not supported')
1390
1480
        return self._transform.iter_changes()
1391
1481
 
1392
 
    def kind(self, file_id):
1393
 
        trans_id = self._transform.trans_id_file_id(file_id)
1394
 
        return self._transform.final_kind(trans_id)
1395
 
 
1396
 
    def get_file_mtime(self, file_id, path=None):
1397
 
        """See Tree.get_file_mtime"""
1398
 
        trans_id = self._transform.trans_id_file_id(file_id)
1399
 
        name = self._transform._limbo_name(trans_id)
1400
 
        return os.stat(name).st_mtime
1401
 
 
1402
 
    def get_file(self, file_id):
 
1482
    def get_file(self, file_id, path=None):
1403
1483
        """See Tree.get_file"""
 
1484
        if not self._content_change(file_id):
 
1485
            return self._transform._tree.get_file(file_id, path)
1404
1486
        trans_id = self._transform.trans_id_file_id(file_id)
1405
1487
        name = self._transform._limbo_name(trans_id)
1406
1488
        return open(name, 'rb')
1407
1489
 
 
1490
    def get_file_text(self, file_id):
 
1491
        text_file = self.get_file(file_id)
 
1492
        try:
 
1493
            return text_file.read()
 
1494
        finally:
 
1495
            text_file.close()
 
1496
 
 
1497
    def annotate_iter(self, file_id,
 
1498
                      default_revision=_mod_revision.CURRENT_REVISION):
 
1499
        return self._transform._tree.annotate_iter(file_id,
 
1500
            default_revision=default_revision)
 
1501
 
1408
1502
    def get_symlink_target(self, file_id):
1409
1503
        """See Tree.get_symlink_target"""
 
1504
        if not self._content_change(file_id):
 
1505
            return self._transform._tree.get_symlink_target(file_id)
1410
1506
        trans_id = self._transform.trans_id_file_id(file_id)
1411
1507
        name = self._transform._limbo_name(trans_id)
1412
1508
        return os.readlink(name)
1413
1509
 
1414
 
    def paths2ids(self, specific_files, trees=None, require_versioned=False):
1415
 
        """See Tree.paths2ids"""
1416
 
        return 'not_empty'
 
1510
    def list_files(self, include_root=False):
 
1511
        return self._transform._tree.list_files(include_root)
 
1512
 
 
1513
    def walkdirs(self, prefix=""):
 
1514
        return self._transform._tree.walkdirs(prefix)
 
1515
 
 
1516
    def get_parent_ids(self):
 
1517
        return self._transform._tree.get_parent_ids()
 
1518
 
 
1519
    def get_revision_tree(self, revision_id):
 
1520
        return self._transform._tree.get_revision_tree(revision_id)
1417
1521
 
1418
1522
 
1419
1523
def joinpath(parent, child):
1727
1831
        tt.set_executability(entry.executable, trans_id)
1728
1832
 
1729
1833
 
1730
 
@deprecated_function(zero_fifteen)
1731
 
def find_interesting(working_tree, target_tree, filenames):
1732
 
    """Find the ids corresponding to specified filenames.
1733
 
    
1734
 
    Deprecated: Please use tree1.paths2ids(filenames, [tree2]).
1735
 
    """
1736
 
    working_tree.lock_read()
1737
 
    try:
1738
 
        target_tree.lock_read()
1739
 
        try:
1740
 
            return working_tree.paths2ids(filenames, [target_tree])
1741
 
        finally:
1742
 
            target_tree.unlock()
1743
 
    finally:
1744
 
        working_tree.unlock()
1745
 
 
1746
 
 
1747
 
@deprecated_function(zero_ninety)
1748
 
def change_entry(tt, file_id, working_tree, target_tree, 
1749
 
                 trans_id_file_id, backups, trans_id, by_parent):
1750
 
    """Replace a file_id's contents with those from a target tree."""
1751
 
    if file_id is None and target_tree is None:
1752
 
        # skip the logic altogether in the deprecation test
1753
 
        return
1754
 
    e_trans_id = trans_id_file_id(file_id)
1755
 
    entry = target_tree.inventory[file_id]
1756
 
    has_contents, contents_mod, meta_mod, = _entry_changes(file_id, entry, 
1757
 
                                                           working_tree)
1758
 
    if contents_mod:
1759
 
        mode_id = e_trans_id
1760
 
        if has_contents:
1761
 
            if not backups:
1762
 
                tt.delete_contents(e_trans_id)
1763
 
            else:
1764
 
                parent_trans_id = trans_id_file_id(entry.parent_id)
1765
 
                backup_name = get_backup_name(entry, by_parent,
1766
 
                                              parent_trans_id, tt)
1767
 
                tt.adjust_path(backup_name, parent_trans_id, e_trans_id)
1768
 
                tt.unversion_file(e_trans_id)
1769
 
                e_trans_id = tt.create_path(entry.name, parent_trans_id)
1770
 
                tt.version_file(file_id, e_trans_id)
1771
 
                trans_id[file_id] = e_trans_id
1772
 
        create_by_entry(tt, entry, target_tree, e_trans_id, mode_id=mode_id)
1773
 
        create_entry_executability(tt, entry, e_trans_id)
1774
 
 
1775
 
    elif meta_mod:
1776
 
        tt.set_executability(entry.executable, e_trans_id)
1777
 
    if tt.final_name(e_trans_id) != entry.name:
1778
 
        adjust_path  = True
1779
 
    else:
1780
 
        parent_id = tt.final_parent(e_trans_id)
1781
 
        parent_file_id = tt.final_file_id(parent_id)
1782
 
        if parent_file_id != entry.parent_id:
1783
 
            adjust_path = True
1784
 
        else:
1785
 
            adjust_path = False
1786
 
    if adjust_path:
1787
 
        parent_trans_id = trans_id_file_id(entry.parent_id)
1788
 
        tt.adjust_path(entry.name, parent_trans_id, e_trans_id)
1789
 
 
1790
 
 
1791
1834
def get_backup_name(entry, by_parent, parent_trans_id, tt):
1792
1835
    return _get_backup_name(entry.name, by_parent, parent_trans_id, tt)
1793
1836