import os
import posixpath
import re
def normsep(path):
if os.sep != "/":
path = path.replace(os.sep, "/")
if os.altsep and os.altsep != "/":
path = path.replace(os.altsep, "/")
return path
def relpath(path, start):
rel = normsep(os.path.relpath(path, start))
return "" if rel == "." else rel
def realpath(path):
return normsep(os.path.realpath(path))
def abspath(path):
return normsep(os.path.abspath(path))
def join(*paths):
return normsep(os.path.join(*paths))
def normpath(path):
return posixpath.normpath(normsep(path))
def dirname(path):
return posixpath.dirname(normsep(path))
def commonprefix(paths):
return posixpath.commonprefix([normsep(path) for path in paths])
def basename(path):
return os.path.basename(path)
def splitext(path):
return posixpath.splitext(normsep(path))
def split(path):
return normsep(path).split("/")
def basedir(path, bases):
path = normsep(path)
bases = [normsep(b) for b in bases]
if path in bases:
return path
for b in sorted(bases, reverse=True):
if not b or path.startswith(b + "/"):
return b
re_cache = {}
MATCH_STAR_STAR_RE = re.compile(r"(^|/)\\\*\\\*/")
MATCH_STAR_STAR_END_RE = re.compile(r"(^|/)\\\*\\\*$")
def match(path, pattern):
if not pattern:
return True
if pattern not in re_cache:
p = re.escape(pattern)
p = MATCH_STAR_STAR_RE.sub(r"\1(?:.+/)?", p)
p = MATCH_STAR_STAR_END_RE.sub(r"(?:\1.+)?", p)
p = p.replace(r"\*", "[^/]*") + "(?:/.*)?$"
re_cache[pattern] = re.compile(p)
return re_cache[pattern].match(path) is not None
def rebase(oldbase, base, relativepath):
if base == oldbase:
return relativepath
if len(base) < len(oldbase):
assert basedir(oldbase, [base]) == base
relbase = relpath(oldbase, base)
result = join(relbase, relativepath)
else:
assert basedir(base, [oldbase]) == oldbase
relbase = relpath(base, oldbase)
result = relpath(relativepath, relbase)
result = normpath(result)
if relativepath.endswith("/") and not result.endswith("/"):
result += "/"
return result
def ancestors(path):
while path:
yield path
newpath = os.path.dirname(path)
if newpath == path:
break
path = newpath