211
215
def canonical_path(self, path):
212
216
"""Get the canonical tree-relative path"""
213
217
# don't follow final symlinks
214
dirname, basename = os.path.split(self._tree.abspath(path))
215
dirname = os.path.realpath(dirname)
216
return self._tree.relpath(pathjoin(dirname, basename))
218
abs = self._tree.abspath(path)
219
if abs in self._relpaths:
220
return self._relpaths[abs]
221
dirname, basename = os.path.split(abs)
222
if dirname not in self._realpaths:
223
self._realpaths[dirname] = os.path.realpath(dirname)
224
dirname = self._realpaths[dirname]
225
abs = pathjoin(dirname, basename)
226
if dirname in self._relpaths:
227
relpath = pathjoin(self._relpaths[dirname], basename)
228
relpath = relpath.rstrip('/\\')
230
relpath = self._tree.relpath(abs)
231
self._relpaths[abs] = relpath
218
234
def trans_id_tree_path(self, path):
219
235
"""Determine (and maybe set) the transaction ID for a tree path."""