mirror of
https://gitlab.com/kupfer/kupferbootstrap.git
synced 2025-06-27 02:35:37 -04:00
packages: add downloading packages
This commit is contained in:
parent
d249504151
commit
07c8e178fb
1 changed files with 53 additions and 6 deletions
|
@ -7,12 +7,15 @@ import subprocess
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from joblib import Parallel, delayed
|
from joblib import Parallel, delayed
|
||||||
from glob import glob
|
from glob import glob
|
||||||
from shutil import rmtree
|
from urllib import HTTPError
|
||||||
|
from urllib.request import urlopen
|
||||||
|
from shutil import rmtree, copyfileobj
|
||||||
from typing import Iterable, Iterator, Any, Optional
|
from typing import Iterable, Iterator, Any, Optional
|
||||||
|
|
||||||
from constants import REPOSITORIES, CROSSDIRECT_PKGS, QEMU_BINFMT_PKGS, GCC_HOSTSPECS, ARCHES, Arch, CHROOT_PATHS, MAKEPKG_CMD
|
from constants import REPOSITORIES, CROSSDIRECT_PKGS, QEMU_BINFMT_PKGS, GCC_HOSTSPECS, ARCHES, Arch, CHROOT_PATHS, MAKEPKG_CMD
|
||||||
from config import config
|
from config import config
|
||||||
from chroot.build import get_build_chroot, BuildChroot
|
from chroot.build import get_build_chroot, BuildChroot
|
||||||
|
from distro.distro import Distro, PackageInfo, get_kupfer_https as _get_kupfer_https
|
||||||
from ssh import run_ssh_command, scp_put_files
|
from ssh import run_ssh_command, scp_put_files
|
||||||
from wrapper import enforce_wrap
|
from wrapper import enforce_wrap
|
||||||
from utils import git
|
from utils import git
|
||||||
|
@ -342,7 +345,51 @@ def add_package_to_repo(package: Pkgbuild, arch: Arch):
|
||||||
return files
|
return files
|
||||||
|
|
||||||
|
|
||||||
def check_package_version_built(package: Pkgbuild, arch: Arch) -> bool:
|
_kupfer_https = dict[Arch, Distro]()
|
||||||
|
|
||||||
|
|
||||||
|
def get_kupfer_https_distro(arch: Arch, scan: bool = True) -> Distro:
|
||||||
|
global _kupfer_https
|
||||||
|
if arch not in _kupfer_https or not _kupfer_https[arch]:
|
||||||
|
_kupfer_https[arch] = _get_kupfer_https(arch, scan=scan)
|
||||||
|
return _kupfer_https[arch]
|
||||||
|
|
||||||
|
|
||||||
|
def try_download_package(dest_file_path: str, package: Pkgbuild, arch: Arch) -> bool:
|
||||||
|
filename = os.path.basename(dest_file_path)
|
||||||
|
pkgname = package.name
|
||||||
|
repo_name = package.repo
|
||||||
|
repos = get_kupfer_https_distro(arch).repos
|
||||||
|
if repo_name not in repos:
|
||||||
|
logging.warning(f"Repository {repo_name} is not a known HTTPS repo")
|
||||||
|
return False
|
||||||
|
repo = repos[repo_name]
|
||||||
|
if pkgname not in repo.packages:
|
||||||
|
logging.debug(f"Package {pkgname} not found remote")
|
||||||
|
return False
|
||||||
|
repo_pkg: PackageInfo = repo.packages[pkgname]
|
||||||
|
if repo_pkg.version != package.version:
|
||||||
|
logging.debug(f"Package {pkgname} versions mismatch: local: {package.version}, remote: {repo_pkg.version}")
|
||||||
|
return False
|
||||||
|
if repo_pkg.filename != filename:
|
||||||
|
logging.debug(f"package filenames don't match: local: {filename}, remote: {repo_pkg.filename}")
|
||||||
|
return False
|
||||||
|
# url = f"{repo.resolve_url()}/{filename}"
|
||||||
|
url = repo_pkg.resolved_url()
|
||||||
|
try:
|
||||||
|
logging.debug(f"Trying to retrieve remote package {filename} from {url}")
|
||||||
|
with urlopen(url) as fsrc, open(dest_file_path, 'wb') as fdst:
|
||||||
|
copyfileobj(fsrc, fdst)
|
||||||
|
return True
|
||||||
|
except HTTPError as e:
|
||||||
|
if e.code == 404:
|
||||||
|
logging.debug(f"remote package {filename} nonexistant on server: {url}")
|
||||||
|
else:
|
||||||
|
logging.error(f"remote package {filename} failed to download ({e.code}): {url}: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def check_package_version_built(package: Pkgbuild, arch: Arch, try_download: bool = False) -> bool:
|
||||||
native_chroot = setup_build_chroot(config.runtime['arch'])
|
native_chroot = setup_build_chroot(config.runtime['arch'])
|
||||||
config_path = '/' + native_chroot.write_makepkg_conf(
|
config_path = '/' + native_chroot.write_makepkg_conf(
|
||||||
target_arch=arch,
|
target_arch=arch,
|
||||||
|
@ -376,10 +423,10 @@ def check_package_version_built(package: Pkgbuild, arch: Arch) -> bool:
|
||||||
if not filename_stripped.endswith('.pkg.tar'):
|
if not filename_stripped.endswith('.pkg.tar'):
|
||||||
logging.debug(f'skipping unknown file extension {basename}')
|
logging.debug(f'skipping unknown file extension {basename}')
|
||||||
continue
|
continue
|
||||||
if os.path.exists(file):
|
if os.path.exists(file) or (try_download and try_download_package(file, package.repo, arch)):
|
||||||
missing = False
|
missing = False
|
||||||
add_file_to_repo(file, repo_name=package.repo, arch=arch)
|
add_file_to_repo(file, repo_name=package.repo, arch=arch)
|
||||||
# copy arch=(any) packages to all arches
|
# copy arch=(any) packages to all arches
|
||||||
if filename_stripped.endswith('any.pkg.tar'):
|
if filename_stripped.endswith('any.pkg.tar'):
|
||||||
logging.info("any-arch pkg detected")
|
logging.info("any-arch pkg detected")
|
||||||
target_repo_file = os.path.join(config.get_package_dir(arch), package.repo, basename)
|
target_repo_file = os.path.join(config.get_package_dir(arch), package.repo, basename)
|
||||||
|
@ -408,7 +455,6 @@ def check_package_version_built(package: Pkgbuild, arch: Arch) -> bool:
|
||||||
logging.info(f"copying to {copy_target}")
|
logging.info(f"copying to {copy_target}")
|
||||||
shutil.copyfile(target_repo_file, copy_target)
|
shutil.copyfile(target_repo_file, copy_target)
|
||||||
add_file_to_repo(copy_target, package.repo, repo_arch)
|
add_file_to_repo(copy_target, package.repo, repo_arch)
|
||||||
|
|
||||||
return not missing
|
return not missing
|
||||||
|
|
||||||
|
|
||||||
|
@ -548,6 +594,7 @@ def get_unbuilt_package_levels(
|
||||||
arch: Arch,
|
arch: Arch,
|
||||||
force: bool = False,
|
force: bool = False,
|
||||||
rebuild_dependants: bool = False,
|
rebuild_dependants: bool = False,
|
||||||
|
try_download: bool = False,
|
||||||
) -> list[set[Pkgbuild]]:
|
) -> list[set[Pkgbuild]]:
|
||||||
dependants = set[Pkgbuild]()
|
dependants = set[Pkgbuild]()
|
||||||
if rebuild_dependants:
|
if rebuild_dependants:
|
||||||
|
@ -560,7 +607,7 @@ def get_unbuilt_package_levels(
|
||||||
level = set[Pkgbuild]()
|
level = set[Pkgbuild]()
|
||||||
for package in level_packages:
|
for package in level_packages:
|
||||||
if ((force and package in packages) or (rebuild_dependants and package in dependants) or
|
if ((force and package in packages) or (rebuild_dependants and package in dependants) or
|
||||||
not check_package_version_built(package, arch)):
|
not check_package_version_built(package, arch, try_download)):
|
||||||
level.add(package)
|
level.add(package)
|
||||||
build_names.update(package.names())
|
build_names.update(package.names())
|
||||||
if level:
|
if level:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue