399
400
If the left most parent is a ghost then the returned tree will be an
400
401
empty tree - one obtained by calling repository.revision_tree(None).
402
revision_id = self.last_revision()
403
if revision_id is not None:
404
revision_id = self.get_parent_ids()[0]
406
# no parents, return an empty revision tree.
407
# in the future this should return the tree for
408
# 'empty:' - the implicit root empty tree.
409
return self.branch.repository.revision_tree(None)
405
412
xml = self.read_basis_inventory()
406
413
inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(xml)
410
417
if inv is not None and inv.revision_id == revision_id:
411
418
return bzrlib.tree.RevisionTree(self.branch.repository, inv,
413
# FIXME? RBC 20060403 should we cache the inventory here ?
420
# No cached copy available, retrieve from the repository.
421
# FIXME? RBC 20060403 should we cache the inventory locally
415
424
return self.branch.repository.revision_tree(revision_id)
416
425
except errors.RevisionNotPresent:
557
566
args = (DEPRECATED_PARAMETER, message, ) + args
558
567
committed_id = Commit().commit( working_tree=self, revprops=revprops,
560
self._set_inventory(self.read_working_inventory())
561
569
return committed_id
563
571
def id2abspath(self, file_id):
693
701
If the revision_id is a ghost, pass None for the tree.
694
702
:param allow_leftmost_as_ghost: Allow the first parent to be a ghost.
696
self.set_parent_ids(self.get_parent_ids() + [parent_tuple[0]],
704
parent_ids = self.get_parent_ids() + [parent_tuple[0]]
705
if len(parent_ids) > 1:
706
# the leftmost may have already been a ghost, preserve that if it
708
allow_leftmost_as_ghost = True
709
self.set_parent_ids(parent_ids,
697
710
allow_leftmost_as_ghost=allow_leftmost_as_ghost)
699
712
@needs_write_lock
711
724
self.set_parent_ids(parents, allow_leftmost_as_ghost=True)
726
@deprecated_method(zero_eleven)
714
728
def pending_merges(self):
715
729
"""Return a list of pending merges.
717
731
These are revisions that have been merged into the working
718
732
directory but not yet committed.
734
As of 0.11 this is deprecated. Please see WorkingTree.get_parent_ids()
735
instead - which is available on all tree objects.
720
737
return self.get_parent_ids()[1:]
775
792
my_file = rio_file(stanzas, header)
776
793
self._control_files.put(filename, my_file)
796
def merge_from_branch(self, branch, to_revision=None):
797
"""Merge from a branch into this working tree.
799
:param branch: The branch to merge from.
800
:param to_revision: If non-None, the merge will merge to to_revision, but
801
not beyond it. to_revision does not need to be in the history of
802
the branch when it is supplied. If None, to_revision defaults to
803
branch.last_revision().
805
from bzrlib.merge import Merger, Merge3Merger
806
pb = bzrlib.ui.ui_factory.nested_progress_bar()
808
merger = Merger(self.branch, this_tree=self, pb=pb)
809
merger.pp = ProgressPhase("Merge phase", 5, pb)
810
merger.pp.next_phase()
811
# check that there are no
813
merger.check_basis(check_clean=True, require_commits=False)
814
if to_revision is None:
815
to_revision = branch.last_revision()
816
merger.other_rev_id = to_revision
817
if merger.other_rev_id is None:
818
raise error.NoCommits(branch)
819
self.branch.fetch(branch, last_revision=merger.other_rev_id)
820
merger.other_basis = merger.other_rev_id
821
merger.other_tree = self.branch.repository.revision_tree(
823
merger.pp.next_phase()
825
if merger.base_rev_id == merger.other_rev_id:
826
raise errors.PointlessMerge
827
merger.backup_files = False
828
merger.merge_type = Merge3Merger
829
merger.set_interesting_files(None)
830
merger.show_base = False
831
merger.reprocess = False
832
conflicts = merger.do_merge()
779
839
def merge_modified(self):
1044
1104
for subp in self.extras():
1045
1105
if not self.is_ignored(subp):
1109
def unversion(self, file_ids):
1110
"""Remove the file ids in file_ids from the current versioned set.
1112
When a file_id is unversioned, all of its children are automatically
1115
:param file_ids: The file ids to stop versioning.
1116
:raises: NoSuchId if any fileid is not currently versioned.
1118
for file_id in file_ids:
1119
if self._inventory.has_id(file_id):
1120
self._inventory.remove_recursive_id(file_id)
1122
raise errors.NoSuchId(self, file_id)
1124
# in the future this should just set a dirty bit to wait for the
1125
# final unlock. However, until all methods of workingtree start
1126
# with the current in -memory inventory rather than triggering
1127
# a read, it is more complex - we need to teach read_inventory
1128
# to know when to read, and when to not read first... and possibly
1129
# to save first when the in memory one may be corrupted.
1130
# so for now, we just only write it if it is indeed dirty.
1132
self._write_inventory(self._inventory)
1048
1134
@deprecated_method(zero_eight)
1049
1135
def iter_conflicts(self):
1050
1136
"""List all files in the tree that have text or content conflicts.
1272
1358
def kind(self, file_id):
1273
1359
return file_kind(self.id2abspath(file_id))
1276
1361
def last_revision(self):
1277
1362
"""Return the last revision id of this working tree.
1279
In early branch formats this was == the branch last_revision,
1364
In early branch formats this was the same as the branch last_revision,
1280
1365
but that cannot be relied upon - for working tree operations,
1281
always use tree.last_revision().
1366
always use tree.last_revision(). This returns the left most parent id,
1367
or None if there are no parents.
1369
This was deprecated as of 0.11. Please use get_parent_ids instead.
1371
return self._last_revision()
1374
def _last_revision(self):
1375
"""helper for get_parent_ids."""
1283
1376
return self.branch.last_revision()
1285
1378
def is_locked(self):
1512
1605
# local work is unreferenced and will appear to have been lost.
1515
if self.last_revision() != self.branch.last_revision():
1609
last_rev = self.get_parent_ids()[0]
1612
if last_rev != self.branch.last_revision():
1516
1613
# merge tree state up to new branch tip.
1517
1614
basis = self.basis_tree()
1518
1615
to_tree = self.branch.basis_tree()
1536
1633
parent_trees.append(
1537
1634
(old_tip, self.branch.repository.revision_tree(old_tip)))
1538
1635
self.set_parent_trees(parent_trees)
1636
last_rev = parent_trees[0][0]
1540
1638
# the working tree had the same last-revision as the master
1541
1639
# branch did. We may still have pivot local work from the local
1542
1640
# branch into old_tip:
1543
1641
if old_tip is not None:
1544
1642
self.add_parent_tree_id(old_tip)
1545
if old_tip and old_tip != self.last_revision():
1643
if old_tip and old_tip != last_rev:
1546
1644
# our last revision was not the prior branch last revision
1547
1645
# and we have converted that last revision to a pending merge.
1548
1646
# base is somewhere between the branch tip now