]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Make join_mirror() more robust and use it everywhere 1998/head
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 19 Oct 2023 18:06:06 +0000 (20:06 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 20 Oct 2023 09:02:17 +0000 (11:02 +0200)
mkosi/distributions/__init__.py
mkosi/distributions/alma.py
mkosi/distributions/centos.py
mkosi/distributions/fedora.py
mkosi/distributions/gentoo.py
mkosi/distributions/mageia.py
mkosi/distributions/openmandriva.py
mkosi/distributions/rhel.py
mkosi/distributions/rhel_ubi.py
mkosi/distributions/rocky.py

index 858e093b76d66f6fc5fb1670c38f30e60ae4e711..3141ed4451f9932266bd86e6b9246ad1cf45f897 100644 (file)
@@ -3,6 +3,7 @@
 import enum
 import importlib
 import re
+import urllib.parse
 from collections.abc import Sequence
 from typing import TYPE_CHECKING, Optional, cast
 
@@ -177,3 +178,12 @@ def detect_distribution() -> tuple[Optional[Distribution], Optional[str]]:
         version_id = version_codename or extracted_codename
 
     return d, version_id
+
+
+def join_mirror(mirror: str, link: str) -> str:
+    # urljoin() behaves weirdly if the base does not end with a / or the path starts with a / so fix them up as needed.
+    if not mirror.endswith("/"):
+        mirror = f"{mirror}/"
+    link = link.removeprefix("/")
+
+    return urllib.parse.urljoin(mirror, link)
index ff90c23bf3f081edb3bb5b156dd693ca56bcaeb5..8d67da6f19a4ad1a028d6c7ce45fc26b6e0496f1 100644 (file)
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
-from mkosi.distributions import centos
+from mkosi.distributions import centos, join_mirror
 from mkosi.installer.dnf import Repo, find_rpm_gpgkey
 from mkosi.state import MkosiState
 
@@ -23,7 +23,7 @@ class Installer(centos.Installer):
     @classmethod
     def repository_variants(cls, state: MkosiState, repo: str) -> list[Repo]:
         if state.config.mirror:
-            url = f"baseurl={state.config.mirror}/almalinux/$releasever/{repo}/$basearch/os"
+            url = f"baseurl={join_mirror(state.config.mirror, f'almalinux/$releasever/{repo}/$basearch/os')}"
         else:
             url = f"mirrorlist=https://mirrors.almalinux.org/mirrorlist/$releasever/{repo.lower()}"
 
index 320d4c04797129545124f0b17a8816c0feed31f5..a04ebcdc9f15a446df9afefbb46f0e10226af4a6 100644 (file)
@@ -2,12 +2,16 @@
 
 import os
 import shutil
-import urllib.parse
 from collections.abc import Iterable, Sequence
 from pathlib import Path
 
 from mkosi.architecture import Architecture
-from mkosi.distributions import Distribution, DistributionInstaller, PackageType
+from mkosi.distributions import (
+    Distribution,
+    DistributionInstaller,
+    PackageType,
+    join_mirror,
+)
 from mkosi.installer.dnf import Repo, find_rpm_gpgkey, invoke_dnf, setup_dnf
 from mkosi.log import complete_step, die
 from mkosi.state import MkosiState
@@ -28,9 +32,6 @@ def move_rpm_db(root: Path) -> None:
             newdb.symlink_to(os.path.relpath(olddb, start=newdb.parent))
 
 
-def join_mirror(mirror: str, link: str) -> str:
-    return urllib.parse.urljoin(mirror, link)
-
 
 class Installer(DistributionInstaller):
     @classmethod
index 04198e48bd4bf13f40277d06d66ce0476ce466f5..3837c6e8feb1f403c90afcb74ad216d73f1c2486 100644 (file)
@@ -1,10 +1,14 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
-import urllib.parse
 from collections.abc import Sequence
 
 from mkosi.architecture import Architecture
-from mkosi.distributions import Distribution, DistributionInstaller, PackageType
+from mkosi.distributions import (
+    Distribution,
+    DistributionInstaller,
+    PackageType,
+    join_mirror,
+)
 from mkosi.installer.dnf import Repo, find_rpm_gpgkey, invoke_dnf, setup_dnf
 from mkosi.log import die
 from mkosi.state import MkosiState
@@ -93,7 +97,7 @@ class Installer(DistributionInstaller):
         elif state.config.release == "eln":
             mirror = state.config.mirror or "https://odcs.fedoraproject.org/composes/production/latest-Fedora-ELN/compose"
             for repo in ("Appstream", "BaseOS", "Extras", "CRB"):
-                url = f"baseurl={urllib.parse.urljoin(mirror, repo)}"
+                url = f"baseurl={join_mirror(mirror, repo)}"
                 repos += [
                     Repo(repo.lower(), f"{url}/$basearch/os", gpgurls),
                     Repo(repo.lower(), f"{url}/$basearch/debug/tree", gpgurls, enabled=False),
@@ -101,7 +105,7 @@ class Installer(DistributionInstaller):
                 ]
         elif state.config.mirror:
             directory = "development" if state.config.release == "rawhide" else "releases"
-            url = f"baseurl={urllib.parse.urljoin(state.config.mirror, f'{directory}/$releasever/Everything')}"
+            url = f"baseurl={join_mirror(state.config.mirror, f'{directory}/$releasever/Everything')}"
             repos += [
                 Repo("fedora", f"{url}/$basearch/os", gpgurls),
                 Repo("fedora-debuginfo", f"{url}/$basearch/debug/tree", gpgurls, enabled=False),
@@ -109,14 +113,14 @@ class Installer(DistributionInstaller):
             ]
 
             if state.config.release != "rawhide":
-                url = f"baseurl={urllib.parse.urljoin(state.config.mirror, 'updates/$releasever/Everything')}"
+                url = f"baseurl={join_mirror(state.config.mirror, 'updates/$releasever/Everything')}"
                 repos += [
                     Repo("updates", f"{url}/$basearch", gpgurls),
                     Repo("updates-debuginfo", f"{url}/$basearch/debug", gpgurls, enabled=False),
                     Repo("updates-source", f"{url}/SRPMS", gpgurls, enabled=False),
                 ]
 
-                url = f"baseurl={urllib.parse.urljoin(state.config.mirror, 'updates/testing/$releasever/Everything')}"
+                url = f"baseurl={join_mirror(state.config.mirror, 'updates/testing/$releasever/Everything')}"
                 repos += [
                     Repo("updates-testing", f"{url}/$basearch", gpgurls, enabled=False),
                     Repo("updates-testing-debuginfo", f"{url}/$basearch/debug", gpgurls, enabled=False),
index 78b0ca4f2724f9cba56e80f11369a35925c6a512..5ed0fe1de7058480ece2731d6792092c4e7cc0de 100644 (file)
@@ -9,7 +9,12 @@ from pathlib import Path
 
 from mkosi.architecture import Architecture
 from mkosi.archive import extract_tar
-from mkosi.distributions import Distribution, DistributionInstaller, PackageType
+from mkosi.distributions import (
+    Distribution,
+    DistributionInstaller,
+    PackageType,
+    join_mirror,
+)
 from mkosi.log import ARG_DEBUG, complete_step, die
 from mkosi.run import apivfs_cmd, bwrap, chroot_cmd, run
 from mkosi.state import MkosiState
@@ -88,7 +93,7 @@ class Installer(DistributionInstaller):
 
         mirror = state.config.mirror or "https://distfiles.gentoo.org"
         # http://distfiles.gentoo.org/releases/amd64/autobuilds/latest-stage3.txt
-        stage3tsf_path_url = urllib.parse.urljoin(
+        stage3tsf_path_url = join_mirror(
             mirror.partition(" ")[0],
             f"releases/{arch}/autobuilds/latest-stage3.txt",
         )
@@ -104,7 +109,7 @@ class Installer(DistributionInstaller):
             else:
                 die("profile names changed upstream?")
 
-        stage3_url = urllib.parse.urljoin(mirror, f"releases/{arch}/autobuilds/{stage3_latest}")
+        stage3_url = join_mirror(mirror, f"releases/{arch}/autobuilds/{stage3_latest}")
         stage3_tar = state.cache_dir / "stage3.tar"
         stage3 = state.cache_dir / "stage3"
 
index 4f4efdcd7672e559f5ebb05ef13ae68bf39718b5..3bcfa24c6d90b41d7dfb97d67ce577ae68a7c150 100644 (file)
@@ -1,11 +1,15 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
 import shutil
-import urllib.parse
 from collections.abc import Sequence
 
 from mkosi.architecture import Architecture
-from mkosi.distributions import Distribution, DistributionInstaller, PackageType
+from mkosi.distributions import (
+    Distribution,
+    DistributionInstaller,
+    PackageType,
+    join_mirror,
+)
 from mkosi.installer.dnf import Repo, find_rpm_gpgkey, invoke_dnf, setup_dnf
 from mkosi.log import die
 from mkosi.state import MkosiState
@@ -47,7 +51,7 @@ class Installer(DistributionInstaller):
         if state.config.local_mirror:
             repos += [Repo("core-release", f"baseurl={state.config.local_mirror}", gpgurls)]
         elif state.config.mirror:
-            url = f"baseurl={urllib.parse.urljoin(state.config.mirror, 'distrib/$releasever/$basearch/media/core/')}"
+            url = f"baseurl={join_mirror(state.config.mirror, 'distrib/$releasever/$basearch/media/core/')}"
             repos += [
                 Repo("core-release", f"{url}/release", gpgurls),
                 Repo("core-updates", f"{url}/updates/", gpgurls)
index 88b243ff309f57869c4370301422fff6e2139a2b..6c6fee120c6cb716763f124a043e870292de7119 100644 (file)
@@ -1,11 +1,15 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
 import shutil
-import urllib.parse
 from collections.abc import Sequence
 
 from mkosi.architecture import Architecture
-from mkosi.distributions import Distribution, DistributionInstaller, PackageType
+from mkosi.distributions import (
+    Distribution,
+    DistributionInstaller,
+    PackageType,
+    join_mirror,
+)
 from mkosi.installer.dnf import Repo, find_rpm_gpgkey, invoke_dnf, setup_dnf
 from mkosi.log import die
 from mkosi.state import MkosiState
@@ -49,7 +53,7 @@ class Installer(DistributionInstaller):
         if state.config.local_mirror:
             repos += [Repo("main-release", f"baseurl={state.config.local_mirror}", gpgurls)]
         else:
-            url = f"baseurl={urllib.parse.urljoin(mirror, '$releasever/repository/$basearch/main')}"
+            url = f"baseurl={join_mirror(mirror, '$releasever/repository/$basearch/main')}"
             repos += [
                 Repo("main-release", f"{url}/release", gpgurls),
                 Repo("main-updates", f"{url}/updates", gpgurls),
index 36665048fc53153665a0e377826c1b0cdef448ff..5557c08d79e9df64bbc394b2c0759580dddd0a47 100644 (file)
@@ -4,7 +4,7 @@ from collections.abc import Iterable
 from pathlib import Path
 from typing import Any, Optional
 
-from mkosi.distributions import centos
+from mkosi.distributions import centos, join_mirror
 from mkosi.installer.dnf import Repo, find_rpm_gpgkey
 from mkosi.log import die
 from mkosi.state import MkosiState
@@ -90,19 +90,19 @@ class Installer(centos.Installer):
             major = int(float(v))
             yield Repo(
                 f"rhel-{v}-{repo}-rpms",
-                f"baseurl={centos.join_mirror(mirror, f'rhel{major}/{v}/$basearch/{repo}/os')}",
+                f"baseurl={join_mirror(mirror, f'rhel{major}/{v}/$basearch/{repo}/os')}",
                 enabled=True,
                 **common,
             )
             yield Repo(
                 f"rhel-{v}-{repo}-debug-rpms",
-                f"baseurl={centos.join_mirror(mirror, f'rhel{major}/{v}/$basearch/{repo}/debug')}",
+                f"baseurl={join_mirror(mirror, f'rhel{major}/{v}/$basearch/{repo}/debug')}",
                 enabled=False,
                 **common,
             )
             yield Repo(
                 f"rhel-{v}-{repo}-source",
-                f"baseurl={centos.join_mirror(mirror, f'rhel{major}/{v}/$basearch/{repo}/source')}",
+                f"baseurl={join_mirror(mirror, f'rhel{major}/{v}/$basearch/{repo}/source')}",
                 enabled=False,
                 **common,
             )
index bd2218ff9e12b6e2178edaa6334f808c29cef746..d24776e8ce86ef65ba10c868d9a3345919cb0b4c 100644 (file)
@@ -2,7 +2,7 @@
 
 from collections.abc import Iterable
 
-from mkosi.distributions import centos
+from mkosi.distributions import centos, join_mirror
 from mkosi.installer.dnf import Repo, find_rpm_gpgkey
 from mkosi.state import MkosiState
 
@@ -34,18 +34,18 @@ class Installer(centos.Installer):
             v = state.config.release
             yield Repo(
                 f"ubi-{v}-{repo}-rpms",
-                f"baseurl={centos.join_mirror(mirror, f'ubi{v}/{v}/$basearch/{repo}/os')}",
+                f"baseurl={join_mirror(mirror, f'ubi{v}/{v}/$basearch/{repo}/os')}",
                 cls.gpgurls(state),
             )
             yield Repo(
                 f"ubi-{v}-{repo}-debug-rpms",
-                f"baseurl={centos.join_mirror(mirror, f'ubi{v}/{v}/$basearch/{repo}/debug')}",
+                f"baseurl={join_mirror(mirror, f'ubi{v}/{v}/$basearch/{repo}/debug')}",
                 cls.gpgurls(state),
                 enabled=False,
             )
             yield Repo(
                 f"ubi-{v}-{repo}-source",
-                f"baseurl={centos.join_mirror(mirror, f'ubi{v}/{v}/$basearch/{repo}/source')}",
+                f"baseurl={join_mirror(mirror, f'ubi{v}/{v}/$basearch/{repo}/source')}",
                 cls.gpgurls(state),
                 enabled=False,
             )
index e09bf03df9ac7fb9ee593d82317995f865c57765..98c7c7b7c35d6d0a7afd68d4c074015422fb35a6 100644 (file)
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
-from mkosi.distributions import centos
+from mkosi.distributions import centos, join_mirror
 from mkosi.installer.dnf import Repo, find_rpm_gpgkey
 from mkosi.state import MkosiState
 
@@ -23,7 +23,7 @@ class Installer(centos.Installer):
     @classmethod
     def repository_variants(cls, state: MkosiState, repo: str) -> list[Repo]:
         if state.config.mirror:
-            url = f"baseurl={state.config.mirror}/rocky/$releasever/{repo}/$basearch/os"
+            url = f"baseurl={join_mirror(state.config.mirror, f'rocky/$releasever/{repo}/$basearch/os')}"
         else:
             url = f"mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo={repo}-$releasever"