commit python-kiwi for openSUSE:Factory
Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-kiwi for openSUSE:Factory checked in at 2024-07-22 17:14:15 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-kiwi (Old) and /work/SRC/openSUSE:Factory/.python-kiwi.new.17339 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-kiwi" Mon Jul 22 17:14:15 2024 rev:117 rq:1188893 version:10.0.25 Changes: -------- --- /work/SRC/openSUSE:Factory/python-kiwi/python-kiwi.changes 2024-07-05 19:49:23.970446357 +0200 +++ /work/SRC/openSUSE:Factory/.python-kiwi.new.17339/python-kiwi.changes 2024-07-22 17:14:32.444975758 +0200 @@ -1,0 +2,122 @@ +Sun Jul 14 11:17:33 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Bump version: 10.0.24 → 10.0.25 + +------------------------------------------------------------------- +Fri Jul 12 12:58:24 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Fix mocking of test_process_result_bundle_as_rpm + +------------------------------------------------------------------- +Fri Jul 12 12:43:23 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Fixed logging behavior of Compress::get_format + + The get_format() method allows to check which compression format + a given input stream has. This is done by calling the supported + compression tools in a row and let them check if they can deal + with the provided data or not. As a result error messages are + logged for streams that some tool doesn't understand. However, + those error messages are no errors and only the result of the + checking. This information in the kiwi log file is confusing + and several users already complained when they see information + like: + + EXEC: Failed with stderr: /usr/bin/xz: ...: File format not recognized + + This commit changes how the compression tooling is called in a + way that no exception is raised (which leads to the above error message) + but the result returncode is used to decide on the success or + error of the respective compression tooling. + +------------------------------------------------------------------- +Fri Jul 12 10:18:24 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Allow to set custom ISO Application ID + + Add new <type ... application_id="..."/> attribute to be set in + the ISO header main block. The application ID was used as identifier + in the legacy initrd code from former kiwi versions. Because of + this there is still the compat layer which sets an App ID as MBR + identifier string unless the new application_id overwrites it. + This Fixes #1810 + +------------------------------------------------------------------- +Fri Jul 12 09:43:09 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Bump version: 10.0.23 → 10.0.24 + +------------------------------------------------------------------- +Thu Jul 11 16:47:22 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Added integration test for SUSE agama installer + + This integration test builds a self-install ISO image which + drops the SUSE Agama installer into a ramdisk for performing + an interactive installation procedure to test Agama + +------------------------------------------------------------------- +Thu Jul 11 14:33:16 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Add --set-type-attr and --set-release-version + + Allow to set/overwrite type section attributes via the cmdline. + Allow to set/add the release-version element via the cmdline. + This Fixes #2478 and Fixes #2588 + +------------------------------------------------------------------- +Wed Jul 10 16:58:57 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Update integration test for eficsm + + Update the type of the Secure profile of the live image integration + test as well as the type of the simple-disk test to make use of the + eficsm="false" attribute to switch off CSM mode and test an EFI only + layout. + +------------------------------------------------------------------- +Wed Jul 10 16:32:30 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Add new eficsm type attribute + + Allow to produce EFI/UEFI images without hybrid CSM + capabilities. This Fixes #2407 + +------------------------------------------------------------------- +Wed Jul 10 11:26:45 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Wait for loop device detach to complete + + Detaching a loop device via 'losetup -d' is an async operation. + Once the command returns the loop can still be associated with + the block special. Therefore this commit waits until the block + device got released or a timeout is hit. This Fixes #2580 + +------------------------------------------------------------------- +Tue Jul 09 09:40:49 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Update requires for kiwi-systemdeps-disk-images + + On Tumbleweed several changes caused tools like strings + or the codepage for mtools to be missing in a standard + installation. For building disk images especially EFI + capable ones with vendor information kiwi needs the above + tool. This commit adds the packages providing them on + Tumbleweed to the meta systemdeps for disk images. + This Fixes #2585 + +------------------------------------------------------------------- +Mon Jul 08 09:17:49 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Supplements are not understood by Debian/Ubuntu + +------------------------------------------------------------------- +Thu Jul 04 16:16:44 CEST 2024 - Marcus Schäfer <marcus.schaefer@gmail.com> + +- Split out bash completion into a sub-package + + Per review of the SUSE packaging team we should split out + the bash completion into its own sub-package to give users + better control over the completion feature. + +------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-kiwi.spec ++++++ --- /var/tmp/diff_new_pack.3bOjdI/_old 2024-07-22 17:14:33.893033917 +0200 +++ /var/tmp/diff_new_pack.3bOjdI/_new 2024-07-22 17:14:33.897034078 +0200 @@ -52,7 +52,7 @@ %endif Name: python-kiwi -Version: 10.0.23 +Version: 10.0.25 Provides: kiwi-schema = 8.1 Release: 0 Url: https://github.com/OSInside/kiwi @@ -334,6 +334,10 @@ Requires: kiwi-systemdeps-filesystems = %{version}-%{release} Requires: kiwi-systemdeps-bootloaders = %{version}-%{release} Requires: kiwi-systemdeps-iso-media = %{version}-%{release} +%if 0%{?suse_version} >= 1650 +Requires: binutils +Requires: glibc-gconv-modules-extra +%endif %if 0%{?suse_version} Requires: gptfdisk %else @@ -412,7 +416,6 @@ Requires: file Requires: sed Requires: bash -Recommends: bash-completion Requires: python%{python3_pkgversion} >= 3.9 %if 0%{?ubuntu} || 0%{?debian} Requires: python%{python3_pkgversion}-yaml @@ -655,6 +658,19 @@ %description -n kiwi-man-pages Provides manual pages to describe the kiwi commands +%package -n kiwi-bash-completion +Summary: Bash Completion for kiwi-ng +Requires: bash-completion +Requires: python%{python3_pkgversion}-kiwi = %{version} +%if ! (0%{?debian} || 0%{?ubuntu}) +Supplements: (%{name} and bash-completion) +%endif +BuildArch: noarch + +%description -n kiwi-bash-completion +Bash command line completion support for python-kiwi - completion +of subcommands, parameters and keywords for the kiwi-ng command. + %prep %setup -q -n kiwi-%{version} @@ -764,11 +780,13 @@ %{_bindir}/kiwi-ng %{_bindir}/kiwi-ng-3* %{python3_sitelib}/kiwi* -%{_usr}/share/bash-completion/completions/kiwi-ng %{_usr}/share/kiwi/xsl_to_v74/ %{_defaultdocdir}/python-kiwi/LICENSE %{_defaultdocdir}/python-kiwi/README +%files -n kiwi-bash-completion +%{_usr}/share/bash-completion/completions/kiwi-ng + %files -n kiwi-man-pages %config %_sysconfdir/kiwi.yml %doc %{_mandir}/man8/* ++++++ PKGBUILD ++++++ --- /var/tmp/diff_new_pack.3bOjdI/_old 2024-07-22 17:14:33.925035203 +0200 +++ /var/tmp/diff_new_pack.3bOjdI/_new 2024-07-22 17:14:33.929035363 +0200 @@ -3,7 +3,7 @@ pkgname=('python-kiwi' 'kiwi-man-pages' 'dracut-kiwi-lib' 'dracut-kiwi-oem-repart' 'dracut-kiwi-oem-dump' 'dracut-kiwi-live' 'dracut-kiwi-overlay') arch=(x86_64) -pkgver=10.0.23 +pkgver=10.0.25 pkgrel=0 pkgdesc="KIWI - Appliance Builder Next Generation" url="https://github.com/SUSE/kiwi/tarball/master" @@ -12,7 +12,7 @@ provides=(kiwi-ng kiwi) source=("${pkgname}.tar.gz") changelog="${pkgname}.changes" -md5sums=('dbea32cd584296db7d9b0a2bf8fa3654') +md5sums=('34e5270b2aaf925e0cc8a9e1816e169c') build() { ++++++ python-kiwi.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/.bumpversion.cfg new/kiwi-10.0.25/.bumpversion.cfg --- old/kiwi-10.0.23/.bumpversion.cfg 2024-07-04 12:57:58.582599600 +0200 +++ new/kiwi-10.0.25/.bumpversion.cfg 2024-07-14 11:17:33.562450600 +0200 @@ -1,5 +1,5 @@ [bumpversion] -current_version = 10.0.23 +current_version = 10.0.25 commit = True tag = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/PKG-INFO new/kiwi-10.0.25/PKG-INFO --- old/kiwi-10.0.23/PKG-INFO 1970-01-01 01:00:00.000000000 +0100 +++ new/kiwi-10.0.25/PKG-INFO 1970-01-01 01:00:00.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: kiwi -Version: 10.0.23 +Version: 10.0.25 Summary: KIWI - Appliance Builder Home-page: https://osinside.github.io/kiwi/ License: GPL-3.0-or-later diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/doc/source/commands/system_build.rst new/kiwi-10.0.25/doc/source/commands/system_build.rst --- old/kiwi-10.0.23/doc/source/commands/system_build.rst 2024-05-02 09:12:27.044463600 +0200 +++ new/kiwi-10.0.25/doc/source/commands/system_build.rst 2024-07-11 21:06:57.573307500 +0200 @@ -28,6 +28,8 @@ [--set-container-derived-from=<uri>] [--set-container-tag=<name>] [--add-container-label=<label>...] + [--set-type-attr=<attribute=value>...] + [--set-release-version=<version>] [--signing-key=<key-file>...] kiwi-ng system build help @@ -195,6 +197,16 @@ The setting is only effective if the container configuration provides the initial tag value. +--set-type-attr=<attribute=value> + + Overwrite/set the attribute with the provided value in the selected + build type section. Example: `--set-type-attr volid=some` + +--set-release-version=<version> + + Overwrite/set the release-version element in the selected + build type preferences section + --signing-key=<key-file> Set the key file to be trusted and imported into the package diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/doc/source/commands/system_prepare.rst new/kiwi-10.0.25/doc/source/commands/system_prepare.rst --- old/kiwi-10.0.23/doc/source/commands/system_prepare.rst 2024-05-02 09:12:27.044463600 +0200 +++ new/kiwi-10.0.25/doc/source/commands/system_prepare.rst 2024-07-11 21:06:57.573307500 +0200 @@ -26,6 +26,8 @@ [--set-container-derived-from=<uri>] [--set-container-tag=<name>] [--add-container-label=<label>...] + [--set-type-attr=<attribute=value>...] + [--set-release-version=<version>] [--signing-key=<key-file>...] kiwi-ng system prepare help @@ -196,6 +198,16 @@ The setting applies only if the container configuration provides an initial tag value. +--set-type-attr=<attribute=value> + + Overwrite/set the attribute with the provided value in the selected + build type section. Example: `--set-type-attr volid=some` + +--set-release-version=<version> + + Overwrite/set the release-version element in the selected + build type preferences section + --signing-key=<key-file> Set the key file to be trusted and imported into the package diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/doc/source/conf.py new/kiwi-10.0.25/doc/source/conf.py --- old/kiwi-10.0.23/doc/source/conf.py 2024-07-04 12:57:58.582599600 +0200 +++ new/kiwi-10.0.25/doc/source/conf.py 2024-07-14 11:17:33.562450600 +0200 @@ -139,7 +139,7 @@ # built documents. # # The short X.Y version. -version = '10.0.23' +version = '10.0.25' # The full version, including alpha/beta/rc tags. release = version diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/doc/source/image_description/elements.rst new/kiwi-10.0.25/doc/source/image_description/elements.rst --- old/kiwi-10.0.23/doc/source/image_description/elements.rst 2024-06-03 09:21:45.397441600 +0200 +++ new/kiwi-10.0.25/doc/source/image_description/elements.rst 2024-07-13 13:48:12.457693300 +0200 @@ -384,6 +384,11 @@ specifies the size in MB. If not set the boot partition size is set to 200 MB +eficsm="true|false": + For images with an EFI layout, specify if the legacy + CSM (BIOS) mode should be supported or not. By default + CSM mode is enabled. + efipartsize="nonNegativeInteger": For images with an EFI fat partition this attribute specifies the size in MB. If not set the EFI partition @@ -483,14 +488,32 @@ filesystem="btrfs|ext2|ext3|ext4|squashfs|xfs": The root filesystem -firmware="efi|uefi": - Specifies the boot firmware of the appliance, supported - options are: `bios`, `ec2`, `efi`, `uefi`, `ofw` and `opal`. - This attribute is used to differentiate the image according to the - firmware which boots up the system. It mostly impacts the disk - layout and the partition table type. By default `bios` is used on x86, +firmware="efi|uefi|bios|ec2|ofw|opal": + Specifies the boot firmware of the appliance. This attribute is + used to differentiate the image according to the firmware which + boots up the system. It mostly impacts the disk layout and the + partition table type. By default `bios` is used on x86, `ofw` on PowerPC and `efi` on ARM. + * `efi` + Standard EFI layout + + * `uefi` + Standard EFI layout for secure boot + + * `bios` + Standard BIOS layout for x86 + + * `ec2` + Standard BIOS layout for x86 using Xen grub modules for old + style Xen boot in Amazon EC2 + + * `ofw` + Standard PPC layout + + * `opal` + Standard openPOWER PPC64 layout. kexec based boot process + force_mbr="true|false": Boolean parameter to force the usage of a MBR partition table even if the system would default to GPT. This is occasionally @@ -920,6 +943,11 @@ For the ISO type only, specifies the volume ID (volume name or label) to be written into the master block. There is space for 32 characters. +application_id="string": + For the ISO/(oem install ISO) type only, specifies the Application + ID to be written into the master block. There is space for + 128 characters. + vhdfixedtag="GUID_string": For the VHD disk format, specifies the GUID diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/bootloader/install/grub2.py new/kiwi-10.0.25/kiwi/bootloader/install/grub2.py --- old/kiwi-10.0.23/kiwi/bootloader/install/grub2.py 2024-06-18 08:42:06.351156000 +0200 +++ new/kiwi-10.0.25/kiwi/bootloader/install/grub2.py 2024-07-13 13:48:12.457693300 +0200 @@ -131,6 +131,13 @@ 'No grub boot code installation on %s', self.arch ) return False + elif self.firmware.efi_mode() and not self.firmware.legacy_bios_mode(): + # In EFI mode without CSM, no install + # of grub2 boot code makes sense + log.info( + 'No grub boot code installation in EFI only mode' + ) + return False return True def install(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/builder/install.py new/kiwi-10.0.25/kiwi/builder/install.py --- old/kiwi-10.0.23/kiwi/builder/install.py 2024-05-02 09:12:27.060463700 +0200 +++ new/kiwi-10.0.25/kiwi/builder/install.py 2024-07-13 13:48:12.457693300 +0200 @@ -159,8 +159,10 @@ 'meta_data': { 'volume_id': self.iso_volume_id, 'mbr_id': self.mbrid.get_id(), + 'application_id': self.xml_state.build_type.get_application_id(), 'efi_mode': self.firmware.efi_mode(), - 'ofw_mode': self.firmware.ofw_mode() + 'ofw_mode': self.firmware.ofw_mode(), + 'legacy_bios_mode': self.firmware.legacy_bios_mode() } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/builder/live.py new/kiwi-10.0.25/kiwi/builder/live.py --- old/kiwi-10.0.23/kiwi/builder/live.py 2024-05-02 09:12:27.060463700 +0200 +++ new/kiwi-10.0.25/kiwi/builder/live.py 2024-07-13 13:48:12.457693300 +0200 @@ -140,7 +140,9 @@ 'preparer': Defaults.get_preparer(), 'volume_id': self.volume_id, 'mbr_id': self.mbrid.get_id(), - 'efi_mode': self.firmware.efi_mode() + 'application_id': self.xml_state.build_type.get_application_id(), + 'efi_mode': self.firmware.efi_mode(), + 'legacy_bios_mode': self.firmware.legacy_bios_mode() } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/defaults.py new/kiwi-10.0.25/kiwi/defaults.py --- old/kiwi-10.0.23/kiwi/defaults.py 2024-05-17 15:49:01.269136700 +0200 +++ new/kiwi-10.0.25/kiwi/defaults.py 2024-07-13 13:48:12.457693300 +0200 @@ -1261,7 +1261,7 @@ :rtype: dict """ return { - 'x86_64': ['efi', 'uefi', 'bios', 'ec2hvm', 'ec2'], + 'x86_64': ['efi', 'uefi', 'bios', 'ec2'], 'i586': ['bios'], 'i686': ['bios'], 'ix86': ['bios'], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/firmware.py new/kiwi-10.0.25/kiwi/firmware.py --- old/kiwi-10.0.23/kiwi/firmware.py 2024-04-18 14:53:58.594938500 +0200 +++ new/kiwi-10.0.25/kiwi/firmware.py 2024-07-13 13:48:12.461693300 +0200 @@ -42,6 +42,8 @@ self.firmware = xml_state.build_type.get_firmware() self.efipart_mbytes = xml_state.build_type.get_efipartsize() self.efi_partition_table = xml_state.build_type.get_efiparttable() + self.efi_csm = True if xml_state.build_type.get_eficsm() is None \ + else xml_state.build_type.get_eficsm() if not self.firmware: self.firmware = Defaults.get_default_firmware(self.arch) @@ -75,7 +77,7 @@ else: return 'msdos' - def legacy_bios_mode(self): + def legacy_bios_mode(self) -> bool: """ Check if the legacy boot from BIOS systems should be activated @@ -84,14 +86,16 @@ :rtype: bool """ if self.get_partition_table_type() == 'gpt': - if self.arch == 'x86_64' or re.match('i.86', self.arch): + if (self.arch == 'x86_64' or re.match('i.86', self.arch)) and \ + (self.firmware == 'efi' or self.firmware == 'uefi') and \ + self.efi_csm: return True else: return False else: return False - def efi_mode(self): + def efi_mode(self) -> str: """ Check if EFI mode is requested @@ -101,6 +105,7 @@ """ if self.firmware in Defaults.get_efi_capable_firmware_names(): return self.firmware + return '' def ec2_mode(self): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/iso_tools/base.py new/kiwi-10.0.25/kiwi/iso_tools/base.py --- old/kiwi-10.0.23/kiwi/iso_tools/base.py 2024-05-02 09:12:27.064463600 +0200 +++ new/kiwi-10.0.25/kiwi/iso_tools/base.py 2024-07-13 13:48:12.461693300 +0200 @@ -19,7 +19,7 @@ import shutil import logging from typing import ( - Dict, List + Dict, List, Union ) # project @@ -61,7 +61,7 @@ raise NotImplementedError def init_iso_creation_parameters( - self, custom_args: Dict[str, str] = None + self, custom_args: Dict[str, Union[str, bool]] = None ) -> None: """ Create a set of standard parameters for the main loader diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/iso_tools/xorriso.py new/kiwi-10.0.25/kiwi/iso_tools/xorriso.py --- old/kiwi-10.0.23/kiwi/iso_tools/xorriso.py 2024-06-20 11:18:36.731071700 +0200 +++ new/kiwi-10.0.25/kiwi/iso_tools/xorriso.py 2024-07-13 13:48:12.461693300 +0200 @@ -18,7 +18,7 @@ import os import logging from typing import ( - Dict, List, Optional + Dict, List, Optional, Union ) # project @@ -66,36 +66,41 @@ raise KiwiIsoToolError('xorriso tool not found') def init_iso_creation_parameters( - self, custom_args: Optional[Dict[str, str]] = None + self, custom_args: Optional[Dict[str, Union[str, bool]]] = None ) -> None: """ Create a set of standard parameters :param list custom_args: custom ISO meta data """ + legacy_bios_mode = True if custom_args: - if 'mbr_id' in custom_args: + application_id = \ + custom_args.get('application_id') or custom_args.get('mbr_id') + if application_id: self.iso_parameters += [ - '-application_id', custom_args['mbr_id'] + '-application_id', format(application_id) ] if 'publisher' in custom_args: self.iso_parameters += [ - '-publisher', custom_args['publisher'] + '-publisher', format(custom_args['publisher']) ] if 'preparer' in custom_args: self.iso_parameters += [ - '-preparer_id', custom_args['preparer'] + '-preparer_id', format(custom_args['preparer']) ] if 'volume_id' in custom_args: self.iso_parameters += [ - '-volid', custom_args['volume_id'] + '-volid', format(custom_args['volume_id']) ] + if 'legacy_bios_mode' in custom_args: + legacy_bios_mode = bool(custom_args['legacy_bios_mode']) catalog_file = self.boot_path + '/boot.catalog' self.iso_parameters += [ '-joliet', 'on', '-padding', '0' ] - if Defaults.is_x86_arch(self.arch): + if Defaults.is_x86_arch(self.arch) and legacy_bios_mode: mbr_file = os.sep.join( [ self.source_dir, self.boot_path, 'loader', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/schema/kiwi.rnc new/kiwi-10.0.25/kiwi/schema/kiwi.rnc --- old/kiwi-10.0.23/kiwi/schema/kiwi.rnc 2024-07-04 11:43:52.210901500 +0200 +++ new/kiwi-10.0.25/kiwi/schema/kiwi.rnc 2024-07-13 13:48:12.461693300 +0200 @@ -26,6 +26,7 @@ safe-posix-name = xsd:token {pattern = "[a-zA-Z0-9_\-\.]+"} safe-posix-short-name = xsd:token {pattern = "[a-zA-Z0-9_\-\.]{1,32}"} +safe-posix-long-name = xsd:token {pattern = "[a-zA-Z0-9_\-\.]{1,128}"} locale-name = xsd:token {pattern = "(POSIX|[a-z]{2,3}_[A-Z]{2})(,[a-z]{2,3}_[A-Z]{2})*"} mac-address-type = xsd:token {pattern = "([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}"} size-type = xsd:token {pattern = "(\d*|image)"} @@ -1583,6 +1584,15 @@ sch:param [ name = "attr" value = "efipartsize" ] sch:param [ name = "types" value = "oem" ] ] + k.type.eficsm.attribute = + ## For images with an EFI layout, specify if the legacy + ## CSM (BIOS) mode should be supported or not. By default + ## CSM mode is enabled + attribute eficsm { xsd:boolean } + >> sch:pattern [ id = "eficsm" is-a = "image_type" + sch:param [ name = "attr" value = "eficsm" ] + sch:param [ name = "types" value = "oem iso" ] + ] k.type.efifatimagesize.attribute = ## For ISO images (live and install) the EFI boot requires ## an embedded FAT image. This attribute specifies the size @@ -2139,6 +2149,15 @@ sch:param [ name = "attr" value = "volid" ] sch:param [ name = "types" value = "iso oem" ] ] + k.type.application_id.attribute = + ## for the iso/(oem install iso) type only: + ## Specifies the Application ID to be written + ## into the master block. There is space for 128 characters. + attribute application_id { safe-posix-long-name } + >> sch:pattern [ id = "application_id" is-a = "image_type" + sch:param [ name = "attr" value = "application_id" ] + sch:param [ name = "types" value = "iso oem" ] + ] k.type.wwid_wait_timeout.attribute = ## Specifies the wait period in seconds after launching ## the multipath daemon to wait until all presented devices @@ -2235,6 +2254,7 @@ k.type.bootpartsize.attribute? & k.type.efipartsize.attribute? & k.type.efifatimagesize.attribute? & + k.type.eficsm.attribute? & k.type.efiparttable.attribute? & k.type.dosparttable_extended_layout.attribute? & k.type.bootprofile.attribute? & @@ -2300,6 +2320,7 @@ k.type.vga.attribute? & k.type.vhdfixedtag.attribute? & k.type.volid.attribute? & + k.type.application_id.attribute? & k.type.wwid_wait_timeout.attribute? & k.type.derived_from.attribute? & k.type.delta_root.attribute? & diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/schema/kiwi.rng new/kiwi-10.0.25/kiwi/schema/kiwi.rng --- old/kiwi-10.0.23/kiwi/schema/kiwi.rng 2024-07-04 11:43:52.214901400 +0200 +++ new/kiwi-10.0.25/kiwi/schema/kiwi.rng 2024-07-13 13:48:12.461693300 +0200 @@ -31,6 +31,11 @@ <param name="pattern">[a-zA-Z0-9_\-\.]{1,32}</param> </data> </define> + <define name="safe-posix-long-name"> + <data type="token"> + <param name="pattern">[a-zA-Z0-9_\-\.]{1,128}</param> + </data> + </define> <define name="locale-name"> <data type="token"> <param name="pattern">(POSIX|[a-z]{2,3}_[A-Z]{2})(,[a-z]{2,3}_[A-Z]{2})*</param> @@ -2293,6 +2298,18 @@ <sch:param name="types" value="oem"/> </sch:pattern> </define> + <define name="k.type.eficsm.attribute"> + <attribute name="eficsm"> + <a:documentation>For images with an EFI layout, specify if the legacy +CSM (BIOS) mode should be supported or not. By default +CSM mode is enabled</a:documentation> + <data type="boolean"/> + </attribute> + <sch:pattern id="eficsm" is-a="image_type"> + <sch:param name="attr" value="eficsm"/> + <sch:param name="types" value="oem iso"/> + </sch:pattern> + </define> <define name="k.type.efifatimagesize.attribute"> <attribute name="efifatimagesize"> <a:documentation>For ISO images (live and install) the EFI boot requires @@ -3052,6 +3069,18 @@ <sch:param name="types" value="iso oem"/> </sch:pattern> </define> + <define name="k.type.application_id.attribute"> + <attribute name="application_id"> + <a:documentation>for the iso/(oem install iso) type only: +Specifies the Application ID to be written +into the master block. There is space for 128 characters.</a:documentation> + <ref name="safe-posix-long-name"/> + </attribute> + <sch:pattern id="application_id" is-a="image_type"> + <sch:param name="attr" value="application_id"/> + <sch:param name="types" value="iso oem"/> + </sch:pattern> + </define> <define name="k.type.wwid_wait_timeout.attribute"> <attribute name="wwid_wait_timeout"> <a:documentation>Specifies the wait period in seconds after launching @@ -3193,6 +3222,9 @@ <ref name="k.type.efifatimagesize.attribute"/> </optional> <optional> + <ref name="k.type.eficsm.attribute"/> + </optional> + <optional> <ref name="k.type.efiparttable.attribute"/> </optional> <optional> @@ -3386,6 +3418,9 @@ <ref name="k.type.volid.attribute"/> </optional> <optional> + <ref name="k.type.application_id.attribute"/> + </optional> + <optional> <ref name="k.type.wwid_wait_timeout.attribute"/> </optional> <optional> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/storage/loop_device.py new/kiwi-10.0.25/kiwi/storage/loop_device.py --- old/kiwi-10.0.23/kiwi/storage/loop_device.py 2024-06-24 09:01:40.274911000 +0200 +++ new/kiwi-10.0.25/kiwi/storage/loop_device.py 2024-07-11 20:38:03.794079000 +0200 @@ -17,6 +17,8 @@ # import os import logging +import time +import pathlib # project from kiwi.command import Command @@ -108,9 +110,22 @@ try: Command.run(['losetup', '-d', self.node_name]) # loop detach is an async operation, re-use of the device - # should not be done before the kernel event queue has - # settled after detaching - Command.run(['udevadm', 'settle']) + # should not be done before the block device has been released + loop_released = False + sys_block_loop = pathlib.Path( + '/sys/devices/virtual/block/{0}/loop'.format( + os.path.basename(self.node_name) + ) + ) + for busy in range(0, 100): + if not sys_block_loop.is_block_device(): + loop_released = True + break + time.sleep(0.1) + if not loop_released: + raise KiwiCommandError( + f'Loop device {self.node_name} still attached' + ) except (KiwiCommandError, KiwiCommandNotFound) as issue: log.error( 'loop cleanup on {0} failed with: {1}'.format( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/tasks/base.py new/kiwi-10.0.25/kiwi/tasks/base.py --- old/kiwi-10.0.23/kiwi/tasks/base.py 2024-05-02 09:12:27.080463600 +0200 +++ new/kiwi-10.0.25/kiwi/tasks/base.py 2024-07-11 21:06:57.577307500 +0200 @@ -236,6 +236,21 @@ """ return self._ntuple_token(option, 10) + def attr_token( + self, option: str + ) -> List[Union[bool, str, List[str], None]]: + """ + Helper method for commandline options of the + form --option attribute=value + + :param str option: attribute=value string + + :return: common option value representation + + :rtype: list + """ + return self._ntuple_token(option, 2, '=') + def run_checks(self, checks: Dict[str, List[str]]) -> None: """ This method runs the given runtime checks excluding the ones disabled @@ -264,7 +279,7 @@ return token def _ntuple_token( - self, option: str, tuple_count: int + self, option: str, tuple_count: int, separator: str = ',' ) -> List[Union[bool, str, List[str], None]]: """ Helper method for commandline options of the form --option a,b,c,d,e,f @@ -279,7 +294,7 @@ :rtype: list """ - tokens = option.split(',', tuple_count - 1) if option else [] + tokens = option.split(separator, tuple_count - 1) if option else [] return [ self._pop_token(tokens) if len(tokens) else None for _ in range( 0, tuple_count diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/tasks/system_build.py new/kiwi-10.0.25/kiwi/tasks/system_build.py --- old/kiwi-10.0.23/kiwi/tasks/system_build.py 2024-05-02 09:12:27.080463600 +0200 +++ new/kiwi-10.0.25/kiwi/tasks/system_build.py 2024-07-11 21:06:57.577307500 +0200 @@ -32,6 +32,8 @@ [--set-container-derived-from=<uri>] [--set-container-tag=<name>] [--add-container-label=<label>...] + [--set-type-attr=<attribute=value>...] + [--set-release-version=<version>] [--signing-key=<key-file>...] kiwi-ng system build help @@ -104,6 +106,12 @@ password connected to the set-repo specification. If the provided value describes a filename in the filesystem, the first line of that file is read and used as credentials information. + --set-type-attr=<attribute=value> + overwrite/set the attribute with the provided value in the selected + build type section + --set-release-version=<version> + overwrite/set the release-version element in the selected + build type preferences section --signing-key=<key-file> includes the key-file as a trusted key for package manager validations --target-dir=<directory> @@ -173,6 +181,32 @@ ) self.run_checks(build_checks) + if self.command_args['--set-type-attr']: + for set_type_attr in self.command_args['--set-type-attr']: + (attribute, value) = self.attr_token(set_type_attr) + log.info(f'--> Set <type ... {attribute}="{value}" .../>') + try: + eval( + f'self.xml_state.build_type.set_{attribute}("{value}")' + ) + except AttributeError as issue: + log.error(f'Failed to set type attribute: {issue}') + return + + if self.command_args['--set-release-version']: + release_version = self.command_args['--set-release-version'] + log.info(f'--> Set <release-version> = {release_version}') + section_overwrite = False + for preferences in self.xml_state.get_preferences_sections(): + section = preferences.get_release_version() + if section: + section[0] = release_version + section_overwrite = True + break + if not section_overwrite: + preferences = self.xml_state.get_preferences_sections()[0] + preferences.add_release_version(release_version) + if self.command_args['--ignore-repos']: self.xml_state.delete_repository_sections() elif self.command_args['--ignore-repos-used-for-build']: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/tasks/system_prepare.py new/kiwi-10.0.25/kiwi/tasks/system_prepare.py --- old/kiwi-10.0.23/kiwi/tasks/system_prepare.py 2024-05-02 09:12:27.080463600 +0200 +++ new/kiwi-10.0.25/kiwi/tasks/system_prepare.py 2024-07-11 21:06:57.577307500 +0200 @@ -32,6 +32,8 @@ [--set-container-derived-from=<uri>] [--set-container-tag=<name>] [--add-container-label=<label>...] + [--set-type-attr=<attribute=value>...] + [--set-release-version=<version>] [--signing-key=<key-file>...] kiwi-ng system prepare help @@ -104,6 +106,12 @@ password connected to the set-repo specification. If the provided value describes a filename in the filesystem, the first line of that file is read and used as credentials information. + --set-type-attr=<attribute=value> + overwrite/set the attribute with the provided value in the selected + build type section + --set-release-version=<version> + overwrite/set the release-version element in the selected + build type preferences section --signing-key=<key-file> includes the key-file as a trusted key for package manager validations """ @@ -160,6 +168,32 @@ ) self.run_checks(prepare_checks) + if self.command_args['--set-type-attr']: + for set_type_attr in self.command_args['--set-type-attr']: + (attribute, value) = self.attr_token(set_type_attr) + log.info(f'--> Set <type ... {attribute}="{value}" .../>') + try: + eval( + f'self.xml_state.build_type.set_{attribute}("{value}")' + ) + except AttributeError as issue: + log.error(f'Failed to set type attribute: {issue}') + return + + if self.command_args['--set-release-version']: + release_version = self.command_args['--set-release-version'] + log.info(f'--> Set <release-version> = {release_version}') + section_overwrite = False + for preferences in self.xml_state.get_preferences_sections(): + section = preferences.get_release_version() + if section: + section[0] = release_version + section_overwrite = True + break + if not section_overwrite: + preferences = self.xml_state.get_preferences_sections()[0] + preferences.add_release_version(release_version) + if self.command_args['--ignore-repos']: self.xml_state.delete_repository_sections() elif self.command_args['--ignore-repos-used-for-build']: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/utils/compress.py new/kiwi-10.0.25/kiwi/utils/compress.py --- old/kiwi-10.0.23/kiwi/utils/compress.py 2024-04-18 14:53:58.606938600 +0200 +++ new/kiwi-10.0.25/kiwi/utils/compress.py 2024-07-13 13:48:12.461693300 +0200 @@ -129,17 +129,9 @@ :rtype: Optional[str] """ for zipper in self.supported_zipper: - cmd = [zipper, '-l', self.source_filename] - try: - Command.run(cmd) + result = Command.run( + [zipper, '-l', self.source_filename], raise_on_error=False + ) + if result.returncode == 0: return zipper - except Exception as exc: - log.debug( - 'Error running "{cmd:s}", got a {exc_t:s}: {exc:s}' - .format( - cmd=' '.join(cmd), - exc_t=type(exc).__name__, - exc=str(exc) - ) - ) return None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/version.py new/kiwi-10.0.25/kiwi/version.py --- old/kiwi-10.0.23/kiwi/version.py 2024-07-04 12:57:58.582599600 +0200 +++ new/kiwi-10.0.25/kiwi/version.py 2024-07-14 11:17:33.562450600 +0200 @@ -18,5 +18,5 @@ """ Global version information used in kiwi and the package """ -__version__ = '10.0.23' +__version__ = '10.0.25' __githash__ = '$Format:%H$' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/kiwi/xml_parse.py new/kiwi-10.0.25/kiwi/xml_parse.py --- old/kiwi-10.0.23/kiwi/xml_parse.py 2024-07-04 11:43:52.214901400 +0200 +++ new/kiwi-10.0.25/kiwi/xml_parse.py 2024-07-13 13:48:12.465693500 +0200 @@ -3067,7 +3067,7 @@ """The Image Type of the Logical Extend""" subclass = None superclass = None - def __init__(self, boot=None, bootfilesystem=None, firmware=None, bootkernel=None, bootpartition=None, bootpartsize=None, efipartsize=None, efifatimagesize=None, efiparttable=None, dosparttable_extended_layout=None, bootprofile=None, btrfs_quota_groups=None, btrfs_root_is_snapshot=None, btrfs_root_is_subvolume=None, btrfs_set_default_volume=None, btrfs_root_is_readonly_snapshot=None, compressed=None, devicepersistency=None, editbootconfig=None, editbootinstall=None, filesystem=None, flags=None, format=None, formatoptions=None, fsmountoptions=None, fscreateoptions=None, squashfscompression=None, gcelicense=None, hybridpersistent=None, hybridpersistent_filesystem=None, gpt_hybrid_mbr=None, force_mbr=None, initrd_system=None, image=None, metadata_path=None, installboot=None, install_continue_on_timeout=None, installprovidefailsafe=None, installiso=None, installstick=None, installpxe=None, mediacheck=None, kernelcmdline=None, luks=None, luks_version=None, luksOS=None, luks_randomize =None, luks_pbkdf=None, mdraid=None, overlayroot=None, overlayroot_write_partition=None, overlayroot_readonly_partsize=None, verity_blocks=None, embed_verity_metadata=None, standalone_integrity=None, embed_integrity_metadata=None, integrity_legacy_hmac=None, integrity_metadata_key_description=None, integrity_keyfile=None, primary=None, ramonly=None, rootfs_label=None, spare_part=None, spare_part_mountpoint=None, spare_part_fs=None, spare_part_fs_attributes=None, spare_part_is_last=None, target_blocksize=None, target_removable=None, selinux_policy=None, vga=None, vhdfixedtag=None, volid=None, wwid_wait_timeout=None, derived_from=None, delta_root=None, ensure_empty_tmpdirs=None, xen_server=None, publisher=None, disk_start_sector=None, root_clone=None, boot_clone=None, bundle_format=None, bootloader=None, containerconfig=None, machine=None, oemconfig=None, size=None, systemdisk=None, partitions=None, vagrantconfig=None, installmedia=None, luksformat=None): + def __init__(self, boot=None, bootfilesystem=None, firmware=None, bootkernel=None, bootpartition=None, bootpartsize=None, efipartsize=None, efifatimagesize=None, eficsm=None, efiparttable=None, dosparttable_extended_layout=None, bootprofile=None, btrfs_quota_groups=None, btrfs_root_is_snapshot=None, btrfs_root_is_subvolume=None, btrfs_set_default_volume=None, btrfs_root_is_readonly_snapshot=None, compressed=None, devicepersistency=None, editbootconfig=None, editbootinstall=None, filesystem=None, flags=None, format=None, formatoptions=None, fsmountoptions=None, fscreateoptions=None, squashfscompression=None, gcelicense=None, hybridpersistent=None, hybridpersistent_filesystem=None, gpt_hybrid_mbr=None, force_mbr=None, initrd_system=None, image=None, metadata_path=None, installboot=None, install_continue_on_timeout=None, installprovidefailsafe=None, installiso=None, installstick=None, installpxe=None, mediacheck=None, kernelcmdline=None, luks=None, luks_version=None, luksOS=None, l uks_randomize=None, luks_pbkdf=None, mdraid=None, overlayroot=None, overlayroot_write_partition=None, overlayroot_readonly_partsize=None, verity_blocks=None, embed_verity_metadata=None, standalone_integrity=None, embed_integrity_metadata=None, integrity_legacy_hmac=None, integrity_metadata_key_description=None, integrity_keyfile=None, primary=None, ramonly=None, rootfs_label=None, spare_part=None, spare_part_mountpoint=None, spare_part_fs=None, spare_part_fs_attributes=None, spare_part_is_last=None, target_blocksize=None, target_removable=None, selinux_policy=None, vga=None, vhdfixedtag=None, volid=None, application_id=None, wwid_wait_timeout=None, derived_from=None, delta_root=None, ensure_empty_tmpdirs=None, xen_server=None, publisher=None, disk_start_sector=None, root_clone=None, boot_clone=None, bundle_format=None, bootloader=None, containerconfig=None, machine=None, oemconfig=None, size=None, systemdisk=None, partitions=None, vagrantconfig=None, installmedia=None, luksformat=No ne): self.original_tagname_ = None self.boot = _cast(None, boot) self.bootfilesystem = _cast(None, bootfilesystem) @@ -3077,6 +3077,7 @@ self.bootpartsize = _cast(int, bootpartsize) self.efipartsize = _cast(int, efipartsize) self.efifatimagesize = _cast(int, efifatimagesize) + self.eficsm = _cast(bool, eficsm) self.efiparttable = _cast(None, efiparttable) self.dosparttable_extended_layout = _cast(bool, dosparttable_extended_layout) self.bootprofile = _cast(None, bootprofile) @@ -3142,6 +3143,7 @@ self.vga = _cast(None, vga) self.vhdfixedtag = _cast(None, vhdfixedtag) self.volid = _cast(None, volid) + self.application_id = _cast(None, application_id) self.wwid_wait_timeout = _cast(int, wwid_wait_timeout) self.derived_from = _cast(None, derived_from) self.delta_root = _cast(bool, delta_root) @@ -3269,6 +3271,8 @@ def set_efipartsize(self, efipartsize): self.efipartsize = efipartsize def get_efifatimagesize(self): return self.efifatimagesize def set_efifatimagesize(self, efifatimagesize): self.efifatimagesize = efifatimagesize + def get_eficsm(self): return self.eficsm + def set_eficsm(self, eficsm): self.eficsm = eficsm def get_efiparttable(self): return self.efiparttable def set_efiparttable(self, efiparttable): self.efiparttable = efiparttable def get_dosparttable_extended_layout(self): return self.dosparttable_extended_layout @@ -3399,6 +3403,8 @@ def set_vhdfixedtag(self, vhdfixedtag): self.vhdfixedtag = vhdfixedtag def get_volid(self): return self.volid def set_volid(self, volid): self.volid = volid + def get_application_id(self): return self.application_id + def set_application_id(self, application_id): self.application_id = application_id def get_wwid_wait_timeout(self): return self.wwid_wait_timeout def set_wwid_wait_timeout(self, wwid_wait_timeout): self.wwid_wait_timeout = wwid_wait_timeout def get_derived_from(self): return self.derived_from @@ -3454,6 +3460,13 @@ self.validate_safe_posix_short_name_patterns_, value): warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_safe_posix_short_name_patterns_, )) validate_safe_posix_short_name_patterns_ = [['^[a-zA-Z0-9_\\-\\.]{1,32}$']] + def validate_safe_posix_long_name(self, value): + # Validate type safe-posix-long-name, a restriction on xs:token. + if value is not None and Validate_simpletypes_: + if not self.gds_validate_simple_patterns( + self.validate_safe_posix_long_name_patterns_, value): + warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_safe_posix_long_name_patterns_, )) + validate_safe_posix_long_name_patterns_ = [['^[a-zA-Z0-9_\\-\\.]{1,128}$']] def validate_number_type(self, value): # Validate type number-type, a restriction on xs:token. if value is not None and Validate_simpletypes_: @@ -3523,6 +3536,9 @@ if self.efifatimagesize is not None and 'efifatimagesize' not in already_processed: already_processed.add('efifatimagesize') outfile.write(' efifatimagesize="%s"' % self.gds_format_integer(self.efifatimagesize, input_name='efifatimagesize')) + if self.eficsm is not None and 'eficsm' not in already_processed: + already_processed.add('eficsm') + outfile.write(' eficsm="%s"' % self.gds_format_boolean(self.eficsm, input_name='eficsm')) if self.efiparttable is not None and 'efiparttable' not in already_processed: already_processed.add('efiparttable') outfile.write(' efiparttable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.efiparttable), input_name='efiparttable')), )) @@ -3718,6 +3734,9 @@ if self.volid is not None and 'volid' not in already_processed: already_processed.add('volid') outfile.write(' volid=%s' % (quote_attrib(self.volid), )) + if self.application_id is not None and 'application_id' not in already_processed: + already_processed.add('application_id') + outfile.write(' application_id=%s' % (quote_attrib(self.application_id), )) if self.wwid_wait_timeout is not None and 'wwid_wait_timeout' not in already_processed: already_processed.add('wwid_wait_timeout') outfile.write(' wwid_wait_timeout="%s"' % self.gds_format_integer(self.wwid_wait_timeout, input_name='wwid_wait_timeout')) @@ -3835,6 +3854,15 @@ raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.efifatimagesize < 0: raise_parse_error(node, 'Invalid NonNegativeInteger') + value = find_attr_value_('eficsm', node) + if value is not None and 'eficsm' not in already_processed: + already_processed.add('eficsm') + if value in ('true', '1'): + self.eficsm = True + elif value in ('false', '0'): + self.eficsm = False + else: + raise_parse_error(node, 'Bad boolean attribute') value = find_attr_value_('efiparttable', node) if value is not None and 'efiparttable' not in already_processed: already_processed.add('efiparttable') @@ -4266,6 +4294,12 @@ self.volid = value self.volid = ' '.join(self.volid.split()) self.validate_safe_posix_short_name(self.volid) # validate type safe-posix-short-name + value = find_attr_value_('application_id', node) + if value is not None and 'application_id' not in already_processed: + already_processed.add('application_id') + self.application_id = value + self.application_id = ' '.join(self.application_id.split()) + self.validate_safe_posix_long_name(self.application_id) # validate type safe-posix-long-name value = find_attr_value_('wwid_wait_timeout', node) if value is not None and 'wwid_wait_timeout' not in already_processed: already_processed.add('wwid_wait_timeout') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/package/python-kiwi-spec-template new/kiwi-10.0.25/package/python-kiwi-spec-template --- old/kiwi-10.0.23/package/python-kiwi-spec-template 2024-07-04 11:43:52.214901400 +0200 +++ new/kiwi-10.0.25/package/python-kiwi-spec-template 2024-07-11 20:38:03.794079000 +0200 @@ -334,6 +334,10 @@ Requires: kiwi-systemdeps-filesystems = %{version}-%{release} Requires: kiwi-systemdeps-bootloaders = %{version}-%{release} Requires: kiwi-systemdeps-iso-media = %{version}-%{release} +%if 0%{?suse_version} >= 1650 +Requires: binutils +Requires: glibc-gconv-modules-extra +%endif %if 0%{?suse_version} Requires: gptfdisk %else @@ -412,7 +416,6 @@ Requires: file Requires: sed Requires: bash -Recommends: bash-completion Requires: python%{python3_pkgversion} >= 3.9 %if 0%{?ubuntu} || 0%{?debian} Requires: python%{python3_pkgversion}-yaml @@ -655,6 +658,19 @@ %description -n kiwi-man-pages Provides manual pages to describe the kiwi commands +%package -n kiwi-bash-completion +Summary: Bash Completion for kiwi-ng +Requires: bash-completion +Requires: python%{python3_pkgversion}-kiwi = %{version} +%if ! (0%{?debian} || 0%{?ubuntu}) +Supplements: (%{name} and bash-completion) +%endif +BuildArch: noarch + +%description -n kiwi-bash-completion +Bash command line completion support for python-kiwi - completion +of subcommands, parameters and keywords for the kiwi-ng command. + %prep %setup -q -n kiwi-%{version} @@ -764,11 +780,13 @@ %{_bindir}/kiwi-ng %{_bindir}/kiwi-ng-3* %{python3_sitelib}/kiwi* -%{_usr}/share/bash-completion/completions/kiwi-ng %{_usr}/share/kiwi/xsl_to_v74/ %{_defaultdocdir}/python-kiwi/LICENSE %{_defaultdocdir}/python-kiwi/README +%files -n kiwi-bash-completion +%{_usr}/share/bash-completion/completions/kiwi-ng + %files -n kiwi-man-pages %config %_sysconfdir/kiwi.yml %doc %{_mandir}/man8/* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/pyproject.toml new/kiwi-10.0.25/pyproject.toml --- old/kiwi-10.0.23/pyproject.toml 2024-07-04 12:57:58.582599600 +0200 +++ new/kiwi-10.0.25/pyproject.toml 2024-07-14 11:17:33.562450600 +0200 @@ -1,6 +1,6 @@ [tool.poetry] name = "kiwi" -version = "10.0.23" +version = "10.0.25" description = "KIWI - Appliance Builder" license = "GPL-3.0-or-later" readme = "README.rst" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/bootloader/config/grub2_test.py new/kiwi-10.0.25/test/unit/bootloader/config/grub2_test.py --- old/kiwi-10.0.23/test/unit/bootloader/config/grub2_test.py 2024-06-17 10:30:43.155229800 +0200 +++ new/kiwi-10.0.25/test/unit/bootloader/config/grub2_test.py 2024-07-13 13:48:12.465693500 +0200 @@ -79,7 +79,7 @@ return_value=None ) self.firmware.efi_mode = Mock( - return_value=None + return_value='' ) mock_firmware.return_value = self.firmware @@ -1381,7 +1381,7 @@ Defaults.set_platform_name('x86_64') mock_get_boot_path.return_value = '/boot' self.firmware.efi_mode = Mock( - return_value=None + return_value='' ) self.bootloader.xen_guest = True self.os_exists['root_dir/boot/grub2/fonts/unicode.pf2'] = False @@ -1417,7 +1417,7 @@ mock_get_boot_path.return_value = '/boot' self.bootloader.arch = 'ppc64le' self.firmware.efi_mode = Mock( - return_value=None + return_value='' ) self.bootloader.xen_guest = False self.os_exists['root_dir/boot/grub2/fonts/unicode.pf2'] = False @@ -1448,7 +1448,7 @@ mock_get_boot_path.return_value = '/boot' self.bootloader.arch = 's390x' self.firmware.efi_mode = Mock( - return_value=None + return_value='' ) self.bootloader.xen_guest = False self.os_exists['root_dir/boot/grub2/fonts/unicode.pf2'] = False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/bootloader/install/grub2_test.py new/kiwi-10.0.25/test/unit/bootloader/install/grub2_test.py --- old/kiwi-10.0.23/test/unit/bootloader/install/grub2_test.py 2024-06-18 08:42:06.351156000 +0200 +++ new/kiwi-10.0.25/test/unit/bootloader/install/grub2_test.py 2024-07-13 13:48:12.465693500 +0200 @@ -141,6 +141,17 @@ ) assert self.bootloader.install_required() is False + def test_install_required_efi_no_csm(self): + self.bootloader.arch = 'x86_64' + self.bootloader.firmware = mock.Mock() + self.bootloader.firmware.efi_mode = mock.Mock( + return_value='efi' + ) + self.bootloader.firmware.legacy_bios_mode = mock.Mock( + return_value=False + ) + assert self.bootloader.install_required() is False + def test_install_required_arm64(self): self.bootloader.arch = 'arm64' assert self.bootloader.install_required() is False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/builder/live_test.py new/kiwi-10.0.25/test/unit/builder/live_test.py --- old/kiwi-10.0.23/test/unit/builder/live_test.py 2024-05-02 09:12:27.108463500 +0200 +++ new/kiwi-10.0.25/test/unit/builder/live_test.py 2024-07-13 13:48:12.465693500 +0200 @@ -18,6 +18,9 @@ Defaults.set_platform_name('x86_64') self.firmware = Mock() + self.firmware.legacy_bios_mode = Mock( + return_value=True + ) self.firmware.efi_mode = Mock( return_value='uefi' ) @@ -77,6 +80,9 @@ self.xml_state.get_fs_create_option_list = Mock( return_value=['-O', 'option'] ) + self.xml_state.build_type.get_application_id = Mock( + return_value='0xffffffff' + ) self.xml_state.build_type.get_flags = Mock( return_value=None ) @@ -350,12 +356,14 @@ custom_args={ 'meta_data': { 'mbr_id': '0xffffffff', + 'application_id': '0xffffffff', 'preparer': 'KIWI - https://github.com/OSInside/kiwi', 'publisher': 'Custom publisher', 'volume_id': 'volid', 'efi_mode': 'uefi', 'efi_loader': 'kiwi-tmpfile', - 'udf': True + 'udf': True, + 'legacy_bios_mode': True } }, device_provider=mock_DeviceProvider.return_value, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/cli_test.py new/kiwi-10.0.25/test/unit/cli_test.py --- old/kiwi-10.0.23/test/unit/cli_test.py 2024-05-02 09:12:27.108463500 +0200 +++ new/kiwi-10.0.25/test/unit/cli_test.py 2024-07-11 21:06:57.577307500 +0200 @@ -48,6 +48,8 @@ self.command_args = { '--add-repo': [], '--add-repo-credentials': [], + '--set-type-attr': [], + '--set-release-version': None, '--allow-existing-root': False, '--description': 'description', '--help': False, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/firmware_test.py new/kiwi-10.0.25/test/unit/firmware_test.py --- old/kiwi-10.0.23/test/unit/firmware_test.py 2024-05-02 09:12:27.108463500 +0200 +++ new/kiwi-10.0.25/test/unit/firmware_test.py 2024-07-13 13:48:12.465693500 +0200 @@ -87,7 +87,7 @@ assert self.firmware_bios.ec2_mode() is None def test_efi_mode(self): - assert self.firmware_bios.efi_mode() is None + assert self.firmware_bios.efi_mode() == '' assert self.firmware_efi.efi_mode() == 'efi' def test_bios_mode(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/iso_tools/xorriso_test.py new/kiwi-10.0.25/test/unit/iso_tools/xorriso_test.py --- old/kiwi-10.0.23/test/unit/iso_tools/xorriso_test.py 2024-05-02 09:12:27.108463500 +0200 +++ new/kiwi-10.0.25/test/unit/iso_tools/xorriso_test.py 2024-07-13 13:48:12.465693500 +0200 @@ -45,7 +45,8 @@ 'publisher': 'org', 'preparer': 'preparer', 'volume_id': 'vol_id', - 'efi_mode': 'uefi' + 'efi_mode': 'uefi', + 'legacy_bios_mode': True } ) assert 'No hybrid MBR file found' in self._caplog.text @@ -59,7 +60,8 @@ 'publisher': 'org', 'preparer': 'preparer', 'volume_id': 'vol_id', - 'efi_mode': 'uefi' + 'efi_mode': 'uefi', + 'legacy_bios_mode': True } ) assert self.iso_tool.iso_parameters == [ @@ -85,6 +87,31 @@ '-boot_image', 'any', 'load_size=2048' ] + @patch('os.path.exists') + def test_init_iso_creation_parameters_efi_custom_app_id( + self, mock_os_path_exists + ): + mock_os_path_exists.return_value = True + self.iso_tool.init_iso_creation_parameters( + { + 'mbr_id': 'app_id', + 'application_id': 'some_other_app_id', + 'publisher': 'org', + 'preparer': 'preparer', + 'volume_id': 'vol_id', + 'efi_mode': 'uefi', + 'legacy_bios_mode': True + } + ) + assert self.iso_tool.iso_parameters == [ + '-application_id', 'some_other_app_id', + '-publisher', 'org', + '-preparer_id', 'preparer', + '-volid', 'vol_id', + '-joliet', 'on', + '-padding', '0' + ] + def test_add_efi_loader_parameters(self): self.iso_tool.add_efi_loader_parameters('target_dir/efi-loader') assert self.iso_tool.iso_loaders == [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/storage/loop_device_test.py new/kiwi-10.0.25/test/unit/storage/loop_device_test.py --- old/kiwi-10.0.23/test/unit/storage/loop_device_test.py 2024-06-24 09:01:40.274911000 +0200 +++ new/kiwi-10.0.25/test/unit/storage/loop_device_test.py 2024-07-11 20:38:03.798079300 +0200 @@ -70,17 +70,56 @@ @patch('kiwi.storage.loop_device.Command.run') @patch('os.path.exists') - def test_context_manager_exit(self, mock_os_path_exists, mock_command_run): + @patch('pathlib.Path.is_block_device') + @patch('time.sleep') + def test_context_manager_exit_loop_released( + self, mock_time_sleep, mock_is_block_device, + mock_os_path_exists, mock_command_run + ): + is_block_device = [False, True] mock_os_path_exists.return_value = True + mock_command_run.side_effect = KiwiCommandError('error') - def side_effect(params): + def Command_run(params): # raise on first command which is 'losetup -f ...' - # and raise on last command which is 'udevadm settle' to trigger - # the logging error - if params[1] == '-f' or params[1] == 'settle': + if params[1] == '-f': raise KiwiCommandError('issue') - mock_command_run.side_effect = side_effect + def Path_is_block_device(): + return is_block_device.pop() + + mock_is_block_device.side_effect = Path_is_block_device + mock_command_run.side_effect = Command_run + + with self._caplog.at_level(logging.ERROR): + with LoopDevice('loop-file', 20) as loop_provider: + loop_provider.node_name = '/dev/loop0' + with raises(KiwiCommandError): + loop_provider.create(overwrite=False) + assert len(mock_is_block_device.call_args_list) == 2 + assert mock_command_run.call_args_list == [ + call(['losetup', '-f', '--show', 'loop-file']), + call(['losetup', '-d', '/dev/loop0']) + ] + + @patch('kiwi.storage.loop_device.Command.run') + @patch('os.path.exists') + @patch('pathlib.Path.is_block_device') + @patch('time.sleep') + def test_context_manager_exit_loop_not_released( + self, mock_time_sleep, mock_is_block_device, + mock_os_path_exists, mock_command_run + ): + mock_os_path_exists.return_value = True + mock_command_run.side_effect = KiwiCommandError('error') + mock_is_block_device.return_value = True + + def Command_run(params): + # raise on first command which is 'losetup -f ...' + if params[1] == '-f': + raise KiwiCommandError('issue') + + mock_command_run.side_effect = Command_run with self._caplog.at_level(logging.ERROR): with LoopDevice('loop-file', 20) as loop_provider: @@ -89,6 +128,5 @@ loop_provider.create(overwrite=False) assert mock_command_run.call_args_list == [ call(['losetup', '-f', '--show', 'loop-file']), - call(['losetup', '-d', '/dev/loop0']), - call(['udevadm', 'settle']) + call(['losetup', '-d', '/dev/loop0']) ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/tasks/base_test.py new/kiwi-10.0.25/test/unit/tasks/base_test.py --- old/kiwi-10.0.23/test/unit/tasks/base_test.py 2024-05-02 09:12:27.124463600 +0200 +++ new/kiwi-10.0.25/test/unit/tasks/base_test.py 2024-07-11 21:06:57.577307500 +0200 @@ -142,6 +142,9 @@ None, None, None ] + def test_attr_token(self): + assert self.task.attr_token('a=b') == ['a', 'b'] + @patch('kiwi.tasks.base.RuntimeChecker') def test_load_xml_description(self, mock_runtime_checker): self.task.load_xml_description('../data/description') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/tasks/result_bundle_test.py new/kiwi-10.0.25/test/unit/tasks/result_bundle_test.py --- old/kiwi-10.0.23/test/unit/tasks/result_bundle_test.py 2024-05-02 09:12:27.124463600 +0200 +++ new/kiwi-10.0.25/test/unit/tasks/result_bundle_test.py 2024-07-13 13:48:12.465693500 +0200 @@ -191,14 +191,23 @@ @patch('os.path.islink') @patch('os.symlink') @patch('os.readlink') + @patch('os.path.realpath') + @patch('os.path.abspath') def test_process_result_bundle_as_rpm( - self, mock_os_readlink, mock_os_symlink, mock_os_path_islink, - mock_iglob, mock_unlink, mock_chdir, mock_exists, mock_checksum, - mock_compress, mock_path_wipe, mock_path_which, mock_path_create, - mock_command, mock_load, mock_Privileges_check_for_root_permissions + self, mock_os_path_abspath, mock_os_path_realpath, mock_os_readlink, + mock_os_symlink, mock_os_path_islink, mock_iglob, mock_unlink, + mock_chdir, mock_exists, mock_checksum, mock_compress, + mock_path_wipe, mock_path_which, mock_path_create, mock_command, + mock_load, mock_Privileges_check_for_root_permissions ): + abs_path = ['bundle-dir', 'target-dir'] + + def side_effect(path): + return abs_path.pop() + checksum = Mock() compress = Mock() + mock_os_path_abspath.side_effect = side_effect mock_path_which.return_value = 'zsyncmake' compress.xz.return_value = 'compressed_filename' mock_compress.return_value = compress @@ -216,14 +225,14 @@ with patch('builtins.open', m_open, create=True): self.task.process() - mock_path_wipe.assert_called_once_with(self.abs_bundle_dir) + mock_path_wipe.assert_called_once_with('bundle-dir') mock_Privileges_check_for_root_permissions.assert_called_once_with() assert mock_command.call_args_list == [ call( [ 'cp', 'test-image-1.2.3', os.sep.join( - [self.abs_bundle_dir, 'test-image-1.2.3-Build_42'] + ['bundle-dir', 'test-image-1.2.3-Build_42'] ) ] ), @@ -231,23 +240,21 @@ [ 'file', os.sep.join( - [self.abs_bundle_dir, 'test-image-1.2.3-Build_42'] + ['bundle-dir', 'test-image-1.2.3-Build_42'] ) ] ), call( [ 'rpmbuild', '--nodeps', '--nocheck', '--rmspec', '-bb', - os.sep.join([self.abs_bundle_dir, 'test-image.spec']) + os.sep.join(['bundle-dir', 'test-image.spec']) ] ), call( ['bash', '-c', 'mv noarch/*.rpm . && rmdir noarch'] ) ] - mock_chdir.assert_called_once_with( - self.abs_bundle_dir - ) + mock_chdir.assert_called_once_with('bundle-dir') assert mock_unlink.called @patch('kiwi.tasks.result_bundle.Result.load') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/tasks/system_build_test.py new/kiwi-10.0.25/test/unit/tasks/system_build_test.py --- old/kiwi-10.0.23/test/unit/tasks/system_build_test.py 2024-05-02 09:12:27.124463600 +0200 +++ new/kiwi-10.0.25/test/unit/tasks/system_build_test.py 2024-07-11 21:06:57.577307500 +0200 @@ -74,6 +74,8 @@ self.task.command_args = {} self.task.command_args['help'] = False self.task.command_args['build'] = False + self.task.command_args['--set-type-attr'] = ['volid=some'] + self.task.command_args['--set-release-version'] = '99' self.task.command_args['--allow-existing-root'] = True self.task.command_args['--description'] = '../data/description' self.task.command_args['--target-dir'] = 'some-target' @@ -254,6 +256,35 @@ 'new_tag' ) + @patch('kiwi.logger.Logger.set_logfile') + @patch('kiwi.tasks.system_build.SystemPrepare') + def test_process_system_build_invalid_type_attribute( + self, mock_SystemPrepare, mock_log + ): + self._init_command_args() + self.task.command_args['--set-type-attr'] = [ + 'bogus=value' + ] + with self._caplog.at_level(logging.ERROR): + self.task.process() + assert 'Failed to set type attribute' in self._caplog.text + + @patch('kiwi.xml_state.XMLState.get_repositories_signing_keys') + @patch('kiwi.xml_state.XMLState.get_preferences_sections') + @patch('kiwi.logger.Logger.set_logfile') + @patch('kiwi.tasks.system_build.SystemPrepare') + def test_process_system_build_release_version_no_overwrite( + self, mock_SystemPrepare, mock_logger, + mock_get_preferences_sections, mock_get_repositories_signing_keys + ): + preferences = MagicMock() + preferences.get_release_version.return_value = None + mock_get_preferences_sections.return_value = [preferences] + self._init_command_args() + self.task.command_args['--set-release-version'] = '42' + self.task.process() + preferences.add_release_version.assert_called_once_with('42') + @patch('kiwi.xml_state.XMLState.add_container_config_label') @patch('kiwi.logger.Logger.set_logfile') @patch('kiwi.tasks.system_build.SystemPrepare') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/tasks/system_prepare_test.py new/kiwi-10.0.25/test/unit/tasks/system_prepare_test.py --- old/kiwi-10.0.23/test/unit/tasks/system_prepare_test.py 2024-05-02 09:12:27.128463500 +0200 +++ new/kiwi-10.0.25/test/unit/tasks/system_prepare_test.py 2024-07-11 21:06:57.577307500 +0200 @@ -71,6 +71,8 @@ self.task.command_args['prepare'] = False self.task.command_args['--description'] = '../data/description' self.task.command_args['--root'] = '../data/root-dir' + self.task.command_args['--set-type-attr'] = ['volid=some'] + self.task.command_args['--set-release-version'] = '99' self.task.command_args['--allow-existing-root'] = False self.task.command_args['--set-repo'] = None self.task.command_args['--set-repo-credentials'] = None @@ -249,6 +251,35 @@ manager.__enter__.return_value, ['vim'] ) + @patch('kiwi.logger.Logger.set_logfile') + @patch('kiwi.tasks.system_prepare.SystemPrepare') + def test_process_system_build_invalid_type_attribute( + self, mock_SystemPrepare, mock_log + ): + self._init_command_args() + self.task.command_args['--set-type-attr'] = [ + 'bogus=value' + ] + with self._caplog.at_level(logging.ERROR): + self.task.process() + assert 'Failed to set type attribute' in self._caplog.text + + @patch('kiwi.xml_state.XMLState.get_repositories_signing_keys') + @patch('kiwi.xml_state.XMLState.get_preferences_sections') + @patch('kiwi.logger.Logger.set_logfile') + @patch('kiwi.tasks.system_prepare.SystemPrepare') + def test_process_system_build_release_version_no_overwrite( + self, mock_SystemPrepare, mock_logger, + mock_get_preferences_sections, mock_get_repositories_signing_keys + ): + preferences = MagicMock() + preferences.get_release_version.return_value = None + mock_get_preferences_sections.return_value = [preferences] + self._init_command_args() + self.task.command_args['--set-release-version'] = '42' + self.task.process() + preferences.add_release_version.assert_called_once_with('42') + @patch('kiwi.xml_state.XMLState.set_container_config_tag') @patch('kiwi.tasks.system_prepare.SystemPrepare') def test_process_system_prepare_set_container_tag( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kiwi-10.0.23/test/unit/utils/compress_test.py new/kiwi-10.0.25/test/unit/utils/compress_test.py --- old/kiwi-10.0.23/test/unit/utils/compress_test.py 2024-05-02 09:12:27.128463500 +0200 +++ new/kiwi-10.0.25/test/unit/utils/compress_test.py 2024-07-13 13:48:12.465693500 +0200 @@ -105,14 +105,14 @@ @patch('kiwi.command.Command.run') def test_get_format_invalid_format(self, mock_run): - mock_run.side_effect = ValueError("nothing") + result = Mock() + result.returncode = 1 + mock_run.return_value = result invalid = Compress("../data/gz_data.gz") invalid.supported_zipper = ["mock_zip"] with self._caplog.at_level(logging.DEBUG): assert invalid.get_format() is None mock_run.assert_called_once_with( - ['mock_zip', '-l', '../data/gz_data.gz'] + ['mock_zip', '-l', '../data/gz_data.gz'], raise_on_error=False ) - assert 'Error running "mock_zip -l ../data/gz_data.gz", got a' - ' ValueError: nothing' in self._caplog.text
participants (1)
-
Source-Sync