blob: a6f5cc0d04729a784637dfe4b9059ce0e708250c [file] [log] [blame]
# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import annotations
from typing import TYPE_CHECKING, Final, Iterable, Optional, TypeVar
from crossbench import plt
if TYPE_CHECKING:
from crossbench.path import AnyPath
PathT = TypeVar("PathT", bound=AnyPath)
def sort_by_file_size(files: Iterable[PathT],
platform: Optional[plt.Platform] = None) -> list[PathT]:
real_platform = platform or plt.PLATFORM
return sorted(files, key=lambda f: (real_platform.file_size(f), f.name))
SIZE_UNITS: Final[tuple[str, ...]] = ("B", "KiB", "MiB", "GiB", "TiB")
def get_file_size(file: AnyPath,
digits: int = 2,
platform: Optional[plt.Platform] = None) -> str:
real_platform = platform or plt.PLATFORM
size: float = float(real_platform.file_size(file))
unit_index = 0
divisor = 1024.0
while (unit_index < len(SIZE_UNITS)) and size >= divisor:
unit_index += 1
size /= divisor
return f"{size:.{digits}f} {SIZE_UNITS[unit_index]}"