import importlib.resources
import itertools
import json
+import math
import os
import platform
import re
return create_parser().parse_args(config_files + argv)
-def parse_bytes(num_bytes: Optional[str]) -> Optional[int]:
+def parse_bytes(num_bytes: Optional[str], *, sector_size: int = 512) -> Optional[int]:
+ """Convert a string for a number of bytes into a number rounding up to sector size."""
if num_bytes is None:
- return num_bytes
+ return None
if num_bytes.endswith("G"):
factor = 1024 ** 3
if factor > 1:
num_bytes = num_bytes[:-1]
- result = int(num_bytes) * factor
+ result = math.ceil(float(num_bytes) * factor)
if result <= 0:
raise ValueError("Size out of range")
- if result % 512 != 0:
- raise ValueError("Size not a multiple of 512")
+ rem = result % sector_size
+ if rem != 0:
+ result += sector_size - rem
return result
assert mkosi.strip_suffixes(Path("home.xz/test")) == Path("home.xz/test")
assert mkosi.strip_suffixes(Path("home.xz/test.txt")) == Path("home.xz/test.txt")
+
def test_copy_file(tmpdir: Path) -> None:
dir_path = Path(tmpdir)
file_1 = Path(dir_path) / "file_1.txt"
file_2.write_text("Testing copying content from file_1 to file_2, with previous data.")
mkosi.copy_file(file_1, file_2)
assert filecmp.cmp(file_1, file_2)
+
+
+def test_parse_bytes() -> None:
+ assert mkosi.parse_bytes(None) is None
+ assert mkosi.parse_bytes("1") == 512
+ assert mkosi.parse_bytes("1000") == 1024
+ assert mkosi.parse_bytes("1K") == 1024
+ assert mkosi.parse_bytes("1025") == 1536
+ assert mkosi.parse_bytes("1M") == 1024**2
+ assert mkosi.parse_bytes("1.9M") == 1992704
+ assert mkosi.parse_bytes("1G") == 1024**3
+ assert mkosi.parse_bytes("7.3G") == 7838315520
+
+ with pytest.raises(ValueError):
+ mkosi.parse_bytes("-1")
+ with pytest.raises(ValueError):
+ mkosi.parse_bytes("-2K")
+ with pytest.raises(ValueError):
+ mkosi.parse_bytes("-3M")
+ with pytest.raises(ValueError):
+ mkosi.parse_bytes("-4G")