Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package os-autoinst for openSUSE:Factory 
checked in at 2026-03-23 17:13:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/os-autoinst (Old)
 and      /work/SRC/openSUSE:Factory/.os-autoinst.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "os-autoinst"

Mon Mar 23 17:13:50 2026 rev:576 rq:1341923 version:5.1774101470.e82b4cb

Changes:
--------
--- /work/SRC/openSUSE:Factory/os-autoinst/os-autoinst.changes  2026-03-14 
22:24:03.577267545 +0100
+++ /work/SRC/openSUSE:Factory/.os-autoinst.new.8177/os-autoinst.changes        
2026-03-23 17:15:24.686773154 +0100
@@ -1,0 +2,16 @@
+Mon Mar 23 02:21:40 UTC 2026 - [email protected]
+
+- Update to version 5.1774101470.e82b4cb:
+  * feat: implement 'always_run' test flag
+  * refactor: use gitlint from os-autoinst-common
+  * git subrepo pull (merge) --force external/os-autoinst-common
+  * feat(snd2png): restore erroneously deleted test
+  * style: fix copyright in crop.py
+  * chore: remove unused pyproject line
+  * chore(deps): Add PPI to development dependencies
+  * chore(snd2png): update test.png.md5.original based on current snd2png
+  * test(full-stack): optimize execution time by reducing timeouts
+  * feat(vnc): make connection retry sleep configurable
+  * feat: add configurable secret key hiding support
+
+-------------------------------------------------------------------

Old:
----
  os-autoinst-5.1773429030.ba0de6e.obscpio

New:
----
  os-autoinst-5.1774101470.e82b4cb.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ os-autoinst-devel-test.spec ++++++
--- /var/tmp/diff_new_pack.NS5ZFq/_old  2026-03-23 17:15:26.170834876 +0100
+++ /var/tmp/diff_new_pack.NS5ZFq/_new  2026-03-23 17:15:26.174835043 +0100
@@ -18,7 +18,7 @@
 
 %define         short_name os-autoinst-devel
 Name:           %{short_name}-test
-Version:        5.1773429030.ba0de6e
+Version:        5.1774101470.e82b4cb
 Release:        0
 Summary:        Test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ os-autoinst-openvswitch-test.spec ++++++
--- /var/tmp/diff_new_pack.NS5ZFq/_old  2026-03-23 17:15:26.210836540 +0100
+++ /var/tmp/diff_new_pack.NS5ZFq/_new  2026-03-23 17:15:26.210836540 +0100
@@ -19,7 +19,7 @@
 %define name_ext -test
 %define         short_name os-autoinst-openvswitch
 Name:           %{short_name}%{?name_ext}
-Version:        5.1773429030.ba0de6e
+Version:        5.1774101470.e82b4cb
 Release:        0
 Summary:        test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ os-autoinst-test.spec ++++++
--- /var/tmp/diff_new_pack.NS5ZFq/_old  2026-03-23 17:15:26.242837871 +0100
+++ /var/tmp/diff_new_pack.NS5ZFq/_new  2026-03-23 17:15:26.246838037 +0100
@@ -19,7 +19,7 @@
 %define name_ext -test
 %define         short_name os-autoinst
 Name:           %{short_name}%{?name_ext}
-Version:        5.1773429030.ba0de6e
+Version:        5.1774101470.e82b4cb
 Release:        0
 Summary:        test package for os-autoinst
 License:        GPL-2.0-or-later

++++++ os-autoinst.spec ++++++
--- /var/tmp/diff_new_pack.NS5ZFq/_old  2026-03-23 17:15:26.278839368 +0100
+++ /var/tmp/diff_new_pack.NS5ZFq/_new  2026-03-23 17:15:26.282839535 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           os-autoinst
-Version:        5.1773429030.ba0de6e
+Version:        5.1774101470.e82b4cb
 Release:        0
 Summary:        OS-level test automation
 License:        GPL-2.0-or-later
@@ -92,7 +92,7 @@
 %endif
 %if %{with black}
 # The following line is generated from dependencies.yaml
-%define python_style_requires python3-black
+%define python_style_requires python3-radon python3-ruff python3-ty 
python3-vulture
 %else
 %define python_style_requires %{nil}
 %endif
@@ -121,7 +121,7 @@
 # The following line is generated from dependencies.yaml
 %define test_version_only_requires perl(Mojo::IOLoop::ReadWriteProcess) >= 0.28
 # The following line is generated from dependencies.yaml
-%define test_requires %build_requires %lua_support_requires %ocr_requires 
%python_support_requires %spellcheck_requires %test_base_requires 
%test_non_s390_requires %yamllint_requires ffmpeg python3-Pillow-tk 
python3-gitlint
+%define test_requires %build_requires %lua_support_requires %ocr_requires 
%python_support_requires %spellcheck_requires %test_base_requires 
%test_non_s390_requires %yamllint_requires ffmpeg python3-Pillow-tk 
python3-gitlint python3-pytest python3-pytest-cov python3-pytest-mock 
python3-pytest-xdist
 %ifnarch s390x
 # The following line is generated from dependencies.yaml
 %define devel_non_s390_requires ShellCheck
@@ -129,7 +129,7 @@
 %define devel_non_s390_requires %{nil}
 %endif
 # The following line is generated from dependencies.yaml
-%define devel_requires %devel_non_s390_requires %python_style_requires 
%test_requires file perl(Code::TidyAll) perl(Devel::Cover) 
perl(Module::CPANfile) perl(Perl::Tidy) perl(Template::Toolkit) 
perl(Test::CheckGitStatus) sed shfmt
+%define devel_requires %devel_non_s390_requires %python_style_requires 
%test_requires file perl(Code::TidyAll) perl(Devel::Cover) 
perl(Module::CPANfile) perl(PPI) perl(Perl::Tidy) perl(Template::Toolkit) 
perl(Test::CheckGitStatus) sed shfmt
 %define s390_zvm_requires /usr/bin/xkbcomp /usr/bin/Xvnc x3270 icewm xterm 
xterm-console xdotool fonts-config mkfontdir mkfontscale openssh-clients
 %define ipmi_requires ipmitool
 %define qemu_requires qemu-tools e2fsprogs

++++++ os-autoinst-5.1773429030.ba0de6e.obscpio -> 
os-autoinst-5.1774101470.e82b4cb.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/.github/workflows/commit-message-checker.yml
 
new/os-autoinst-5.1774101470.e82b4cb/.github/workflows/commit-message-checker.yml
--- 
old/os-autoinst-5.1773429030.ba0de6e/.github/workflows/commit-message-checker.yml
   2026-03-13 20:10:30.000000000 +0100
+++ 
new/os-autoinst-5.1774101470.e82b4cb/.github/workflows/commit-message-checker.yml
   2026-03-23 17:15:28.034912402 +0100
@@ -1,23 +1 @@
----
-# Check if commit messages follow the conventional commits format
-name: 'Commit message check'
-# yamllint disable-line rule:truthy
-on:
-  pull_request:
-  push:
-    branches:
-      - '!master'
-
-jobs:
-  check-commit-message:
-    runs-on: ubuntu-latest
-    container:
-      image: registry.opensuse.org/devel/openqa/containers/os-autoinst_dev
-    steps:
-      - uses: actions/checkout@v4
-        with:
-          fetch-depth: 0
-      - name: Run gitlint
-        run: |
-          git config --global --add safe.directory '*'
-          ./tools/check-git-commit-message
+symbolic link to 
../../external/os-autoinst-common/.github/workflows/commit-message-checker.yml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/.gitignore 
new/os-autoinst-5.1774101470.e82b4cb/.gitignore
--- old/os-autoinst-5.1773429030.ba0de6e/.gitignore     2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/.gitignore     2026-03-21 
14:57:50.000000000 +0100
@@ -18,3 +18,6 @@
 
 # Common dir for Devel::Cover
 cover_db
