mirror of
https://chromium.googlesource.com/chromium/tools/depot_tools.git
synced 2026-01-11 02:31:29 +00:00
I'm looking at caffeinating more long-running depot_tools commands on Mac, which use a variety of `subprocess` APIs; one implementation strategy I'm considering is to wrap more of them, including `subprocess.run`, but the most obvious name to wrap `subprocess.run` into is already taken! I think it makes the most sense to name the `caffeinate` function(s) after the `subprocess` call it wraps. The callers to other parts of `subprocess` use more of the features exposed by those APIs. For consistency, I am plumbing through more of `subprocess.call`'s identifiable behaviors here, too: * command-to-invoke parameter is named "args" * as explicitly checked in cpython's subprocess.py's `_posix_spawn`:77cb39e0c7/Lib/subprocess.py (L1816)also allow `str`, `bytes`, and `os.PathLike` for the type of `args`, converting the non-list-like types into a single-element list * use kwargs packing and unpacking to forward other parameters into `subprocess.call` kwargs packing does not provide perfect emulation as implemented:77cb39e0c7/Lib/subprocess.py (L386)`timeout` could be provided as a positional parameter. However, Python documents all subprocess.call parameters as keyword only: https://docs.python.org/3.12/library/subprocess.html#older-high-level-api ...specifically because they don't want to bother distinguishing between parameters "local" to a higher-level `subprocess` helper and those that get forwarded (via `**kwargs`) to the underlying `Popen`, so I think it is reasonable to follow their lead on that. Bug: 462507017 Change-Id: Ia520ced7f8188c23c38826d22ccf20a3c52ddfc5 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/7181621 Reviewed-by: Junji Watanabe <jwata@google.com> Commit-Queue: Adam Norberg <norberg@google.com>
29 lines
866 B
Python
29 lines
866 B
Python
# Copyright 2025 The Chromium Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
_NO_CAFFEINATE_FLAG = '--no-caffeinate'
|
|
|
|
_HELP_MESSAGE = f"""\
|
|
caffeinate:
|
|
{_NO_CAFFEINATE_FLAG} do not prepend `caffeinate` to ninja command
|
|
"""
|
|
|
|
|
|
def call(args, **call_kwargs):
|
|
"""Runs a command (via subprocess.call) with `caffeinate` if it's on macOS."""
|
|
if sys.platform == 'darwin':
|
|
if isinstance(args, (str, bytes, os.PathLike)):
|
|
args = [args]
|
|
if '-h' in args or '--help' in args:
|
|
print(_HELP_MESSAGE, file=sys.stderr)
|
|
if _NO_CAFFEINATE_FLAG in args:
|
|
args.remove(_NO_CAFFEINATE_FLAG)
|
|
else:
|
|
args = ['caffeinate'] + args
|
|
return subprocess.call(args, **call_kwargs)
|