1
|
import os
|
2
|
|
3
|
|
4
|
class FileAnchor:
|
5
|
def __init__(self, root_dir, tail, searching=False):
|
6
|
self.__root_dir = root_dir
|
7
|
self.__tail = tail
|
8
|
if searching:
|
9
|
self.shortest_relative_path = self.__srp_with_tree_search
|
10
|
else:
|
11
|
self.shortest_relative_path = self.__srp
|
12
|
|
13
|
def __srp_with_tree_search(self, src=None):
|
14
|
"""
|
15
|
Shortest relative path handling the situation where src is not a descendant of root_dir.
|
16
|
Searches the subtree of src until it finds root_dir.
|
17
|
:param src: source node or cwd
|
18
|
:return: path from source to the anchored file
|
19
|
"""
|
20
|
raise NotImplementedError("Not implemented yet.")
|
21
|
|
22
|
def __srp(self, src=None):
|
23
|
"""
|
24
|
Shortest relative path from src to the anchored file. If src is not a descendant of root_dir, returns None.
|
25
|
:param src: source node or cwd
|
26
|
:return: path from source to the anchored file or None
|
27
|
"""
|
28
|
if src is None:
|
29
|
src = os.getcwd()
|
30
|
|
31
|
ret = ""
|
32
|
h = src
|
33
|
while len(h) > 0 and h != "/":
|
34
|
h, t = os.path.split(h)
|
35
|
if t != self.__root_dir:
|
36
|
ret = os.path.join(ret, "..")
|
37
|
else:
|
38
|
return os.path.join(ret, self.__tail)
|
39
|
|
40
|
return None
|
41
|
|
42
|
def __str__(self):
|
43
|
return self.shortest_relative_path(None)
|