Skip to content

Commit

Permalink
refactor: use craft-platforms utilities (#5205)
Browse files Browse the repository at this point in the history
Closes #4993.
CRAFT-3278.
  • Loading branch information
bepri authored Jan 17, 2025
1 parent 685a8d6 commit 3aacad7
Show file tree
Hide file tree
Showing 20 changed files with 88 additions and 395 deletions.
5 changes: 3 additions & 2 deletions snapcraft/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
from craft_application.commands import get_other_command_group
from craft_cli import emit
from craft_parts.plugins.plugins import PluginType
from craft_platforms import DebianArchitecture
from overrides import override

import snapcraft
Expand All @@ -39,7 +40,7 @@
from snapcraft.extensions import apply_extensions
from snapcraft.models.project import SnapcraftBuildPlanner, apply_root_packages
from snapcraft.parts import set_global_environment
from snapcraft.utils import get_effective_base, get_host_architecture
from snapcraft.utils import get_effective_base
from snapcraft_legacy.cli import legacy

from .legacy_cli import _LIB_NAMES, _ORIGINAL_LIB_NAME_LOG_LEVEL
Expand Down Expand Up @@ -245,7 +246,7 @@ def _extra_yaml_transform(
self, yaml_data: dict[str, Any], *, build_on: str, build_for: str | None
) -> dict[str, Any]:
arch = build_on
target_arch = build_for if build_for else get_host_architecture()
target_arch = build_for if build_for else str(DebianArchitecture.from_host())
new_yaml_data = apply_extensions(yaml_data, arch=arch, target_arch=target_arch)
self._parse_info = extract_parse_info(new_yaml_data)
return apply_root_packages(new_yaml_data)
Expand Down
4 changes: 2 additions & 2 deletions snapcraft/commands/extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import tabulate
from craft_application.commands import AppCommand
from craft_cli import emit
from craft_platforms import DebianArchitecture
from overrides import overrides
from pydantic import BaseModel

Expand All @@ -32,7 +33,6 @@
get_snap_project,
process_yaml,
)
from snapcraft.utils import get_host_architecture
from snapcraft_legacy.internal.project_loader import (
find_extension,
supported_extension_names,
Expand Down Expand Up @@ -122,7 +122,7 @@ def run(self, parsed_args):
yaml_data = process_yaml(snap_project.project_file)

# process yaml before unmarshalling the data
arch = get_host_architecture()
arch = str(DebianArchitecture.from_host())
yaml_data_for_arch = apply_yaml(yaml_data, arch, arch)

# `apply_yaml()` adds or replaces the architectures keyword with an Architecture
Expand Down
4 changes: 2 additions & 2 deletions snapcraft/commands/lint.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
from craft_application.commands import AppCommand
from craft_cli import emit
from craft_cli.errors import ArgumentParsingError
from craft_platforms import DebianArchitecture
from craft_providers.multipass import MultipassProvider
from craft_providers.util import snap_cmd
from overrides import overrides
Expand All @@ -37,7 +38,6 @@
from snapcraft.meta import snap_yaml
from snapcraft.parts.yaml_utils import apply_yaml, extract_parse_info, process_yaml
from snapcraft.utils import (
get_host_architecture,
get_managed_environment_home_path,
is_managed_mode,
)
Expand Down Expand Up @@ -280,7 +280,7 @@ def _load_project(self, snapcraft_yaml_file: Path) -> Optional[models.Project]:
) from error

# process yaml before unmarshalling the data
arch = get_host_architecture()
arch = str(DebianArchitecture.from_host())
yaml_data_for_arch = apply_yaml(yaml_data, arch, arch)
# discard parse-info - it is not needed
extract_parse_info(yaml_data_for_arch)
Expand Down
4 changes: 2 additions & 2 deletions snapcraft/commands/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from craft_application.commands import AppCommand
from craft_cli import emit
from craft_parts.plugins import get_registered_plugins
from craft_platforms import DebianArchitecture
from overrides import overrides

from snapcraft import const, errors, models
Expand All @@ -31,7 +32,6 @@
get_snap_project,
process_yaml,
)
from snapcraft.utils import get_host_architecture

if TYPE_CHECKING:
import argparse
Expand Down Expand Up @@ -73,7 +73,7 @@ def run(self, parsed_args):
yaml_data = process_yaml(snap_project.project_file)