+# generated by pytest-cov
+.coverage
+coverage.xml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/.gitlint 
new/os-autoinst-5.1774101470.e82b4cb/.gitlint
--- old/os-autoinst-5.1773429030.ba0de6e/.gitlint       2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/.gitlint       2026-03-23 
17:15:28.194919057 +0100
@@ -1,3 +1 @@
-[general]
-contrib=contrib-title-conventional-commits
-ignore=body-min-length,body-is-missing
+symbolic link to external/os-autoinst-common/.gitlint
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/.pre-commit-config.yaml 
new/os-autoinst-5.1774101470.e82b4cb/.pre-commit-config.yaml
--- old/os-autoinst-5.1773429030.ba0de6e/.pre-commit-config.yaml        
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/.pre-commit-config.yaml        
2026-03-23 17:15:28.250921387 +0100
@@ -1,6 +1 @@
-repos:
-  - repo: https://github.com/jorisroovers/gitlint
-    rev: v0.19.1
-    hooks:
-      - id: gitlint
-        stages: [commit-msg]
+symbolic link to external/os-autoinst-common/.pre-commit-config.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/CMakeLists.txt 
new/os-autoinst-5.1774101470.e82b4cb/CMakeLists.txt
--- old/os-autoinst-5.1773429030.ba0de6e/CMakeLists.txt 2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/CMakeLists.txt 2026-03-21 
14:57:50.000000000 +0100
@@ -274,3 +274,13 @@
     COMMAND sh -c "'${CLANG_FORMAT_PATH}" "--style=WebKit" "-i" "$$(find" "." 
"-name" "\*.h" "-o" "-name" "\*.cc" "-o" "-name" "\*.cpp)'"
     WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
 )
