1162
1169
:return: A bzrlib.lock.LogicalLockResult.
1164
if not self.is_locked():
1166
self.branch.lock_read()
1168
self._control_files.lock_read()
1169
return LogicalLockResult(self.unlock)
1171
self.branch.unlock()
1171
raise NotImplementedError(self.lock_read)
1174
1173
def lock_tree_write(self):
1175
1174
"""See MutableTree.lock_tree_write, and WorkingTree.unlock.
1177
1176
:return: A bzrlib.lock.LogicalLockResult.
1179
if not self.is_locked():
1181
self.branch.lock_read()
1183
self._control_files.lock_write()
1184
return LogicalLockResult(self.unlock)
1186
self.branch.unlock()
1178
raise NotImplementedError(self.lock_tree_write)
1189
1180
def lock_write(self):
1190
1181
"""See MutableTree.lock_write, and WorkingTree.unlock.
1192
1183
:return: A bzrlib.lock.LogicalLockResult.
1194
if not self.is_locked():
1196
self.branch.lock_write()
1198
self._control_files.lock_write()
1199
return LogicalLockResult(self.unlock)
1201
self.branch.unlock()
1185
raise NotImplementedError(self.lock_write)
1204
1187
def get_physical_lock_status(self):
1205
return self._control_files.get_physical_lock_status()
1207
def _reset_data(self):
1208
"""Reset transient data that cannot be revalidated."""
1209
raise NotImplementedError(self._reset_data)
1188
raise NotImplementedError(self.get_physical_lock_status)
1211
1190
def set_last_revision(self, new_revision):
1212
1191
"""Change the last revision in the working tree."""
1378
1357
basis_tree.unlock()
1379
1358
return conflicts
1361
def store_uncommitted(self):
1362
"""Store uncommitted changes from the tree in the branch."""
1363
target_tree = self.basis_tree()
1364
shelf_creator = shelf.ShelfCreator(self, target_tree)
1366
if not shelf_creator.shelve_all():
1368
self.branch.store_uncommitted(shelf_creator)
1369
shelf_creator.transform()
1371
shelf_creator.finalize()
1372
note('Uncommitted changes stored in branch "%s".', self.branch.nick)
1375
def restore_uncommitted(self):
1376
"""Restore uncommitted changes from the branch into the tree."""
1377
unshelver = self.branch.get_unshelver(self)
1378
if unshelver is None:
1381
merger = unshelver.make_merger()
1382
merger.ignore_zero = True
1384
self.branch.store_uncommitted(None)
1386
unshelver.finalize()
1381
1388
def revision_tree(self, revision_id):
1382
1389
"""See Tree.revision_tree.
1835
1843
def _deserialize(selt, in_file):
1836
1844
return xml5.serializer_v5.read_inventory(in_file)
1846
def break_lock(self):
1847
"""Break a lock if one is present from another instance.
1849
Uses the ui factory to ask for confirmation if the lock may be from
1852
This will probe the repository for its lock as well.
1854
self._control_files.break_lock()
1855
self.branch.break_lock()
1857
def is_locked(self):
1858
return self._control_files.is_locked()
1860
def _must_be_locked(self):
1861
if not self.is_locked():
1862
raise errors.ObjectNotLocked(self)
1864
def lock_read(self):
1865
"""Lock the tree for reading.
1867
This also locks the branch, and can be unlocked via self.unlock().
1869
:return: A bzrlib.lock.LogicalLockResult.
1871
if not self.is_locked():
1873
self.branch.lock_read()
1875
self._control_files.lock_read()
1876
return LogicalLockResult(self.unlock)
1878
self.branch.unlock()
1881
def lock_tree_write(self):
1882
"""See MutableTree.lock_tree_write, and WorkingTree.unlock.
1884
:return: A bzrlib.lock.LogicalLockResult.
1886
if not self.is_locked():
1888
self.branch.lock_read()
1890
self._control_files.lock_write()
1891
return LogicalLockResult(self.unlock)
1893
self.branch.unlock()
1896
def lock_write(self):
1897
"""See MutableTree.lock_write, and WorkingTree.unlock.
1899
:return: A bzrlib.lock.LogicalLockResult.
1901
if not self.is_locked():
1903
self.branch.lock_write()
1905
self._control_files.lock_write()
1906
return LogicalLockResult(self.unlock)
1908
self.branch.unlock()
1911
def get_physical_lock_status(self):
1912
return self._control_files.get_physical_lock_status()
1838
1914
@needs_tree_write_lock
1839
1915
def _write_inventory(self, inv):
1840
1916
"""Write inventory as the current inventory."""
2040
2112
def has_id(self, file_id):
2041
2113
# files that have been deleted are excluded
2042
inv = self.inventory
2043
if not inv.has_id(file_id):
2114
inv, inv_file_id = self._unpack_file_id(file_id)
2115
if not inv.has_id(inv_file_id):
2045
path = inv.id2path(file_id)
2117
path = inv.id2path(inv_file_id)
2046
2118
return osutils.lexists(self.abspath(path))
2048
2120
def has_or_had_id(self, file_id):
2049
if file_id == self.inventory.root.file_id:
2121
if file_id == self.get_root_id():
2051
return self.inventory.has_id(file_id)
2123
inv, inv_file_id = self._unpack_file_id(file_id)
2124
return inv.has_id(inv_file_id)
2053
@symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4, 0)))
2126
def all_file_ids(self):
2055
2127
"""Iterate through file_ids for this tree.
2057
2129
file_ids are in a WorkingTree if they are in the working inventory
2058
2130
and the working file exists.
2060
inv = self._inventory
2061
for path, ie in inv.iter_entries():
2062
if osutils.lexists(self.abspath(path)):
2133
for path, ie in self.iter_entries_by_dir():
2065
2137
@needs_tree_write_lock
2066
2138
def set_last_revision(self, new_revision):
2151
2223
def _is_executable_from_path_and_stat_from_basis(self, path, stat_result):
2152
file_id = self.path2id(path)
2224
inv, file_id = self._path2inv_file_id(path)
2153
2225
if file_id is None:
2154
2226
# For unversioned files on win32, we just assume they are not
2157
return self._inventory[file_id].executable
2229
return inv[file_id].executable
2159
2231
def _is_executable_from_path_and_stat_from_stat(self, path, stat_result):
2160
2232
mode = stat_result.st_mode
2161
2233
return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
2163
if not supports_executable():
2164
def is_executable(self, file_id, path=None):
2165
return self._inventory[file_id].executable
2167
_is_executable_from_path_and_stat = \
2168
_is_executable_from_path_and_stat_from_basis
2170
def is_executable(self, file_id, path=None):
2235
def is_executable(self, file_id, path=None):
2236
if not self._supports_executable():
2237
inv, inv_file_id = self._unpack_file_id(file_id)
2238
return inv[inv_file_id].executable
2172
2241
path = self.id2path(file_id)
2173
2242
mode = os.lstat(self.abspath(path)).st_mode
2174
2243
return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
2176
_is_executable_from_path_and_stat = \
2177
_is_executable_from_path_and_stat_from_stat
2245
def _is_executable_from_path_and_stat(self, path, stat_result):
2246
if not self._supports_executable():
2247
return self._is_executable_from_path_and_stat_from_basis(path, stat_result)
2249
return self._is_executable_from_path_and_stat_from_stat(path, stat_result)
2179
2251
@needs_tree_write_lock
2180
2252
def _add(self, files, ids, kinds):
2989
3090
supports_versioned_directories = None
2992
def find_format_string(klass, controldir):
2993
"""Return format name for the working tree object in controldir."""
2995
transport = controldir.get_workingtree_transport(None)
2996
return transport.get_bytes("format")
2997
except errors.NoSuchFile:
2998
raise errors.NoWorkingTree(base=transport.base)
3001
def find_format(klass, controldir):
3002
"""Return the format for the working tree object in controldir."""
3004
format_string = klass.find_format_string(controldir)
3005
return format_registry.get(format_string)
3007
raise errors.UnknownFormatError(format=format_string,
3008
kind="working tree")
3010
3092
def initialize(self, controldir, revision_id=None, from_branch=None,
3011
3093
accelerator_tree=None, hardlink=False):
3012
3094
"""Initialize a new working tree in controldir.
3062
3133
"""True if this format supports stored views."""
3066
@symbol_versioning.deprecated_method(
3067
symbol_versioning.deprecated_in((2, 4, 0)))
3068
def register_format(klass, format):
3069
format_registry.register(format)
3072
@symbol_versioning.deprecated_method(
3073
symbol_versioning.deprecated_in((2, 4, 0)))
3074
def register_extra_format(klass, format):
3075
format_registry.register_extra(format)
3078
@symbol_versioning.deprecated_method(
3079
symbol_versioning.deprecated_in((2, 4, 0)))
3080
def unregister_extra_format(klass, format):
3081
format_registry.unregister_extra(format)
3084
@symbol_versioning.deprecated_method(
3085
symbol_versioning.deprecated_in((2, 4, 0)))
3086
def get_formats(klass):
3087
return format_registry._get_all()
3090
@symbol_versioning.deprecated_method(
3091
symbol_versioning.deprecated_in((2, 4, 0)))
3092
def set_default_format(klass, format):
3093
format_registry.set_default(format)
3096
@symbol_versioning.deprecated_method(
3097
symbol_versioning.deprecated_in((2, 4, 0)))
3098
def unregister_format(klass, format):
3099
format_registry.remove(format)
3101
def get_controldir_for_branch(self):
3102
"""Get the control directory format for creating branches.
3104
This is to support testing of working tree formats that can not exist
3105
in the same control directory as a branch.
3107
return self._matchingbzrdir
3136
def get_controldir_for_branch(self):
3137
"""Get the control directory format for creating branches.
3139
This is to support testing of working tree formats that can not exist
3140
in the same control directory as a branch.
3142
return self._matchingbzrdir
3145
class WorkingTreeFormatMetaDir(bzrdir.BzrFormat, WorkingTreeFormat):
3146
"""Base class for working trees that live in bzr meta directories."""
3149
WorkingTreeFormat.__init__(self)
3150
bzrdir.BzrFormat.__init__(self)
3153
def find_format_string(klass, controldir):
3154
"""Return format name for the working tree object in controldir."""
3156
transport = controldir.get_workingtree_transport(None)
3157
return transport.get_bytes("format")
3158
except errors.NoSuchFile:
3159
raise errors.NoWorkingTree(base=transport.base)
3162
def find_format(klass, controldir):
3163
"""Return the format for the working tree object in controldir."""
3164
format_string = klass.find_format_string(controldir)
3165
return klass._find_format(format_registry, 'working tree',
3168
def check_support_status(self, allow_unsupported, recommend_upgrade=True,
3170
WorkingTreeFormat.check_support_status(self,
3171
allow_unsupported=allow_unsupported, recommend_upgrade=recommend_upgrade,
3173
bzrdir.BzrFormat.check_support_status(self, allow_unsupported=allow_unsupported,
3174
recommend_upgrade=recommend_upgrade, basedir=basedir)
3176
def get_controldir_for_branch(self):
3177
"""Get the control directory format for creating branches.
3179
This is to support testing of working tree formats that can not exist
3180
in the same control directory as a branch.
3182
return self._matchingbzrdir
3185
class WorkingTreeFormatMetaDir(bzrdir.BzrFormat, WorkingTreeFormat):
3186
"""Base class for working trees that live in bzr meta directories."""
3189
WorkingTreeFormat.__init__(self)
3190
bzrdir.BzrFormat.__init__(self)
3193
def find_format_string(klass, controldir):
3194
"""Return format name for the working tree object in controldir."""
3196
transport = controldir.get_workingtree_transport(None)
3197
return transport.get_bytes("format")
3198
except errors.NoSuchFile:
3199
raise errors.NoWorkingTree(base=transport.base)
3202
def find_format(klass, controldir):
3203
"""Return the format for the working tree object in controldir."""
3204
format_string = klass.find_format_string(controldir)
3205
return klass._find_format(format_registry, 'working tree',
3208
def check_support_status(self, allow_unsupported, recommend_upgrade=True,
3210
WorkingTreeFormat.check_support_status(self,
3211
allow_unsupported=allow_unsupported, recommend_upgrade=recommend_upgrade,
3213
bzrdir.BzrFormat.check_support_status(self, allow_unsupported=allow_unsupported,
3214
recommend_upgrade=recommend_upgrade, basedir=basedir)
3110
3217
format_registry.register_lazy("Bazaar Working Tree Format 4 (bzr 0.15)\n",