# process yaml before unmarshalling the data
arch = get_host_architecture()
arch = str(DebianArchitecture.from_host())
yaml_data_for_arch = apply_yaml(yaml_data, arch, arch)
# discard parse-info as it is not part of Project which we use to
# determine the base
Expand Down
6 changes: 4 additions & 2 deletions snapcraft/meta/snap_yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@
from craft_application.models import BaseMetadata, SummaryStr, base, constraints
from craft_application.models.constraints import SingleEntryDict
from craft_cli import emit
from craft_platforms import DebianArchitecture

from snapcraft import errors, models
from snapcraft.elf.elf_utils import get_arch_triplet
from snapcraft.utils import (
convert_architecture_deb_to_platform,
get_ld_library_paths,
process_version,
)
Expand Down Expand Up @@ -443,7 +443,9 @@ def get_metadata_from_project(
elif effective_base == "core22":
arch_triplet = project.get_build_for_arch_triplet()
else:
arch_triplet = get_arch_triplet(convert_architecture_deb_to_platform(arch))
arch_triplet = get_arch_triplet(
DebianArchitecture.from_machine(arch).to_platform_arch()
)

environment = _populate_environment(
project.environment, prime_dir, arch_triplet, project.confinement
Expand Down
34 changes: 16 additions & 18 deletions snapcraft/models/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
)
from craft_cli import emit
from craft_grammar.models import Grammar # type: ignore[import-untyped]
from craft_platforms import Platforms, snap
from craft_platforms import DebianArchitecture, Platforms, snap
from craft_providers import bases
from pydantic import ConfigDict, PrivateAttr, StringConstraints
from typing_extensions import Annotated, Self, override
Expand All @@ -44,13 +44,7 @@
from snapcraft.elf.elf_utils import get_arch_triplet
from snapcraft.errors import ProjectValidationError
from snapcraft.providers import SNAPCRAFT_BASE_TO_PROVIDER_BASE
from snapcraft.utils import (
convert_architecture_deb_to_platform,
get_effective_base,
get_host_architecture,
get_supported_architectures,
is_architecture_supported,
)
from snapcraft.utils import get_effective_base

ProjectName = Annotated[str, StringConstraints(max_length=40)]

Expand Down Expand Up @@ -115,9 +109,9 @@ def validate_architectures(architectures):
if len(architectures):
for element in architectures:
for arch in element.build_for + element.build_on:
if arch != "all" and not is_architecture_supported(arch):
if arch != "all" and arch not in utils.get_supported_architectures():
supported_archs = utils.humanize_list(
get_supported_architectures(), "and"
utils.get_supported_architectures(), "and"
)
raise ValueError(
f"Architecture {arch!r} is not supported. Supported "
Expand Down Expand Up @@ -1127,10 +1121,11 @@ def _validate_platforms_and_architectures(self) -> Self:
elif not self.architectures:
self._architectures_in_yaml = False
# set default value
host_arch = str(DebianArchitecture.from_host())
self.architectures = [
Architecture(
build_on=[get_host_architecture()],
build_for=[get_host_architecture()],
build_on=[host_arch],
build_for=[host_arch],
)
]

Expand Down Expand Up @@ -1170,7 +1165,7 @@ def _validate_epoch(cls, epoch):

@pydantic.field_validator("architectures")
@classmethod
def _validate_architecture_data(cls, architectures):
def _validate_architecture_data(cls, architectures, info: pydantic.ValidationInfo):
"""Validate architecture data."""
return validate_architectures(architectures)

Expand Down Expand Up @@ -1277,7 +1272,9 @@ def get_build_for_arch_triplet(self) -> str | None:
arch = self.get_build_for()

if arch != "all":
return get_arch_triplet(convert_architecture_deb_to_platform(arch))
return get_arch_triplet(
DebianArchitecture.from_machine(arch).to_platform_arch()
)

return None

Expand Down Expand Up @@ -1337,7 +1334,7 @@ class ArchitectureProject(models.CraftBaseModel, extra="ignore"):
"""Project definition containing only architecture data."""

architectures: list[str | Architecture] = pydantic.Field(
default=[get_host_architecture()],
default=[str(DebianArchitecture.from_host())],
validate_default=True,
)

Expand Down Expand Up @@ -1569,10 +1566,11 @@ def get_build_plan(self) -> list[BuildInfo]:

# set default value
if self.platforms is None:
host_arch = str(DebianArchitecture.from_host())
self.platforms = {
get_host_architecture(): Platform(
build_on=[SnapArch(get_host_architecture()).value],
build_for=[SnapArch(get_host_architecture()).value],
host_arch: Platform(
build_on=[SnapArch(host_arch).value],
build_for=[SnapArch(host_arch).value],
)
}
# For backwards compatibility with core22, convert the platforms.
Expand Down
9 changes: 5 additions & 4 deletions snapcraft/parts/lifecycle.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,15 @@
import craft_parts
from craft_cli import emit
from craft_parts import Features, ProjectInfo, Step, StepInfo, callbacks
from craft_platforms import DebianArchitecture
from craft_providers import Executor

from snapcraft import errors, linters, models, pack, providers, ua_manager, utils
from snapcraft.elf import Patcher, SonameCache, elf_utils
from snapcraft.elf import errors as elf_errors
from snapcraft.linters import LinterStatus
from snapcraft.meta import component_yaml, manifest, snap_yaml
from snapcraft.utils import get_host_architecture, process_version
from snapcraft.utils import process_version

from . import yaml_utils
from .parts import PartsLifecycle, launch_shell
Expand All @@ -54,7 +55,7 @@ def run(command_name: str, parsed_args: "argparse.Namespace") -> None:
:raises SnapcraftError: if the step name is invalid, or the project
yaml file cannot be loaded.
:raises LegacyFallback: if the project's base is not core22.
:raises LegacyFallback: if the project's base is core20 or below.
"""
emit.debug(f"command: {command_name}, arguments: {parsed_args}")

Expand Down Expand Up @@ -742,7 +743,7 @@ def _expand_environment(
}

if target_arch == "all":
target_arch = get_host_architecture()
target_arch = str(DebianArchitecture.from_host())

dirs = craft_parts.ProjectDirs(work_dir=work_dir, partitions=partitions)
info = craft_parts.ProjectInfo(
Expand Down Expand Up @@ -778,7 +779,7 @@ def get_build_plan(
"""
archs = models.ArchitectureProject.unmarshal(yaml_data).architectures

host_arch = get_host_architecture()
host_arch = str(DebianArchitecture.from_host())
build_plan: List[Tuple[str, str]] = []

# `isinstance()` calls are for mypy type checking and should not change logic
Expand Down
4 changes: 2 additions & 2 deletions snapcraft/parts/parts.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@
from craft_cli import emit
from craft_parts import Action, ActionType, Step
from craft_parts.packages import Repository
from craft_platforms import DebianArchitecture
from xdg import BaseDirectory # type: ignore

from snapcraft import errors
from snapcraft.meta import ExtractedMetadata
from snapcraft.parts.extract_metadata import extract_lifecycle_metadata
from snapcraft.services.lifecycle import get_prime_dirs_from_project
from snapcraft.utils import get_host_architecture

_LIFECYCLE_STEPS = {
"pull": Step.PULL,
Expand Down Expand Up @@ -92,7 +92,7 @@ def __init__( # noqa PLR0913
cache_dir = BaseDirectory.save_cache_path("snapcraft")

if target_arch == "all":
target_arch = get_host_architecture()
target_arch = str(DebianArchitecture.from_host())

try:
self._lcm = craft_parts.LifecycleManager(
Expand Down
3 changes: 2 additions & 1 deletion snapcraft/services/lifecycle.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from craft_application.models import BuildInfo
from craft_parts import ProjectInfo, StepInfo, callbacks
from craft_parts.packages import Repository as Repo
from craft_platforms import DebianArchitecture
from overrides import overrides

from snapcraft import __version__, errors, models, os_release, parts, utils
Expand Down Expand Up @@ -158,7 +159,7 @@ def generate_manifest(self) -> models.Manifest:

osrel = os_release.OsRelease()
version = utils.process_version(project.version)
host_arch = utils.get_host_architecture()
host_arch = str(DebianArchitecture.from_host())
build_for = self._build_plan[0].build_for if self._build_plan else host_arch

return models.Manifest(
Expand Down
8 changes: 6 additions & 2 deletions snapcraft/store/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,12 @@
from typing import Any, Dict, List, Optional, Sequence, Tuple, cast

import craft_store
import distro
import pydantic
import requests
from craft_application.util.error_formatting import format_pydantic_errors
from craft_cli import emit
from craft_platforms import DebianArchitecture
from overrides import overrides

from snapcraft import __version__, errors, models, utils
Expand All @@ -48,10 +50,12 @@

def build_user_agent(
version=__version__,
os_platform: utils.OSPlatform = utils.get_os_platform(), # noqa: B008
):
"""Build Snapcraft's user agent."""
return f"snapcraft/{version} {os_platform!s}"
dist_id = distro.id()
dist_version = distro.version()
dist_arch = DebianArchitecture.from_host().to_platform_arch()
return f"snapcraft/{version} {dist_id}/{dist_version} ({dist_arch})"


def use_candid() -> bool:
Expand Down
Loading

0 comments on commit 3aacad7

Please sign in to comment.