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.schae...@gmail.com>
+
+- Bump version: 10.0.24 → 10.0.25
+
+-------------------------------------------------------------------
+Fri Jul 12 12:58:24 CEST 2024 - Marcus Schäfer <marcus.schae...@gmail.com>
+
+- Fix mocking of test_process_result_bundle_as_rpm
+
+-------------------------------------------------------------------
+Fri Jul 12 12:43:23 CEST 2024 - Marcus Schäfer <marcus.schae...@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.schae...@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.schae...@gmail.com>
+
+- Bump version: 10.0.23 → 10.0.24
+
+-------------------------------------------------------------------
+Thu Jul 11 16:47:22 CEST 2024 - Marcus Schäfer <marcus.schae...@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.schae...@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.schae...@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.schae...@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.schae...@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.schae...@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.schae...@gmail.com>
+
+- Supplements are not understood by Debian/Ubuntu
+
+-------------------------------------------------------------------
+Thu Jul 04 16:16:44 CEST 2024 - Marcus Schäfer <marcus.schae...@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

Reply via email to