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