+
+# add target for formatting Python source code
+find_program(RUFF_PATH ruff)
+add_custom_target(
+    tidy-python
+    COMMENT "Formatting Python source code"
+    COMMAND "${RUFF_PATH}" format .
+    COMMAND "${RUFF_PATH}" check --fix .
+    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/OpenQA/Isotovideo/Interface.pm 
new/os-autoinst-5.1774101470.e82b4cb/OpenQA/Isotovideo/Interface.pm
--- old/os-autoinst-5.1773429030.ba0de6e/OpenQA/Isotovideo/Interface.pm 
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/OpenQA/Isotovideo/Interface.pm 
2026-03-21 14:57:50.000000000 +0100
@@ -9,7 +9,7 @@
 # -> increment on every change of such APIs
 # -> never move that variable to another place (when refactoring)
 #    because it may be accessed by the tests itself
-our $version = 49;
+our $version = 50;
 
 # major version of the (web socket) API relevant to the developer mode
 # -> increment when making non-backward compatible changes to that API
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/autotest.pm 
new/os-autoinst-5.1774101470.e82b4cb/autotest.pm
--- old/os-autoinst-5.1773429030.ba0de6e/autotest.pm    2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/autotest.pm    2026-03-21 
14:57:50.000000000 +0100
@@ -532,6 +532,7 @@
     bmwqemu::diag 'Snapshots are ' . ($snapshots_supported ? '' : 'not ') . 
'supported';
 
     write_test_order();
+    my $fatal_reason;
 
     for (my $testindex = 0; $testindex <= $#testorder; $testindex++) {
         my $t = $testorder[$testindex];
@@ -542,8 +543,8 @@
             load_snapshot($bmwqemu::vars{TESTDEBUG} ? 'lastgood' : $firsttest) 
if $bmwqemu::vars{SKIPTO};
             $vmloaded = 1;
         }
-        if (!$vmloaded) {
-            bmwqemu::diag "skipping $fullname";
+        if (!$vmloaded || ($fatal_reason && !$flags->{always_run})) {
+            bmwqemu::diag "skipping $fullname" . ($vmloaded ? ' (after fatal 
failure)' : '');
             $t->skip_if_not_running();
             $t->save_test_result();
             next;
@@ -570,22 +571,23 @@
             bmwqemu::diag $msg if $msg !~ /^test.*died/;
             query_isotovideo('backend_save_memory_dump', {filename => 
$fullname}) if $bmwqemu::vars{DUMP_MEMORY_ON_FAIL};
             if ($t->{fatal_failure} || $flags->{fatal} || (!exists 
$flags->{fatal} && !$snapshots_supported) || $bmwqemu::vars{TESTDEBUG}) {
-                my $reason = ($t->{fatal_failure} || $flags->{fatal})
-                  ? 'after a fatal test failure'
-                  : ($bmwqemu::vars{TESTDEBUG}
-                    ? 'because TESTDEBUG has been set'
-                    : 'because snapshotting is disabled/unavailable and "fatal 
=> 0" has NOT been set explicitly');
-                bmwqemu::diag "stopping overall test execution $reason";
-                bmwqemu::stop_vm();
-                return 0;
+                unless ($fatal_reason) {
+                    $fatal_reason = ($t->{fatal_failure} || $flags->{fatal})
+                      ? 'after a fatal test failure'
+                      : ($bmwqemu::vars{TESTDEBUG}
+                        ? 'because TESTDEBUG has been set'
+                        : 'because snapshotting is disabled/unavailable and 
"fatal => 0" has NOT been set explicitly');
+                    bmwqemu::diag "scheduled stop of overall test execution 
$fatal_reason";
+                }
             }
-            elsif (defined $next_test && !$flags->{no_rollback} && 
$last_milestone) {
+            elsif (defined $next_test && !$flags->{no_rollback} && 
$last_milestone && !$fatal_reason) {
                 load_snapshot('lastgood');
                 $next_test->record_resultfile('Snapshot', "Loaded snapshot 
because '$name' failed", result => 'ok');
                 rollback_activated_consoles();
             }
         }
         else {
+            next if $fatal_reason;
             if (defined $next_test && !$flags->{no_rollback} && 
$last_milestone && $flags->{always_rollback}) {
                 load_snapshot('lastgood');
                 $next_test->record_resultfile('Snapshot', "Loaded snapshot 
after '$name' (always_rollback)", result => 'ok') if $next_test;
@@ -605,6 +607,11 @@
             }
         }
     }
+    if ($fatal_reason) {
+        bmwqemu::diag "stopping overall test execution $fatal_reason";
+        bmwqemu::stop_vm();
+        return 0;
+    }
     return 1;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/backend/qemu.pm 
new/os-autoinst-5.1774101470.e82b4cb/backend/qemu.pm
--- old/os-autoinst-5.1773429030.ba0de6e/backend/qemu.pm        2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/backend/qemu.pm        2026-03-21 
14:57:50.000000000 +0100
@@ -576,7 +576,7 @@
 
 # baseclass virt method overwrite end
 
-sub find_ovmf () { first { -e } @bmwqemu::ovmf_locations }
+sub find_ovmf () { first { -e } @{bmwqemu::ovmf_locations()} }
 
 sub virtio_console_names () {
     return () unless $bmwqemu::vars{VIRTIO_CONSOLE};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/basetest.pm 
new/os-autoinst-5.1774101470.e82b4cb/basetest.pm
--- old/os-autoinst-5.1773429030.ba0de6e/basetest.pm    2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/basetest.pm    2026-03-21 
14:57:50.000000000 +0100
@@ -86,6 +86,7 @@
 Return a hash of flags that are either there or not
 
   'fatal'          - abort whole test suite if this fails (and set overall 
state 'failed')
+  'always_run'      - requests that a test module is always executed 
regardless if a previous test module is set to 'fatal'
   'ignore_failure' - if this module fails, it will not affect the overall 
result at all
   'milestone'      - after this test succeeds, update 'lastgood'
   'no_rollback'     - don't roll back to 'lastgood' snapshot if this fails
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/bmwqemu.pm 
new/os-autoinst-5.1774101470.e82b4cb/bmwqemu.pm
--- old/os-autoinst-5.1773429030.ba0de6e/bmwqemu.pm     2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/bmwqemu.pm     2026-03-21 
14:57:50.000000000 +0100
@@ -44,14 +44,20 @@
 # Known locations of OVMF (UEFI) firmware: first is openSUSE, second is
 # the kraxel.org nightly packages, third is Fedora's edk2-ovmf package,
 # fourth is Debian's ovmf package.
+our @ovmf_locations_no_secure_boot = (
+    '/usr/share/qemu/ovmf-x86_64-4m-code.bin', 
'/usr/share/qemu/ovmf-x86_64-ms-code.bin',
+);
 our @ovmf_locations = (
-    '/usr/share/qemu/ovmf-x86_64-ms-code.bin', 
'/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd',
+    '/usr/share/qemu/ovmf-x86_64-ms-4m-code.bin', 
'/usr/share/qemu/ovmf-x86_64-ms-code.bin',
+    '/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd',
     '/usr/share/edk2/ovmf/OVMF_CODE.fd', '/usr/share/OVMF/OVMF_CODE.fd'
 );
 
 our %vars;
 tie %vars, 'bmwqemu::tiedvars', %vars;
 
+sub ovmf_locations () { ($vars{UEFI_SECURE_BOOT} // 1) ? \@ovmf_locations : 
\@ovmf_locations_no_secure_boot }
+
 sub result_dir () { 'testresults' }
 
 # deprecated functions, moved to log module
@@ -101,7 +107,9 @@
     my $write_vars = \%vars;
     if ($args{no_secret}) {
         $write_vars = {};
-        $write_vars->{$_} = $vars{$_} for (grep !/(^_SECRET_|_PASSWORD)/, 
keys(%vars));
+        my $hide_re = '^_SECRET_|_PASSWORD';
+        $hide_re .= "|$vars{_HIDE_SECRETS_REGEX}" if 
$vars{_HIDE_SECRETS_REGEX};
+        $write_vars->{$_} = $vars{$_} for (grep !/($hide_re)/, keys(%vars));
     }
 
     # make sure the JSON is sorted
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/cmake/test-targets.cmake 
new/os-autoinst-5.1774101470.e82b4cb/cmake/test-targets.cmake
--- old/os-autoinst-5.1773429030.ba0de6e/cmake/test-targets.cmake       
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/cmake/test-targets.cmake       
2026-03-21 14:57:50.000000000 +0100
@@ -11,6 +11,9 @@
     set(CMAKE_CTEST_COMMAND ${CMAKE_CTEST_COMMAND} -V)
 endif ()
 
+# enable parallel tests on CTest level by default
+set(CMAKE_CTEST_ARGUMENTS "--parallel" "0")
+
 # test for install target
 add_test(
     NAME test-installed-files
@@ -31,15 +34,61 @@
 endif ()
 
 # add test for python code style
-find_program(BLACK_PATH black)
-if (BLACK_PATH)
+find_program(RUFF_PATH ruff)
+if (RUFF_PATH)
     add_test(
         NAME test-local-python-style
-        COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/check-python-style" 
"${BLACK_PATH}"
+        COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/check-python-style" 
"${RUFF_PATH}"
         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
     )
 else ()
-    message(STATUS "Set BLACK_PATH to the path of the black executable to 
enable python style checks.")
+    message(STATUS "Set RUFF_PATH to the path of the ruff executable to enable 
python style checks.")
+endif ()
+
+find_program(VULTURE_PATH vulture)
+if (VULTURE_PATH)
+    add_test(
+        NAME test-local-python-code-health
+        COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/check-python-code-health" 
"${VULTURE_PATH}"
+        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+    )
+endif ()
+
+find_program(RADON_PATH radon)
+if (RADON_PATH)
+    add_test(
+        NAME test-local-python-maintainability
+        COMMAND 
"${CMAKE_CURRENT_SOURCE_DIR}/tools/check-python-maintainability" "${RADON_PATH}"
+        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+    )
+endif ()
+
+add_test(
+    NAME test-local-python-conventions
+    COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/check-python-conventions"
+    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+)
+
+find_program(TY_PATH ty)
+if (TY_PATH)
+    add_test(
+        NAME test-local-python-typecheck
+        COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/typecheck-python" 
"${TY_PATH}"
+        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+    )
+endif ()
+
+find_program(PYTEST_PATH pytest)
+if (PYTEST_PATH)
+    add_test(
+        NAME test-python-testsuite
+        COMMAND "${PYTEST_PATH}" -n auto -v --cov --cov-report=xml 
--cov-report=term-missing
+        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+    )
+    # The current python files are data/fake modules for other tests, not 
pytest-runnable tests themselves.
+    # We set this to pass even if no tests are found, to avoid CI failure 
until real tests are added.
+    # pytest returns exit code 5 when no tests are collected.
+    set_tests_properties(test-python-testsuite PROPERTIES 
PASS_REGULAR_EXPRESSION "test session starts")
 endif ()
 
 find_program(SHELLCHECK_PATH shellcheck)
@@ -134,8 +183,8 @@
         USES_TERMINAL
     )
 endif ()
-add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} WORKING_DIRECTORY 
${CMAKE_BINARY_DIR} USES_TERMINAL)
-add_custom_target(check-pkg-build COMMAND ${CMAKE_CTEST_COMMAND} -E 
"test-local-.*" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} USES_TERMINAL)
+add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} 
${CMAKE_CTEST_ARGUMENTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} USES_TERMINAL)
+add_custom_target(check-pkg-build COMMAND ${CMAKE_CTEST_COMMAND} 
${CMAKE_CTEST_ARGUMENTS} -E "test-local-.*" WORKING_DIRECTORY 
${CMAKE_BINARY_DIR} USES_TERMINAL)
 foreach (CUSTOM_TARGET test-perl-testsuite check check-pkg-build)
     add_dependencies(${CUSTOM_TARGET} symlinks)
 endforeach ()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/consoles/VNC.pm 
new/os-autoinst-5.1774101470.e82b4cb/consoles/VNC.pm
--- old/os-autoinst-5.1773429030.ba0de6e/consoles/VNC.pm        2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/consoles/VNC.pm        2026-03-21 
14:57:50.000000000 +0100
@@ -169,7 +169,7 @@
             # qemu) so ignore the first occurrences of a failed
             # connection attempt.
             bmwqemu::fctwarn($error_message) if $err_cnt > 
$connect_failure_limit;
-            sleep 1;
+            sleep($bmwqemu::vars{VNC_CONNECT_SLEEP} // 1);
             next;
         }
         $socket->sockopt(Socket::TCP_NODELAY, 1);    # turn off Naegle's 
algorithm for vnc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/container/os-autoinst_dev/Dockerfile 
new/os-autoinst-5.1774101470.e82b4cb/container/os-autoinst_dev/Dockerfile
--- old/os-autoinst-5.1773429030.ba0de6e/container/os-autoinst_dev/Dockerfile   
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/container/os-autoinst_dev/Dockerfile   
2026-03-21 14:57:50.000000000 +0100
@@ -44,9 +44,16 @@
        pkg-config \
        procps \
        python3-Pillow-tk \
-       python3-black \
        python3-gitlint \
+       python3-pytest \
+       python3-pytest-cov \
+       python3-pytest-mock \
+       python3-pytest-xdist \
+       python3-radon \
+       python3-ruff \
        python3-setuptools \
+       python3-ty \
+       python3-vulture \
        python3-yamllint \
        qemu \
        qemu-tools \
@@ -121,6 +128,7 @@
        'perl(Net::SNMP)' \
        'perl(Net::SSH2)' \
        'perl(POSIX)' \
+       'perl(PPI)' \
        'perl(Perl::Critic)' \
        'perl(Perl::Critic::Community)' \
        'perl(Perl::Critic::Policy)' \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/cpanfile 
new/os-autoinst-5.1774101470.e82b4cb/cpanfile
--- old/os-autoinst-5.1773429030.ba0de6e/cpanfile       2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/cpanfile       2026-03-21 
14:57:50.000000000 +0100
@@ -103,6 +103,7 @@
     requires 'Code::TidyAll';
     requires 'Devel::Cover';
     requires 'Module::CPANfile';
+    requires 'PPI';
     requires 'Perl::Tidy', '== 20260204.0.0';
     requires 'Template::Toolkit';
     requires 'Test::CheckGitStatus';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/dependencies.yaml 
new/os-autoinst-5.1774101470.e82b4cb/dependencies.yaml
--- old/os-autoinst-5.1773429030.ba0de6e/dependencies.yaml      2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/dependencies.yaml      2026-03-21 
14:57:50.000000000 +0100
@@ -100,6 +100,7 @@
   perl(Module::CPANfile):
   perl(Template::Toolkit):
   perl(Perl::Tidy): == 20260204.0.0
+  perl(PPI):
   perl(Test::CheckGitStatus):
   shfmt:
 
@@ -121,7 +122,10 @@
   perl(Perl::Critic::Utils):
 
 python_style_requires:
-  python3-black:
+  python3-ruff:
+  python3-vulture:
+  python3-radon:
+  python3-ty:
 
 python_support_requires:
   perl(Inline::Python):
@@ -180,6 +184,10 @@
   '%test_non_s390_requires':
   '%python_support_requires':
   '%lua_support_requires':
+  python3-pytest:
+  python3-pytest-cov:
+  python3-pytest-mock:
+  python3-pytest-xdist:
   python3-gitlint:
   python3-Pillow-tk:
   ffmpeg:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/dist/rpm/os-autoinst.spec 
new/os-autoinst-5.1774101470.e82b4cb/dist/rpm/os-autoinst.spec
--- old/os-autoinst-5.1773429030.ba0de6e/dist/rpm/os-autoinst.spec      
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/dist/rpm/os-autoinst.spec      
2026-03-21 14:57:50.000000000 +0100
@@ -92,7 +92,7 @@
 %endif
 %if %{with black}
 # The following line is generated from dependencies.yaml
-%define python_style_requires python3-black
+%define python_style_requires python3-radon python3-ruff python3-ty 
python3-vulture
 %else
 %define python_style_requires %{nil}
 %endif
@@ -121,7 +121,7 @@
 # The following line is generated from dependencies.yaml
 %define test_version_only_requires perl(Mojo::IOLoop::ReadWriteProcess) >= 0.28
 # The following line is generated from dependencies.yaml
-%define test_requires %build_requires %lua_support_requires %ocr_requires 
%python_support_requires %spellcheck_requires %test_base_requires 
%test_non_s390_requires %yamllint_requires ffmpeg python3-Pillow-tk 
python3-gitlint
+%define test_requires %build_requires %lua_support_requires %ocr_requires 
%python_support_requires %spellcheck_requires %test_base_requires 
%test_non_s390_requires %yamllint_requires ffmpeg python3-Pillow-tk 
python3-gitlint python3-pytest python3-pytest-cov python3-pytest-mock 
python3-pytest-xdist
 %ifnarch s390x
 # The following line is generated from dependencies.yaml
 %define devel_non_s390_requires ShellCheck
@@ -129,7 +129,7 @@
 %define devel_non_s390_requires %{nil}
 %endif
 # The following line is generated from dependencies.yaml
-%define devel_requires %devel_non_s390_requires %python_style_requires 
%test_requires file perl(Code::TidyAll) perl(Devel::Cover) 
perl(Module::CPANfile) perl(Perl::Tidy) perl(Template::Toolkit) 
perl(Test::CheckGitStatus) sed shfmt
+%define devel_requires %devel_non_s390_requires %python_style_requires 
%test_requires file perl(Code::TidyAll) perl(Devel::Cover) 
perl(Module::CPANfile) perl(PPI) perl(Perl::Tidy) perl(Template::Toolkit) 
perl(Test::CheckGitStatus) sed shfmt
 %define s390_zvm_requires /usr/bin/xkbcomp /usr/bin/Xvnc x3270 icewm xterm 
xterm-console xdotool fonts-config mkfontdir mkfontscale openssh-clients
 %define ipmi_requires ipmitool
 %define qemu_requires qemu-tools e2fsprogs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/doc/backend_vars.md 
new/os-autoinst-5.1774101470.e82b4cb/doc/backend_vars.md
--- old/os-autoinst-5.1773429030.ba0de6e/doc/backend_vars.md    2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/doc/backend_vars.md    2026-03-21 
14:57:50.000000000 +0100
@@ -54,6 +54,7 @@
 | DEFAULT_DCLICK_SLEEP | float | 0.10 | Default double/triple click time in 
seconds (both press time and interval between clicks) |
 | GIT_CACHE_DIR | string |  | If set enables locally caching Git repositories 
in the specified directory when handling Git URLs in variables like `CASEDIR` 
and wheels |
 | ENABLE_MODERN_PERL_FEATURES | boolean | 0 | Enables use of modern Perl 
features in test modules avoiding the need to use e.g. `use Mojo::Base 
'basetest', -signatures;` in all test modules. This variable must be set before 
invoking `autotest::loadtest`. It only applies to the test modules themselves. 
It does *not* apply to e.g. `main.pm` and other Perl modules used via e.g. `use 
some::module`. |
+| _HIDE_SECRETS_REGEX | string |  | If set, any test variables whose **NAME** 
(key) matches the specified regular expression, in addition to the default 
'^_SECRET_' and '_PASSWORD', are excluded from being saved into vars.json or 
further processing. For example, to hide all variables starting with 
'SCC_REGCODE', use '^SCC_REGCODE'. |
 |  |
 
 ## ZVM backend
@@ -190,6 +191,7 @@
 | TAPSCRIPT |  |  | Script used during the backend network creation |
 | TESTDEBUG | boolean | 0 | Enable test debugging: override 'milestone' and 
'fatal' test flags to 1. Snapshot are created after each successful test module 
and each fail aborts test run |
 | UEFI | boolean | 0 | Enable UEFI |
+| UEFI_SECURE_BOOT | boolean | 1 | Whether the auto-selection of 
`UEFI_PFLASH_CODE` and `UEFI_PFLASH_VARS` should use firmware with SecureBoot 
enabled |
 | UEFI_PFLASH_CODE | string |  | Specify the file name of the UEFI firmware 
code which will be loaded onto a read-only PFLASH drive |
 | UEFI_PFLASH_VARS | string |  | Specify the file name which contains the UEFI 
firmware variables which will be loaded onto a mutable PFLASH drive |
 | PUBLISH_PFLASH_VARS | string |  | Specify the file name to publish the UEFI 
vars file as |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml
 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml
--- 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml
  2026-03-13 20:10:30.000000000 +0100
+++ 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml
  2026-03-21 14:57:50.000000000 +0100
@@ -1,57 +1,19 @@
 ---
 name: 'Commit message check'
-
 on:
-  workflow_call:
-    secrets:
-      accessToken:
-        required: true
+  pull_request:
+  push:
+    branches:
+      - '!master'
 
 jobs:
-  base-check-commit-message:
-    name: Check commit message
+  check-commit-message:
     runs-on: ubuntu-latest
     steps:
-      - name: Check subject beginning
-        uses: gsactions/commit-message-checker@v2
-        with:
-          pattern: '^([A-Z]|\S+:|git subrepo (clone|pull))'
-          flags: 'g'
-          error: 'The subject does not start with a capital or tag.'
-          excludeDescription: 'true'
-          excludeTitle: 'true'
-          checkAllCommitMessages: 'true'
-          accessToken: ${{ secrets.accessToken }}
-
-      - name: Check subject line length
-        uses: gsactions/commit-message-checker@v2
-        with:
-          pattern: '^(Revert "?)?.{1,72}(\n|$)'
-          flags: 'g'
-          error: 'The maximum subject line length of 72 characters is 
exceeded.'
-          excludeDescription: 'true'
-          excludeTitle: 'true'
-          checkAllCommitMessages: 'true'
-          accessToken: ${{ secrets.accessToken }}
-
-      - name: Check subject ending
-        uses: gsactions/commit-message-checker@v2
-        with:
-          pattern: '^.+(?<!\.)(\n|$)'
-          flags: 'g'
-          error: 'The subject cannot not end with a dot.'
-          excludeDescription: 'true'
-          excludeTitle: 'true'
-          checkAllCommitMessages: 'true'
-          accessToken: ${{ secrets.accessToken }}
-
-      - name: Check empty line
-        uses: gsactions/commit-message-checker@v2
+      - uses: actions/checkout@v4
         with:
-          pattern: '^.*(\n\n|$)'
-          flags: 'g'
-          error: 'No newline between title and description.'
-          excludeDescription: 'true'
-          excludeTitle: 'true'
-          checkAllCommitMessages: 'true'
-          accessToken: ${{ secrets.accessToken }}
+          fetch-depth: 0
+      - name: Install gitlint
+        run: pip install gitlint-core
+      - name: Check commit messages
+        run: gitlint --commits origin/${{ github.base_ref }}..HEAD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.github/workflows/commit-message-checker.yml
 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.github/workflows/commit-message-checker.yml
--- 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.github/workflows/commit-message-checker.yml
       2026-03-13 20:10:30.000000000 +0100
+++ 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.github/workflows/commit-message-checker.yml
       2026-03-21 14:57:50.000000000 +0100
@@ -10,6 +10,4 @@
 
 jobs:
   check-commit-message:
-    secrets:
-      accessToken: "${{ secrets.GITHUB_TOKEN }}"
     uses: ./.github/workflows/base-commit-message-checker.yml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.github/workflows/perl-critic.yml
 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.github/workflows/perl-critic.yml
--- 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.github/workflows/perl-critic.yml
  2026-03-13 20:10:30.000000000 +0100
+++ 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.github/workflows/perl-critic.yml
  1970-01-01 01:00:00.000000000 +0100
@@ -1,14 +0,0 @@
----
-name: 'Perl critic'
-
-on: [push, pull_request]
-
-jobs:
-  perl-critic-checks:
-    runs-on: ubuntu-latest
-    name: "Perlcritic"
-    container:
-      image: perldocker/perl-tester
-    steps:
-      - uses: actions/checkout@v4
-      - run: make test-critic
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.gitlint 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.gitlint
--- old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.gitlint   
1970-01-01 01:00:00.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.gitlint   
2026-03-21 14:57:50.000000000 +0100
@@ -0,0 +1,14 @@
+[general]
+contrib=contrib-title-conventional-commits
+ignore=body-min-length,body-is-missing
+regex-style-search=True
+
+[ignore-body-lines]
+# Accept lines stating only a long unwrappable URL
+regex=^https?:\/\/\S+$
+
+[ignore-by-title]
+# "git subrepo" creates automatic, non-conventional commits we need to accept
+# https://progress.opensuse.org/issues/198254
+regex=^git subrepo pull
+ignore=all
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.gitrepo 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.gitrepo
--- old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.gitrepo   
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.gitrepo   
2026-03-21 14:57:50.000000000 +0100
@@ -6,7 +6,7 @@
 [subrepo]
        remote = [email protected]:os-autoinst/os-autoinst-common.git
        branch = master
-       commit = 2063219ce4e3a3c10ea61e21d0ad8864121bb401
-       parent = 6a80a850796cb8b029e882b61519549d3855066f
+       commit = 8fffc1f59746ae5d409964a653165b3c8840d0ff
+       parent = 89cbbf404e53727ecfaf8515d6e4f7d6a0c9dfa3
        method = merge
        cmdver = 0.4.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.pre-commit-config.yaml
 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.pre-commit-config.yaml
--- 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/.pre-commit-config.yaml
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/.pre-commit-config.yaml
    2026-03-21 14:57:50.000000000 +0100
@@ -0,0 +1,6 @@
+repos:
+  - repo: https://github.com/jorisroovers/gitlint
+    rev: v0.19.1
+    hooks:
+      - id: gitlint
+        stages: [commit-msg]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/Makefile 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/Makefile
--- old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/Makefile   
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/Makefile   
2026-03-21 14:57:50.000000000 +0100
@@ -1,31 +1,42 @@
+all: help
+
 .PHONY: help
-help:
-       @echo Call one of the available targets:
-       @sed -n 's/\(^[^.#[:space:]A-Z]*\):.*$$/\1/p' Makefile | uniq
+help: ## Display this help
+       @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN 
{FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
 
 .PHONY: update-deps
-update-deps:
+update-deps: ## Update dependencies
        tools/update-deps --cpanfile cpanfile
 
+.PHONY: setup-hooks
+setup-hooks: ## Install pre-commit git hooks
+       pre-commit install --install-hooks -t commit-msg -t pre-commit
+
+.PHONY: test-checkstyle
+test-checkstyle: test-tidy test-yaml test-gitlint ## Run checkstyle checks
+
 .PHONY: test
-test: test-tidy test-critic test-yaml test-author test-t
+test: test-checkstyle test-author test-t ## Run all tests
 
 .PHONY: test-tidy
-test-tidy:
+test-tidy: ## Run tidyall checks
        tools/tidyall --all --check-only
 
-.PHONY: test-critic
-test-critic:
-       tools/perlcritic --quiet .
-
 .PHONY: test-yaml
-test-yaml:
+test-yaml: ## Run yamllint checks
        yamllint --strict ./
 
+.PHONY: test-gitlint
+test-gitlint: ## Run gitlint checks
+       @which gitlint >/dev/null 2>&1 || (echo "Command 'gitlint' not found, 
can not execute commit message checks. Install with 'python3-gitlint' 
(openSUSE) or 'pip install gitlint-core'" && false)
+       @BASES=$$(for i in upstream/master upstream/main origin/master 
origin/main master main; do git rev-parse --verify $$i 2>/dev/null; done ||:); \
+       BASE=$$(git merge-base --independent $$BASES | head -n 1); \
+       gitlint --commits "$$BASE..HEAD"
+
 .PHONY: test-author
-test-author:
+test-author: ## Run author tests
        prove -l -r xt/
 
 .PHONY: test-t
-test-t:
+test-t: ## Run unit tests
        prove -l -r t/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/README.md 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/README.md
--- old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/README.md  
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/README.md  
2026-03-21 14:57:50.000000000 +0100
@@ -63,6 +63,11 @@
   subtree](https://github.com/ingydotnet/git-subrepo/blob/master/Intro.pod)
 
 
+## Development
+
+One especially useful make target for developers is `make setup-hooks` which
+installs git pre-commit hooks to check commit styles.
+
 ## License
 
 This project is licensed under the MIT license, see LICENSE file for details.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/cpanfile 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/cpanfile
--- old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/cpanfile   
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/cpanfile   
2026-03-21 14:57:50.000000000 +0100
@@ -18,6 +18,7 @@
     requires 'Perl::Critic';
     requires 'Perl::Critic::Community';
     requires 'Perl::Tidy', '== 20260204';
+    requires 'Test::Perl::Critic';
 
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/dependencies.yaml
 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/dependencies.yaml
--- 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/dependencies.yaml
  2026-03-13 20:10:30.000000000 +0100
+++ 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/dependencies.yaml
  2026-03-21 14:57:50.000000000 +0100
@@ -21,6 +21,8 @@
   perl(Code::TidyAll):
   perl(Perl::Critic):
   perl(Perl::Critic::Community):
+  perl(Test::Perl::Critic):
+  python3-gitlint:
 
 cover_requires:
   perl(Devel::Cover):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/tools/prove_wrapper
 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/tools/prove_wrapper
--- 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/tools/prove_wrapper
        2026-03-13 20:10:30.000000000 +0100
+++ 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/tools/prove_wrapper
        2026-03-21 14:57:50.000000000 +0100
@@ -21,7 +21,7 @@
   /^All tests successful\./,$d
 ' "$OUTPUT" > "$OUTPUT.processed"
 
-UNHANDLED=$(grep -vE '^t/.*([0-9]{2}-|)([[:alnum:]]|_|-)+\.t \.+' 
"$OUTPUT.processed" || true)
+UNHANDLED=$(grep -vE '^(x?t|t/compile)/.*([0-9]{2}-|)([[:alnum:]]|_|-)+\.t 
\.+' "$OUTPUT.processed" || true)
 
 if [ -n "$UNHANDLED" ]; then
     echo "not ok - unhandled output found"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/xt/02-perlcritic.t
 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/xt/02-perlcritic.t
--- 
old/os-autoinst-5.1773429030.ba0de6e/external/os-autoinst-common/xt/02-perlcritic.t
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/os-autoinst-5.1774101470.e82b4cb/external/os-autoinst-common/xt/02-perlcritic.t
 2026-03-21 14:57:50.000000000 +0100
@@ -0,0 +1,28 @@
+#!/usr/bin/env perl
+# Copyright SUSE LLC
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+use Test::Most;
+use experimental 'signatures';
+# See xt/01-comple-check-all.t for ":no_end_test" here
+use Test::Warnings qw(:no_end_test :report_warnings);
+use FindBin '$Bin';
+use File::Spec;
+
+sub extra_include_paths (@extra_paths) {
+    my @paths = map { ("$Bin/../$_", "$Bin/../external/os-autoinst-common/$_") 
} @extra_paths;
+    return grep { -e $_ } map { File::Spec->rel2abs($_) } @paths;
+}
+
+BEGIN {
+    unshift @INC, extra_include_paths('lib', 'lib/perlcritic');
+}
+use OpenQA::Test::TimeLimit '90';
+
+use Test::Perl::Critic (-profile => '.perlcriticrc');
+Test::Perl::Critic::all_critic_ok(
+    grep { -e $_ }
+      qw(lib xt OpenQA backend consoles container script tools),
+    glob('*.pm'),
+    grep { !/t\/(data|fake)\// } glob('t/*.t t/*.pm t/*/*.t t/*/*.pm')
+);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/pyproject.toml 
new/os-autoinst-5.1774101470.e82b4cb/pyproject.toml
--- old/os-autoinst-5.1773429030.ba0de6e/pyproject.toml 2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/pyproject.toml 2026-03-21 
14:57:50.000000000 +0100
@@ -1,2 +1,115 @@
-[tool.black]
+[tool.ruff]
 line-length = 120
+preview = true
+
+[tool.ruff.lint]
+# E, F: Standard pycodestyle and Pyflakes (default flake8)
+# D: pydocstyle (for D100, D101, etc.)
+# Q: flake8-quotes (for Q000)
+# PL: Pylint
+extend-select =[
+    "E", "F", "D", "Q", "PL",
+    "T100", # https://docs.astral.sh/ruff/rules/#flake8-debugger-t10
+    "T2", # https://docs.astral.sh/ruff/rules/#flake8-print-t20
+    "TD", # https://docs.astral.sh/ruff/rules/#flake8-todos-td
+    "W",
+    "I", # https://docs.astral.sh/ruff/rules/#isort-i
+    "ERA",
+    "B",
+    "SIM",
+    "C4",
+    "T10",
+    "FIX",
+    "ISC",
+    "ICN",
+    "INP",
+    "PIE",
+    "T20",
+    "RSE",
+    "RET",
+    "SLF",
+    "FURB",
+    "EXE",
+    "BLE",
+    "A",
+    "DTZ",
+    "LOG",
+    "G",
+    "C90",
+    "PERF",
+    "PGH",
+    "ARG",
+    "RUF",
+    "ANN",
+    "S", # https://docs.astral.sh/ruff/rules/#flake8-bandit-s
+    "FBT", # https://docs.astral.sh/ruff/rules/#flake8-boolean-trap-fbt
+    "TRY", # https://docs.astral.sh/ruff/rules/#tryceratops-try
+    "DOC", # https://docs.astral.sh/ruff/rules/#pydoclint-doc
+    "YTT", # https://docs.astral.sh/ruff/rules/#flake8-2020-ytt
+    "ASYNC", # https://docs.astral.sh/ruff/rules/#flake8-async-async
+    "COM", # https://docs.astral.sh/ruff/rules/#flake8-commas-com
+    "CPY", # https://docs.astral.sh/ruff/rules/#flake8-copyright-cpy
+    "EM", # https://docs.astral.sh/ruff/rules/#flake8-errmsg-em
+    "INT", # https://docs.astral.sh/ruff/rules/#flake8-gettext-int
+    "PYI", # https://docs.astral.sh/ruff/rules/#flake8-pyi-pyi
+    "PT", # https://docs.astral.sh/ruff/rules/#flake8-pytest-style-pt
+    "SLOT", # https://docs.astral.sh/ruff/rules/#flake8-slots-slot
+    "TID", # https://docs.astral.sh/ruff/rules/#flake8-tidy-imports-tid
+    "TC", # https://docs.astral.sh/ruff/rules/#flake8-type-checking-tc
+    "PTH", # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth
+    "FLY", # https://docs.astral.sh/ruff/rules/#flynt-fly
+    "NPY", # https://docs.astral.sh/ruff/rules/#numpy-specific-rules-npy
+    "PD", # https://docs.astral.sh/ruff/rules/#pandas-vet-pd
+    "N", # https://docs.astral.sh/ruff/rules/#pep8-naming-n
+    "PLE", # https://docs.astral.sh/ruff/rules/#error-ple
+    "PLR", # https://docs.astral.sh/ruff/rules/#refactor-plr
+    "PLW", # https://docs.astral.sh/ruff/rules/#warning-plw
+    "FA", # https://docs.astral.sh/ruff/rules/#flake8-future-annotations-fa
+    "UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up
+]
+
+ignore = [
+    "D203",   # incorrect-blank-line-before-class
+    "PLC1802", # use-implicit-booleaness-not-len
+    "D213", # multi-line-summary-second-line
+    "PLR0904", # too-many-public-methods
+    "DOC201", # docstring-missing-returns
+    "DOC501", # docstring-missing-exception
+    "COM812", # missing-trailing-comma
+]
+
+[tool.ruff.lint.mccabe]
+max-complexity = 10
+
+[tool.ruff.lint.per-file-ignores]
+"t/**/*" = ["PLR2004", "ANN401", "PLR0913", "S101", "S105", "S106", "PLR0917", 
"D103", "D100", "CPY001", "T201", "INP001", "F403", "F405", "ANN", "E402", 
"ARG001", "TRY002", "TRY003", "EM101", "C406", "RUF100"]
+"script/crop.py" = ["D100", "D101", "D102", "D103", "D107", "ANN", "T201", 
"PTH119", "PLW1514", "SIM115", "C901", "PLR6104", "SIM102", "PLW0602", 
"PLW0603", "UP031", "A001", "PLC0415", "ARG001", "PLR2004"]
+
+[tool.ruff.format]
+# Enable reformatting of code snippets in docstrings.
+docstring-code-format = true
+
+[tool.ruff.lint.flake8-copyright]
+author = "SUSE LLC"
+notice-rgx = "Copyright"
+
+[tool.ruff.lint.flake8-tidy-imports.banned-api]
+"os.system".msg = "Use `subprocess.run` or `sh` library instead."
+"subprocess.call".msg = "Use `subprocess.run` with `check=True`."
+
+[tool.coverage.run]
+branch = true
+
+[tool.coverage.report]
+fail_under = 0
+show_missing = true
+skip_covered = true
+
+[tool.pytest.ini_options]
+addopts = "-p no:anyio -p no:doctest -p no:pastebin -p no:nose"
+testpaths = ["t"]
+python_files = "*.py"
+norecursedirs = ["t/data", "t/fake"]
+
+[tool.ty.terminal]
+error-on-warning = true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/script/crop.py 
new/os-autoinst-5.1774101470.e82b4cb/script/crop.py
--- old/os-autoinst-5.1773429030.ba0de6e/script/crop.py 2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/script/crop.py 2026-03-21 
14:57:50.000000000 +0100
@@ -1,14 +1,16 @@
 #!/usr/bin/env python3
-# Copyright 2013-2016 SUSE LLC
+# Copyright SUSE LLC
 # SPDX-License-Identifier: MIT
 
-from tkinter import Tk, Canvas, NW
-from PIL import Image, ImageTk
 import json
 import optparse
-import sys
+import pathlib
 import shutil
+import sys
 from os.path import basename
+from tkinter import NW, Canvas, Tk
+
+from PIL import Image, ImageTk
 
 parser = optparse.OptionParser()
 parser.add_option("--new", metavar="NAME", help="create new")
@@ -27,7 +29,7 @@
     }""")
 elif filename.endswith(".json"):
     png = filename[0 : len(filename) - len(".json")] + ".png"
-    needle = json.load(open(filename))
+    needle = json.load(pathlib.Path(filename).open())
 
 else:
     print("Error: needs to end in .png or .json")
@@ -120,7 +122,7 @@
     print("highlighting %d" % rect)
 
     area = needle["area"][rect]
-    for r in range(0, len(uiareas)):
+    for r in range(len(uiareas)):
         color = "green"
         if r == rect:
             color = "cyan"
@@ -195,7 +197,7 @@
     del needle["area"][rect]
     uiareas[rect].destroy()
     a = []
-    for r in range(0, len(uiareas)):
+    for r in range(len(uiareas)):
         if r == rect:
             continue
         a.append(uiareas[r])
@@ -239,7 +241,7 @@
         pat = environ["CASEDIR"] + "/needles/%s.%s"
         shutil.copyfile(png, pat % (options.new, "png"))
         filename = pat % (options.new, "json")
-    json.dump(needle, open(filename, "w"), sort_keys=True, indent=4, 
separators=(",", ": "))
+    json.dump(needle, pathlib.Path(filename).open("w"), sort_keys=True, 
indent=4, separators=(",", ": "))
     print("saved %s" % filename)
     master.quit()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/snd2png/test.png.md5.original 
new/os-autoinst-5.1774101470.e82b4cb/snd2png/test.png.md5.original
--- old/os-autoinst-5.1773429030.ba0de6e/snd2png/test.png.md5.original  
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/snd2png/test.png.md5.original  
2026-03-21 14:57:50.000000000 +0100
@@ -1 +1 @@
-095090d5fe045a3c09dae216ccd23a26  test.png
+b52bc7078f88da4684c12956af7be618  test.pnm
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/t/08-autotest.t 
new/os-autoinst-5.1774101470.e82b4cb/t/08-autotest.t
--- old/os-autoinst-5.1773429030.ba0de6e/t/08-autotest.t        2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/t/08-autotest.t        2026-03-21 
14:57:50.000000000 +0100
@@ -195,6 +195,43 @@
         stderr_like { autotest::run_all } qr/.*stopping overall test execution 
because TESTDEBUG has been set.*/, 'reason logged (TESTDEBUG)';
         delete $bmwqemu::vars{TESTDEBUG};
     };
+    snapshot_subtest 'always_run flag ensures execution after fatal failure' 
=> sub {
+        local %autotest::tests = ();
+        local @autotest::testorder = ();
+        local $autotest::last_milestone = undef;
+        local $autotest::last_milestone_active_consoles = [];
+        local $autotest::activated_consoles = [];
+        local $autotest::last_milestone_console = undef;
+
+        loadtest $_ for qw(fatal start next);
+        my ($fatal_test, $normal_test, $cleanup_test) = @autotest::testorder;
+        $mock_autotest->redefine(query_isotovideo => sub ($command, 
$arguments) {
+                return 1 if $command eq 'backend_can_handle' && 
$arguments->{function} eq 'snapshots';
+                return {snapshot_done => 1} if $command eq 
'backend_make_snapshot';
+                return {};
+        });
+
+        $mock_basetest->redefine(test_flags => sub ($self) {
+                return {fatal => 1} if $self == $fatal_test;
+                return {always_run => 1} if $self == $cleanup_test;
+                return {};
+        });
+        $mock_basetest->redefine(runtest => sub ($self) {
+                die "fatal failure\n" if $self == $fatal_test;
+                return 1;
+        });
+
+        $vm_stopped = 0;
+        my $output = combined_from { autotest::run_all };
+        like $output, qr/skipping tests-start#?[0-9]* \(after fatal 
failure\)/, 'skipped normal test';
+        like $output, qr/starting next tests\/next\.pm/, 'executed always_run 
cleanup test';
+        ($died, $completed) = get_tests_done;
+        is $died, 0, 'tests not considered died';
+        is $completed, 0, 'tests did not complete successfully';
+        ok $vm_stopped, 'VM was stopped eventually';
+        is $reverts_done, 0, 'no snapshots loaded after fatal failure';
+        is $snapshots_made, 0, 'no snapshots made after fatal failure';
+    };
     $mock_basetest->unmock($_) for qw(runtest test_flags);
     $mock_autotest->unmock($_) for qw(load_snapshot make_snapshot 
query_isotovideo);
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/t/12-bmwqemu.t 
new/os-autoinst-5.1774101470.e82b4cb/t/12-bmwqemu.t
--- old/os-autoinst-5.1773429030.ba0de6e/t/12-bmwqemu.t 2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/t/12-bmwqemu.t 2026-03-21 
14:57:50.000000000 +0100
@@ -125,7 +125,7 @@
 
 subtest 'save_vars no_secret' => sub {
     my $dir = "$data_dir/tests";
-    create_vars({CASEDIR => $dir, _SECRET_TEST => 'my_credentials', 
MY_PASSWORD => 'secret'});
+    create_vars({CASEDIR => $dir, _SECRET_TEST => 'my_credentials', 
MY_PASSWORD => 'secret', SNEAKY_TEXT => 'secret', NOT_SECRET => 'SNEAKY_VAL'});
     $bmwqemu::openqa_default_share = $data_dir;
 
     lives_ok {
@@ -138,6 +138,16 @@
     ok(!$vars{_SECRET_TEST}, '_SECRET_TEST not written to vars.json');
     ok(!$vars{MY_PASSWORD}, 'MY_PASSWORD not written to vars.json');
     is($vars{CASEDIR}, $dir, 'CASEDIR unchanged');
+    is($vars{SNEAKY_TEXT}, 'secret', 'custom text is included by default');
+    is($vars{NOT_SECRET}, 'SNEAKY_VAL', 'variable with matching value but 
non-matching name is included');
+
+    $bmwqemu::vars{_HIDE_SECRETS_REGEX} = '^SNEAKY_';
+    bmwqemu::save_vars(no_secret => 1);
+    %vars = %{read_vars()};
+    ok(!$vars{SNEAKY_TEXT}, 'custom text name matching regex is excluded');
+    is($vars{NOT_SECRET}, 'SNEAKY_VAL', 'matching value but non-matching name 
(due to anchor) is still included');
+    is($vars{CASEDIR}, $dir, 'CASEDIR unchanged if custom text matches 
secret');
+    is($vars{_HIDE_SECRETS_REGEX}, '^SNEAKY_', '_HIDE_SECRETS_REGEX itself is 
preserved');
 };
 
 subtest 'HDD variables sanity check' => sub {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/t/18-backend-qemu.t 
new/os-autoinst-5.1774101470.e82b4cb/t/18-backend-qemu.t
--- old/os-autoinst-5.1773429030.ba0de6e/t/18-backend-qemu.t    2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/t/18-backend-qemu.t    2026-03-21 
14:57:50.000000000 +0100
@@ -436,7 +436,11 @@
     }], 'expected QMP command called for "open_file_and_send_fd_to_qemu"' or 
always_explain $called{handle_qmp_command};
 
     @bmwqemu::ovmf_locations = ('does not exist', "$Bin/$Script", 'does not 
exist either');
+    @bmwqemu::ovmf_locations_no_secure_boot = ('does not exist', 
"$Bin/18-qemu-options.t", 'does not exist either');
     is backend::qemu::find_ovmf, "$Bin/$Script", 'locating ovmf (normally 
"/usr/share/qemu/ovmf-x86_64-ms-code.bin")';
+
+    $bmwqemu::vars{UEFI_SECURE_BOOT} = 0;
+    is backend::qemu::find_ovmf, "$Bin/18-qemu-options.t", 'locating ovmf with 
SecureBoot disabled (normally "/usr/share/qemu/ovmf-x86_64-code.bin")';
 };
 
 subtest 'saving memory dump qemu8' => sub {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/t/47-snd2png.t 
new/os-autoinst-5.1774101470.e82b4cb/t/47-snd2png.t
--- old/os-autoinst-5.1773429030.ba0de6e/t/47-snd2png.t 1970-01-01 
01:00:00.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/t/47-snd2png.t 2026-03-21 
14:57:50.000000000 +0100
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+#
+# Copyright SUSE LLC
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+use Test::Most;
+use Test::Warnings ':report_warnings';
+use FindBin '$Bin';
+use lib "$Bin/../external/os-autoinst-common/lib";
+use OpenQA::Test::TimeLimit '5';
+use Mojo::Base -strict, -signatures;
+use Mojo::File qw(path tempdir);
+
+# ensure a consistent base for relative paths
+chdir "$Bin/..";
+
+my $snd2png = path('snd2png/snd2png');
+ok -x $snd2png, 'snd2png exists and is executable' or BAIL_OUT 'snd2png not 
found, call "make"';
+my $wav = path('snd2png/aplay-captured.wav');
+my $original_md5_file = path('snd2png/test.png.md5.original');
+my $dir = tempdir("/tmp/$FindBin::Script-XXXX");
+my $test_pnm = path($dir, 'test.pnm');
+ok !-e $test_pnm, 'test.pnm does not exist before';
+ok qx{$snd2png $wav $test_pnm 2>&1}, 'snd2png executed with some output';
+is $?, 0, 'snd2png succeeded';
+ok -e $test_pnm, 'test.pnm created';
+my $md5_output = qx{md5sum $test_pnm};
+my ($actual_md5) = $md5_output =~ /^([0-9a-f]+)/;
+my $expected_md5_content = $original_md5_file->slurp;
+my ($expected_md5) = $expected_md5_content =~ /^([0-9a-f]+)/;
+is $actual_md5, $expected_md5, 'md5sum matches original';
+
+done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/t/99-full-stack.t 
new/os-autoinst-5.1774101470.e82b4cb/t/99-full-stack.t
--- old/os-autoinst-5.1773429030.ba0de6e/t/99-full-stack.t      2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/t/99-full-stack.t      2026-03-21 
14:57:50.000000000 +0100
@@ -8,7 +8,7 @@
 
 use FindBin '$Bin';
 use lib "$Bin/../external/os-autoinst-common/lib";
-use OpenQA::Test::TimeLimit '450';
+use OpenQA::Test::TimeLimit '300';
 use Test::Warnings ':report_warnings';
 use File::Basename;
 use Cwd 'abs_path';
@@ -43,6 +43,9 @@
    "VERSION" : "1",
    "SSH_CONNECT_RETRY"  : "2",
    "SSH_CONNECT_RETRY_INTERVAL"  : ".001",
+   "VNC_CONNECT_SLEEP" : "0",
+   "VNC_CONNECT_TIMEOUT_LOCAL" : "0.001",
+   "VNC_CONNECT_TIMEOUT_REMOTE" : "0.001",
    "NAME" : "00001-1-i386@32bit",
    "TEST_NON_STRICT_MODULE": "1",
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/t/fake/tests/faulty.py 
new/os-autoinst-5.1774101470.e82b4cb/t/fake/tests/faulty.py
--- old/os-autoinst-5.1773429030.ba0de6e/t/fake/tests/faulty.py 2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/t/fake/tests/faulty.py 2026-03-21 
14:57:50.000000000 +0100
@@ -1 +1,2 @@
+# ruff: noqa: F401, D100, CPY001, INP001
 import thismoduleshouldnotexist
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1773429030.ba0de6e/testapi.pm 
new/os-autoinst-5.1774101470.e82b4cb/testapi.pm
--- old/os-autoinst-5.1773429030.ba0de6e/testapi.pm     2026-03-13 
20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/testapi.pm     2026-03-21 
14:57:50.000000000 +0100
@@ -729,8 +729,10 @@
 
 Set test variable C<$variable> to value C<$value>.
 
-Variables starting with C<_SECRET_> or including C<_PASSWORD> will not appear
-in the C<vars.json> file.
+Variables starting with C<_SECRET_>, including C<_PASSWORD>, or whose **NAME** 
(key)
+matches a custom regular expression in the test variable
+C<_HIDE_SECRETS_REGEX> will not appear in the C<vars.json> file. For example,
+to hide all variables starting with 'SCC_REGCODE', use '^SCC_REGCODE'.
 
 Specify a true value for the C<reload_needles> flag to trigger a reloading
 of needles in the backend and call the cleanup handler with the new variables
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/tools/check-bash-scripts 
new/os-autoinst-5.1774101470.e82b4cb/tools/check-bash-scripts
--- old/os-autoinst-5.1773429030.ba0de6e/tools/check-bash-scripts       
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/tools/check-bash-scripts       
2026-03-21 14:57:50.000000000 +0100
@@ -1,4 +1,5 @@
 #!/bin/sh -e
 executable=$1
 path=$2
-"${executable:-shfmt}" -d "${path}"
+# shellcheck disable=SC2046
+"${executable:-shfmt}" -d $("${executable:-shfmt}" -f "${path}" | grep -v 
"${path}/local/")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/tools/check-python-code-health 
new/os-autoinst-5.1774101470.e82b4cb/tools/check-python-code-health
--- old/os-autoinst-5.1773429030.ba0de6e/tools/check-python-code-health 
1970-01-01 01:00:00.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/tools/check-python-code-health 
2026-03-21 14:57:50.000000000 +0100
@@ -0,0 +1,6 @@
+#!/bin/sh -e
+# fall back to find if there is no git, e.g. in package builds
+# shellcheck disable=SC2046
+VULTURE="${1:-vulture}"
+set -- $(git ls-files "*.py" 2> /dev/null || find . -name '*.py')
+"$VULTURE" "$@" --min-confidence 80 --exclude t/fake/tests/faulty.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/tools/check-python-conventions 
new/os-autoinst-5.1774101470.e82b4cb/tools/check-python-conventions
--- old/os-autoinst-5.1773429030.ba0de6e/tools/check-python-conventions 
1970-01-01 01:00:00.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/tools/check-python-conventions 
2026-03-21 14:57:50.000000000 +0100
@@ -0,0 +1,7 @@
+#!/bin/sh -e
+# Check for banned coding patterns (e.g. @patch decorator)
+if git grep -nE '^\s*@(unittest\.mock\.|mock\.)?patch' t/ 2> /dev/null; then
+    echo "Error: @patch decorator detected in tests/. Avoid to prevent 
argument ordering bugs."
+    echo "   Fix: Use the 'mocker' fixture (pytest-mock) or a 'with patch():' 
context manager."
+    exit 1
+fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/tools/check-python-maintainability 
new/os-autoinst-5.1774101470.e82b4cb/tools/check-python-maintainability
--- old/os-autoinst-5.1773429030.ba0de6e/tools/check-python-maintainability     
1970-01-01 01:00:00.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/tools/check-python-maintainability     
2026-03-21 14:57:50.000000000 +0100
@@ -0,0 +1,6 @@
+#!/bin/sh -e
+# fall back to find if there is no git, e.g. in package builds
+# shellcheck disable=SC2046
+RADON="${1:-radon}"
+set -- $(git ls-files "*.py" 2> /dev/null || find . -name '*.py')
+"$RADON" mi "$@" -n B | (! grep ".")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/tools/check-python-style 
new/os-autoinst-5.1774101470.e82b4cb/tools/check-python-style
--- old/os-autoinst-5.1773429030.ba0de6e/tools/check-python-style       
2026-03-13 20:10:30.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/tools/check-python-style       
2026-03-21 14:57:50.000000000 +0100
@@ -1,4 +1,7 @@
 #!/bin/sh -e
 # fall back to find if there is no git, e.g. in package builds
 # shellcheck disable=SC2046
-"${1:-black}" --fast --check --diff $(git ls-files "*.py" 2> /dev/null || find 
. -name '*.py')
+RUFF="${1:-ruff}"
+set -- $(git ls-files "*.py" 2> /dev/null || find . -name '*.py')
+"$RUFF" check "$@"
+"$RUFF" format --check "$@"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1773429030.ba0de6e/tools/typecheck-python 
new/os-autoinst-5.1774101470.e82b4cb/tools/typecheck-python
--- old/os-autoinst-5.1773429030.ba0de6e/tools/typecheck-python 1970-01-01 
01:00:00.000000000 +0100
+++ new/os-autoinst-5.1774101470.e82b4cb/tools/typecheck-python 2026-03-21 
14:57:50.000000000 +0100
@@ -0,0 +1,3 @@
+#!/bin/sh -e
+TY="${1:-ty}"
+$TY check || true

++++++ os-autoinst.obsinfo ++++++
--- /var/tmp/diff_new_pack.NS5ZFq/_old  2026-03-23 17:15:28.742941850 +0100
+++ /var/tmp/diff_new_pack.NS5ZFq/_new  2026-03-23 17:15:28.750942182 +0100
@@ -1,5 +1,5 @@
 name: os-autoinst
-version: 5.1773429030.ba0de6e
-mtime: 1773429030
-commit: ba0de6e4da8fdf07f8c95446e117c1dab2e25eb1
+version: 5.1774101470.e82b4cb
+mtime: 1774101470
+commit: e82b4cba721a6c42070988eb68956999147a686b
 

Reply via email to