Skip to content

Commit

Permalink
fix: replace colons with hyphens in charm names
Browse files Browse the repository at this point in the history
Multi-base charms may have colons in their platform name. These get
converted to hyphens because some environments don't allow colons in
filenames.

Signed-off-by: Callahan Kovacs <callahan.kovacs@canonical.com>
  • Loading branch information
mr-cal committed Dec 20, 2024
1 parent 6d0d9ce commit 1e6defe
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 11 deletions.
12 changes: 8 additions & 4 deletions charmcraft/services/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,19 +122,23 @@ def pack_charm(
def get_charm_path(self, dest_dir: pathlib.Path) -> pathlib.Path:
"""Get a charm file name for the appropriate set of run-on bases."""
if self._platform:
return dest_dir / f"{self._project.name}_{self._platform}.charm"
platform = self._platform.replace(":", "-")
return dest_dir / f"{self._project.name}_{platform}.charm"
build_plan = models.CharmcraftBuildPlanner.model_validate(
self._project.marshal()
).get_build_plan()
platform = utils.get_os_platform()
build_on_base = bases.BaseName(name=platform.system, version=platform.release)
host_platform = utils.get_os_platform()
build_on_base = bases.BaseName(
name=host_platform.system, version=host_platform.release
)
host_arch = util.get_host_architecture()
for build_info in build_plan:
print(build_info)
if build_info.build_on != host_arch:
continue
if build_info.base == build_on_base:
return dest_dir / f"{self._project.name}_{build_info.platform}.charm"
platform = build_info.platform.replace(":", "-")
return dest_dir / f"{self._project.name}_{platform}.charm"

raise errors.CraftError(
"Current machine is not a valid build platform for this charm.",
Expand Down
4 changes: 2 additions & 2 deletions tests/spread/smoketests/multi-base/basic/expected-charms.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
test-charm_ubuntu@20.04:amd64.charm
test-charm_ubuntu@22.04:amd64.charm
test-charm_ubuntu@20.04-amd64.charm
test-charm_ubuntu@22.04-amd64.charm
test-charm_noble-amd64.charm
Original file line number Diff line number Diff line change
@@ -1 +1 @@
test-charm_ubuntu@22.04:amd64.charm
test-charm_ubuntu@22.04-amd64.charm
31 changes: 27 additions & 4 deletions tests/unit/services/test_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,16 +86,39 @@ def test_get_metadata(package_service, simple_charm: BasesCharm, metadata):


@pytest.mark.parametrize(
("bases", "expected_name"),
("build_plan", "expected_name"),
[
(
[SIMPLE_BUILD_BASE],
pytest.param(
[
BuildInfo(
platform="distro-1-test64",
build_on="riscv64",
build_for="riscv64",
base=BaseName("ubuntu", "24.04"),
)
],
"charmy-mccharmface_distro-1-test64.charm",
id="simple",
),
pytest.param(
[
BuildInfo(
platform="ubuntu@24.04:riscv64",
build_on="riscv64",
build_for="riscv64",
base=BaseName("ubuntu", "24.04"),
)
],
"charmy-mccharmface_ubuntu@24.04-riscv64.charm",
id="multi-base",
),
],
)
def test_get_charm_path(fake_path, package_service, bases, expected_name):
def test_get_charm_path(fake_path, package_service, build_plan, expected_name):
fake_prime_dir = fake_path / "prime"
package_service._build_plan = build_plan
package_service._platform = build_plan[0].platform

charm_path = package_service.get_charm_path(fake_prime_dir)

assert charm_path == fake_prime_dir / expected_name
Expand Down

0 comments on commit 1e6defe

Please sign in to comment.