blob: 81abbb401d2dc80462282336b29048af5c3ffd5a [file] [log] [blame] [edit]
# Copyright 2022 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Provides utility for formatting GN files."""
import functools
import os
from typing import Optional, Union
from chromite.format import formatters
from chromite.lib import cipd
from chromite.lib import cros_build_lib
@functools.lru_cache(maxsize=None)
def _find_gn() -> str:
"""Find the `gn` tool."""
path = cipd.InstallPackage(
cipd.GetCIPDFromCache(),
"gn/gn/linux-amd64",
"git_revision:41fef642de70ecdcaaa26be96d56a0398f95abd4",
)
return os.path.join(path, "gn")
def Data(
data: str,
# pylint: disable=unused-argument
path: Optional[Union[str, os.PathLike]] = None,
) -> str:
"""Format GN |data|.
Args:
data: The file content to lint.
path: The file name for diagnostics/configs/etc...
Returns:
Formatted data.
"""
try:
result = cros_build_lib.run(
[_find_gn(), "format", "--stdin"],
capture_output=True,
input=data,
encoding="utf-8",
)
return result.stdout
except cros_build_lib.RunCommandError as e:
# `gn` exits with 1 for every failure, so assume syntax error.
if e.returncode == 1:
raise formatters.ParseError(path) from e
raise