Added watch slicing tests, rewritten slice function.
This commit is contained in:
@@ -50,37 +50,42 @@ class State:
|
||||
begin, end = 0, len(self._listing)
|
||||
level = 0
|
||||
isfile = 0
|
||||
while level < len(relpath.parts):
|
||||
# Enter a subdirectory
|
||||
|
||||
# Special case for root
|
||||
if not relpath.parts:
|
||||
return slice(begin, end)
|
||||
|
||||
begin += 1
|
||||
for part in relpath.parts:
|
||||
level += 1
|
||||
begin += 1
|
||||
if level == len(relpath.parts):
|
||||
isfile = relfile
|
||||
name = relpath.parts[level - 1]
|
||||
namesort = sortkey(name)
|
||||
r = self._listing[begin]
|
||||
assert r.level == level
|
||||
# Iterate over items at this level
|
||||
while (
|
||||
begin < end
|
||||
and r.name != name
|
||||
and r.isfile <= isfile
|
||||
and sortkey(r.name) < namesort
|
||||
):
|
||||
# Skip contents
|
||||
found = False
|
||||
|
||||
while begin < end:
|
||||
entry = self._listing[begin]
|
||||
|
||||
if entry.level < level:
|
||||
break
|
||||
|
||||
if entry.level == level:
|
||||
if entry.name == part:
|
||||
found = True
|
||||
if level == len(relpath.parts):
|
||||
isfile = relfile
|
||||
else:
|
||||
begin += 1
|
||||
break
|
||||
cmp = entry.isfile - isfile or sortkey(entry.name) > sortkey(part)
|
||||
if cmp > 0:
|
||||
break
|
||||
|
||||
begin += 1
|
||||
while begin < end and self._listing[begin].level > level:
|
||||
begin += 1
|
||||
# Not found?
|
||||
if begin == end or self._listing[begin].level < level:
|
||||
return slice(begin, begin)
|
||||
r = self._listing[begin]
|
||||
# Not found?
|
||||
if begin == end or r.name != name:
|
||||
|
||||
if not found:
|
||||
return slice(begin, begin)
|
||||
# Found an item, now find its end
|
||||
for end in range(begin + 1, len(self._listing)):
|
||||
if self._listing[end].level <= level:
|
||||
|
||||
# Found the starting point, now find the end of the slice
|
||||
for end in range(begin + 1, len(self._listing) + 1):
|
||||
if end == len(self._listing) or self._listing[end].level <= level:
|
||||
break
|
||||
return slice(begin, end)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user