blob: 15a8c6ff33c104b913f68d25c9539eca328d3f54 [file] [log] [blame]
# Copyright 2023 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Text proto message formatter."""
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_txtpbfmt() -> str:
"""Find or install the `txtpbfmt` tool."""
path = cipd.InstallPackage(
cipd.GetCIPDFromCache(),
"infra/3pp/tools/txtpbfmt/linux-amd64",
"ZFbTNfGMUzHt-xzwXMftKeDb0pL6ODNW4x3EYfTiw3oC",
)
return os.path.join(path, "txtpbfmt")
def Data(
data: str,
# pylint: disable=unused-argument
path: Optional[Union[str, os.PathLike]] = None,
) -> str:
"""Format text proto message |data|.
Args:
data: The file content to format.
path: The file name for diagnostics/configs/etc...
Returns:
Formatted data.
"""
# txtpbfmt doesn't fully trim whitespace currently.
data = formatters.whitespace.Data(data, path)
try:
result = cros_build_lib.run(
[
_find_txtpbfmt(),
"-logtostderr",
],
capture_output=True,
input=data,
encoding="utf-8",
)
return result.stdout
except cros_build_lib.RunCommandError as e:
raise formatters.ParseError(path) from e