@classmethod
def remove(cls, context: Context, packages: Sequence[str]) -> None:
- cls.invoke(context, "--remove", ["--nosave", "--recursive", *packages], apivfs=True)
+ installed = {
+ cls.parse_pkg_desc(i)[0] for i in (context.root / "var/lib/pacman/local").glob("*/desc")
+ }
+ remove = [p for p in packages if p in installed]
+ if remove:
+ cls.invoke(context, "--remove", ["--nosave", "--recursive", *remove], apivfs=True)
@classmethod
def keyring(cls, context: Context) -> None:
# pacman can't sync a single repository, so we go behind its back and do it ourselves.
shutil.move(context.repository / "mkosi.db.tar", context.metadata_dir / "lib/pacman/sync/mkosi.db")
+
+ @classmethod
+ def parse_pkg_desc(cls, path: Path) -> tuple[str, str, str, str]:
+ name = version = base = arch = ""
+
+ with path.open() as desc:
+ for line in desc:
+ line = line.strip()
+ if line == "%NAME%":
+ name = next(desc).strip()
+ elif line == "%VERSION%":
+ version = next(desc).strip()
+ elif line == "%BASE%":
+ base = next(desc).strip()
+ elif line == "%ARCH%":
+ arch = next(desc).strip()
+ break
+
+ return name, version, base, arch
import json
import subprocess
import textwrap
-from pathlib import Path
from typing import IO, Any, Optional
from mkosi.config import ManifestFormat
from mkosi.context import Context
from mkosi.distributions import PackageType
from mkosi.installer.apt import Apt
+from mkosi.installer.pacman import Pacman
from mkosi.log import complete_step
from mkosi.run import run
return t
-def parse_pkg_desc(f: Path) -> tuple[str, str, str, str]:
- name = version = base = arch = ""
- with f.open() as desc:
- for line in desc:
- line = line.strip()
- if line == "%NAME%":
- name = next(desc).strip()
- elif line == "%VERSION%":
- version = next(desc).strip()
- elif line == "%BASE%":
- base = next(desc).strip()
- elif line == "%ARCH%":
- arch = next(desc).strip()
- break
- return name, version, base, arch
-
-
@dataclasses.dataclass
class Manifest:
context: Context
packages = sorted((self.context.root / "var/lib/pacman/local").glob("*/desc"))
for desc in packages:
- name, version, source, arch = parse_pkg_desc(desc)
+ name, version, source, arch = Pacman.parse_pkg_desc(desc)
package = PackageManifest("pkg", name, version, arch, 0)
self.packages.append(package)