Skip to content

Commit 1c2b23b

Browse files
committed
fs: use Path
1 parent 99800af commit 1c2b23b

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed

scmrepo/fs.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,124 @@
2020
from scmrepo.git.objects import GitTrie
2121

2222

23+
class Path:
24+
def __init__(self, sep, getcwd=None, realpath=None):
25+
def _getcwd():
26+
return ""
27+
28+
self.getcwd = getcwd or _getcwd
29+
self.realpath = realpath or self.abspath
30+
31+
assert sep == posixpath.sep
32+
self.flavour = posixpath
33+
34+
def chdir(self, path):
35+
def _getcwd():
36+
return path
37+
38+
self.getcwd = _getcwd
39+
40+
def join(self, *parts):
41+
return self.flavour.join(*parts)
42+
43+
def split(self, path):
44+
return self.flavour.split(path)
45+
46+
def normpath(self, path):
47+
return self.flavour.normpath(path)
48+
49+
def isabs(self, path):
50+
return self.flavour.isabs(path)
51+
52+
def abspath(self, path):
53+
if not self.isabs(path):
54+
path = self.join(self.getcwd(), path)
55+
return self.normpath(path)
56+
57+
def commonprefix(self, path):
58+
return self.flavour.commonprefix(path)
59+
60+
def parts(self, path):
61+
drive, path = self.flavour.splitdrive(path.rstrip(self.flavour.sep))
62+
63+
ret = []
64+
while True:
65+
path, part = self.flavour.split(path)
66+
67+
if part:
68+
ret.append(part)
69+
continue
70+
71+
if path:
72+
ret.append(path)
73+
74+
break
75+
76+
ret.reverse()
77+
78+
if drive:
79+
ret = [drive] + ret
80+
81+
return tuple(ret)
82+
83+
def parent(self, path):
84+
return self.flavour.dirname(path)
85+
86+
def dirname(self, path):
87+
return self.parent(path)
88+
89+
def parents(self, path):
90+
parts = self.parts(path)
91+
return tuple(
92+
self.join(*parts[:length])
93+
for length in range(len(parts) - 1, 0, -1)
94+
)
95+
96+
def name(self, path):
97+
return self.parts(path)[-1]
98+
99+
def suffix(self, path):
100+
name = self.name(path)
101+
_, dot, suffix = name.partition(".")
102+
return dot + suffix
103+
104+
def with_name(self, path, name):
105+
parts = list(self.parts(path))
106+
parts[-1] = name
107+
return self.join(*parts)
108+
109+
def with_suffix(self, path, suffix):
110+
parts = list(self.parts(path))
111+
real_path, _, _ = parts[-1].partition(".")
112+
parts[-1] = real_path + suffix
113+
return self.join(*parts)
114+
115+
def isin(self, left, right):
116+
left_parts = self.parts(left)
117+
right_parts = self.parts(right)
118+
left_len = len(left_parts)
119+
right_len = len(right_parts)
120+
return left_len > right_len and left_parts[:right_len] == right_parts
121+
122+
def isin_or_eq(self, left, right):
123+
return left == right or self.isin(left, right)
124+
125+
def overlaps(self, left, right):
126+
# pylint: disable=arguments-out-of-order
127+
return self.isin_or_eq(left, right) or self.isin(right, left)
128+
129+
def relpath(self, path, start=None):
130+
if start is None:
131+
start = self.getcwd()
132+
return self.flavour.relpath(path, start=start)
133+
134+
def relparts(self, path, base):
135+
return self.parts(self.relpath(path, base))
136+
137+
def as_posix(self, path):
138+
return path.replace(self.flavour.sep, posixpath.sep)
139+
140+
23141
def bytesio_len(obj: "BytesIO") -> Optional[int]:
24142
try:
25143
offset = obj.tell()
@@ -58,7 +176,13 @@ def __init__(
58176
self.trie = trie
59177
self.rev = self.trie.rev
60178

179+
def _getcwd():
180+
return self.root_marker
181+
182+
self.path = Path(self.sep, getcwd=_getcwd)
183+
61184
def _get_key(self, path: str) -> Tuple[str, ...]:
185+
path = self.path.abspath(path)
62186
if path == self.root_marker:
63187
return ()
64188
relparts = path.split(self.sep)

0 commit comments

Comments
 (0)