1357
1356
yield self.trans_id_tree_path(childpath)
1360
class _PreviewTree(object):
1359
class _PreviewTree(tree.Tree):
1361
1360
"""Partial implementation of Tree to support show_diff_trees"""
1363
1362
def __init__(self, transform):
1364
1363
self._transform = transform
1364
self._final_paths = FinalPaths(transform)
1366
def _changes(self, file_id):
1367
for changes in self._transform.iter_changes():
1368
if changes[0] == file_id:
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])
1378
def _get_file_revision(self, file_id, vf, tree_revision):
1379
return self._transform._tree._get_file_revision(file_id, vf,
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)
1366
1387
def lock_read(self):
1367
1388
# Perhaps in theory, this should lock the TreeTransform?
1370
1391
def unlock(self):
1395
def inventory(self):
1396
"""This Tree does not use inventory as its backing data."""
1397
raise NotImplementedError(_PreviewTree.inventory)
1399
def get_root_id(self):
1400
return self._transform.final_file_id(self._transform.root)
1402
def all_file_ids(self):
1403
return self._transform._tree.all_file_ids()
1406
return iter(self.all_file_ids())
1408
def paths2ids(self, specific_files, trees=None, require_versioned=False):
1409
"""See Tree.paths2ids"""
1410
to_find = set(specific_files)
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))
1421
def path2id(self, path):
1422
return self._transform._tree.path2id(path)
1424
def id2path(self, file_id):
1425
trans_id = self._transform.trans_id_file_id(file_id)
1427
return self._final_paths._determine_path(trans_id)
1429
raise errors.NoSuchId(self, file_id)
1431
def iter_entries_by_dir(self, specific_file_ids=None):
1432
return self._transform._tree.iter_entries_by_dir(specific_file_ids)
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)
1438
def stored_kind(self, file_id):
1439
return self._transform._tree.stored_kind(file_id)
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
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)
1454
def get_file_sha1(self, file_id, path=None, stat_value=None):
1455
return self._transform._tree.get_file_sha1(file_id)
1457
def is_executable(self, file_id, path=None):
1458
return self._transform._tree.is_executable(file_id, path)
1460
def path_content_summary(self, path):
1461
return self._transform._tree.path_content_summary(path)
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()
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)
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
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')
1490
def get_file_text(self, file_id):
1491
text_file = self.get_file(file_id)
1493
return text_file.read()
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)
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)
1414
def paths2ids(self, specific_files, trees=None, require_versioned=False):
1415
"""See Tree.paths2ids"""
1510
def list_files(self, include_root=False):
1511
return self._transform._tree.list_files(include_root)
1513
def walkdirs(self, prefix=""):
1514
return self._transform._tree.walkdirs(prefix)
1516
def get_parent_ids(self):
1517
return self._transform._tree.get_parent_ids()
1519
def get_revision_tree(self, revision_id):
1520
return self._transform._tree.get_revision_tree(revision_id)
1419
1523
def joinpath(parent, child):
1727
1831
tt.set_executability(entry.executable, trans_id)
1730
@deprecated_function(zero_fifteen)
1731
def find_interesting(working_tree, target_tree, filenames):
1732
"""Find the ids corresponding to specified filenames.
1734
Deprecated: Please use tree1.paths2ids(filenames, [tree2]).
1736
working_tree.lock_read()
1738
target_tree.lock_read()
1740
return working_tree.paths2ids(filenames, [target_tree])
1742
target_tree.unlock()
1744
working_tree.unlock()
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
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,
1759
mode_id = e_trans_id
1762
tt.delete_contents(e_trans_id)
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)
1776
tt.set_executability(entry.executable, e_trans_id)
1777
if tt.final_name(e_trans_id) != entry.name:
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:
1787
parent_trans_id = trans_id_file_id(entry.parent_id)
1788
tt.adjust_path(entry.name, parent_trans_id, e_trans_id)
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)