123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- from __future__ import annotations
- import argparse
- import json
- import os.path
- import sys
- from collections.abc import Sequence
- def should_use_color(setting: str) -> bool:
- # normally I would use `sys.stdout.isatty()` however direnv always pipes this
- return setting == "always" or (setting == "auto" and not os.environ.get("CI"))
- def color(s: str, color: str, *, use_color: bool) -> str:
- if use_color:
- return f"{color}{s}\033[m"
- else:
- return s
- def main(argv: Sequence[str] | None = None) -> int:
- parser = argparse.ArgumentParser()
- parser.add_argument(
- "--settings-file",
- default=os.path.expanduser("~/Library/Group Containers/group.com.docker/settings.json"),
- help=argparse.SUPPRESS,
- )
- parser.add_argument(
- "--memory-minimum",
- default=8092,
- type=int,
- help="the minimum amount of allocated memory to warn for. default: %(default)s (MiB)",
- )
- parser.add_argument(
- "--color",
- choices=("always", "never", "auto"),
- default="auto",
- help="whether to use color. default: %(default)s (auto is determined by CI environment variable)",
- )
- args = parser.parse_args(argv)
- use_color = should_use_color(args.color)
- try:
- with open(args.settings_file) as f:
- contents = json.load(f)
- except (json.JSONDecodeError, OSError):
- return 0 # file didn't exist or was not json
- try:
- configured = contents["memoryMiB"]
- except KeyError:
- return 0 # configuration did not look like what we expected
- if not isinstance(configured, int):
- return 0 # configuration did not look like what we expected
- if configured < args.memory_minimum:
- msg = f"""\
- WARNING: docker is configured with less than the recommended minimum memory!
- - open Docker.app and adjust the memory in Settings -> Resources
- - current memory (MiB): {configured}
- - recommended minimum (MiB): {args.memory_minimum}
- """
- print(color(msg, "\033[33m", use_color=use_color), end="", file=sys.stderr)
- return 0
- if __name__ == "__main__":
- raise SystemExit(main())
|