mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-27 12:15:33 +00:00
2481563b4f
Automatic update from web-platform-tests Get all of manifest/lint/gitignore typed (#16639) This also stops running mypy in Py3 mode as with more functions annotated and mypy running on more of our code it reveals this code to be the broken mess it actually is (mostly due to bytes/Text). -- wp5At-commits: e98eee5aec6ba154f2f086e9d2f0a287617e8519 wpt-pr: 16639
107 lines
3.0 KiB
Python
107 lines
3.0 KiB
Python
import os
|
|
import platform
|
|
import subprocess
|
|
|
|
from six import BytesIO
|
|
|
|
MYPY = False
|
|
if MYPY:
|
|
# MYPY is set to True when run under Mypy.
|
|
from typing import Text
|
|
from typing import Callable
|
|
from typing import AnyStr
|
|
from typing import Any
|
|
from typing import BinaryIO
|
|
from typing import Generic
|
|
from typing import TypeVar
|
|
from typing import Optional
|
|
T = TypeVar("T")
|
|
else:
|
|
# eww, eww, ewwww
|
|
Generic = {}
|
|
T = object()
|
|
Generic[T] = object
|
|
|
|
def rel_path_to_url(rel_path, url_base="/"):
|
|
# type: (bytes, Text) -> Text
|
|
assert not os.path.isabs(rel_path), rel_path
|
|
if url_base[0] != "/":
|
|
url_base = "/" + url_base
|
|
if url_base[-1] != "/":
|
|
url_base += "/"
|
|
return url_base + rel_path.replace(os.sep, "/")
|
|
|
|
|
|
def from_os_path(path):
|
|
# type: (AnyStr) -> AnyStr
|
|
assert os.path.sep == "/" or platform.system() == "Windows"
|
|
if "/" == os.path.sep:
|
|
rv = path
|
|
else:
|
|
rv = path.replace(os.path.sep, "/")
|
|
if "\\" in rv:
|
|
raise ValueError("path contains \\ when separator is %s" % os.path.sep)
|
|
return rv
|
|
|
|
|
|
def to_os_path(path):
|
|
# type: (AnyStr) -> AnyStr
|
|
assert os.path.sep == "/" or platform.system() == "Windows"
|
|
if "\\" in path:
|
|
raise ValueError("normalised path contains \\")
|
|
if "/" == os.path.sep:
|
|
return path
|
|
return path.replace("/", os.path.sep)
|
|
|
|
|
|
def git(path):
|
|
# type: (bytes) -> Optional[Callable[..., bytes]]
|
|
def gitfunc(cmd, *args):
|
|
# type: (bytes, *bytes) -> bytes
|
|
full_cmd = ["git", cmd] + list(args)
|
|
try:
|
|
return subprocess.check_output(full_cmd, cwd=path, stderr=subprocess.STDOUT)
|
|
except Exception as e:
|
|
if platform.uname()[0] == "Windows" and isinstance(e, WindowsError):
|
|
full_cmd[0] = "git.bat"
|
|
return subprocess.check_output(full_cmd, cwd=path, stderr=subprocess.STDOUT)
|
|
else:
|
|
raise
|
|
|
|
try:
|
|
# this needs to be a command that fails if we aren't in a git repo
|
|
gitfunc("rev-parse", "--show-toplevel")
|
|
except (subprocess.CalledProcessError, OSError):
|
|
return None
|
|
else:
|
|
return gitfunc
|
|
|
|
|
|
class ContextManagerBytesIO(BytesIO): # type: ignore
|
|
def __enter__(self):
|
|
# type: () -> BinaryIO
|
|
return self # type: ignore
|
|
|
|
def __exit__(self, *args, **kwargs):
|
|
# type: (*Any, **Any) -> bool
|
|
self.close()
|
|
return True
|
|
|
|
|
|
class cached_property(Generic[T]):
|
|
def __init__(self, func):
|
|
# type: (Callable[[Any], T]) -> None
|
|
self.func = func
|
|
self.__doc__ = getattr(func, "__doc__")
|
|
self.name = func.__name__
|
|
|
|
def __get__(self, obj, cls=None):
|
|
# type: (Any, Optional[type]) -> T
|
|
if obj is None:
|
|
return self # type: ignore
|
|
|
|
# we can unconditionally assign as next time this won't be called
|
|
assert self.name not in obj.__dict__
|
|
rv = obj.__dict__[self.name] = self.func(obj)
|
|
return rv
|