1359
1360
yield self.trans_id_tree_path(childpath)
1362
class _PreviewTree(object):
1363
class _PreviewTree(tree.Tree):
1363
1364
"""Partial implementation of Tree to support show_diff_trees"""
1365
1366
def __init__(self, transform):
1366
1367
self._transform = transform
1368
self._final_paths = FinalPaths(transform)
1370
def _changes(self, file_id):
1371
for changes in self._transform.iter_changes():
1372
if changes[0] == file_id:
1375
def _content_change(self, file_id):
1376
changes = self._changes(file_id)
1377
return (changes is not None and changes[2])
1379
def _get_file_revision(self, file_id, vf, tree_revision):
1380
return self._transform._tree._get_file_revision(file_id, vf,
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)
1368
1388
def lock_read(self):
1369
1389
# Perhaps in theory, this should lock the TreeTransform?
1372
1392
def unlock(self):
1396
def inventory(self):
1397
"""This Tree does not use inventory as its backing data."""
1398
raise NotImplementedError(_PreviewTree.inventory)
1400
def get_root_id(self):
1401
return self._transform.final_file_id(self._transform.root)
1403
def all_file_ids(self):
1404
return self._transform._tree.all_file_ids()
1407
return iter(self.all_file_ids())
1409
def paths2ids(self, specific_files, trees=None, require_versioned=False):
1410
"""See Tree.paths2ids"""
1411
to_find = set(specific_files)
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))
1422
def path2id(self, path):
1423
return self._transform._tree.path2id(path)
1425
def id2path(self, file_id):
1426
trans_id = self._transform.trans_id_file_id(file_id)
1428
return self._final_paths._determine_path(trans_id)
1430
raise errors.NoSuchId(self, file_id)
1432
def iter_entries_by_dir(self, specific_file_ids=None):
1433
return self._transform._tree.iter_entries_by_dir(specific_file_ids)
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)
1439
def stored_kind(self, file_id):
1440
return self._transform._tree.stored_kind(file_id)
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
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)
1452
def get_file_sha1(self, file_id, path=None, stat_value=None):
1453
return self._transform._tree.get_file_sha1(file_id)
1455
def is_executable(self, file_id, path=None):
1456
return self._transform._tree.is_executable(file_id, path)
1458
def path_content_summary(self, path):
1459
return self._transform._tree.path_content_summary(path)
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()
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)
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
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')
1488
def get_file_text(self, file_id):
1489
text_file = self.get_file(file_id)
1491
return text_file.read()
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)
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)
1416
def paths2ids(self, specific_files, trees=None, require_versioned=False):
1417
"""See Tree.paths2ids"""
1508
def list_files(self, include_root=False):
1509
return self._transform._tree.list_files(include_root)
1511
def walkdirs(self, prefix=""):
1512
return self._transform._tree.walkdirs(prefix)
1514
def get_parent_ids(self):
1515
return self._transform._tree.get_parent_ids()
1517
def get_revision_tree(self, revision_id):
1518
return self._transform._tree.get_revision_tree(revision_id)
1421
1521
def joinpath(parent, child):
1839
1939
tt = TreeTransform(working_tree, pb)
1841
1941
pp = ProgressPhase("Revert phase", 3, pb)
1843
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1845
merge_modified = _alter_files(working_tree, target_tree, tt,
1846
child_pb, filenames, backups)
1850
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1852
raw_conflicts = resolve_conflicts(tt, child_pb,
1853
lambda t, c: conflict_pass(t, c, target_tree))
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
1960
def _prepare_revert_transform(working_tree, target_tree, tt, filenames,
1963
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1965
merge_modified = _alter_files(working_tree, target_tree, tt,
1966
child_pb, filenames, backups)
1970
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1972
raw_conflicts = resolve_conflicts(tt, child_pb,
1973
lambda t, c: conflict_pass(t, c, target_tree))
1976
conflicts = cook_conflicts(raw_conflicts, tt)
1977
return conflicts, merge_modified
1873
1980
def _alter_files(working_tree, target_tree, tt, pb, specific_files,
1875
1982
merge_modified = working_tree.merge_modified()