14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
# TODO: Don't allow WorkingTrees to be constructed for remote branches.
17
"""WorkingTree object and friends.
19
A WorkingTree represents the editable working copy of a branch.
20
Operations which represent the WorkingTree are also done here,
21
such as renaming or adding files. The WorkingTree has an inventory
22
which is updated by these operations. A commit produces a
23
new revision based on the workingtree and its inventory.
25
At the moment every WorkingTree has its own branch. Remote
26
WorkingTrees aren't supported.
28
To get a WorkingTree, call Branch.working_tree():
32
# TODO: Don't allow WorkingTrees to be constructed for remote branches if
19
35
# FIXME: I don't know if writing out the cache from the destructor is really a
20
# good idea, because destructors are considered poor taste in Python, and
21
# it's not predictable when it will be written out.
36
# good idea, because destructors are considered poor taste in Python, and it's
37
# not predictable when it will be written out.
39
# TODO: Give the workingtree sole responsibility for the working inventory;
40
# remove the variable and references to it from the branch. This may require
41
# updating the commit code so as to update the inventory within the working
42
# copy, and making sure there's only one WorkingTree for any directory on disk.
43
# At the momenthey may alias the inventory and have old copies of it in memory.
27
49
from bzrlib.branch import Branch, needs_read_lock, needs_write_lock, quotefn
29
51
from bzrlib.osutils import appendpath, file_kind, isdir, splitpath, relpath
30
from bzrlib.errors import BzrCheckError, DivergedBranches
52
from bzrlib.errors import BzrCheckError, DivergedBranches, NotVersionedError
31
53
from bzrlib.trace import mutter
33
55
class TreeEntry(object):
106
128
from bzrlib.hashcache import HashCache
107
129
from bzrlib.trace import note, mutter
130
assert isinstance(basedir, basestring), \
131
"base directory %r is not a string" % basedir
109
132
if branch is None:
110
133
branch = Branch.open(basedir)
134
assert isinstance(branch, Branch), \
135
"branch %r is not a Branch" % branch
111
136
self._inventory = branch.inventory
112
137
self.path2id = self._inventory.path2id
113
138
self.branch = branch
455
480
fid = inv.path2id(f)
457
raise BzrError("cannot remove unversioned file %s" % quotefn(f))
482
# TODO: Perhaps make this just a warning, and continue?
483
# This tends to happen when
484
raise NotVersionedError(path=f)
458
485
mutter("remove inventory entry %s {%s}" % (quotefn(f), fid))
460
487
# having remove it, it must be either ignored or unknown