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-04-22 16:57:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/os-autoinst (Old)
 and      /work/SRC/openSUSE:Factory/.os-autoinst.new.11940 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "os-autoinst"

Wed Apr 22 16:57:50 2026 rev:589 rq:1348576 version:5.1776765124.5d91657

Changes:
--------
--- /work/SRC/openSUSE:Factory/os-autoinst/os-autoinst.changes  2026-04-15 
16:07:19.033774388 +0200
+++ /work/SRC/openSUSE:Factory/.os-autoinst.new.11940/os-autoinst.changes       
2026-04-22 16:58:23.777021312 +0200
@@ -1,0 +2,12 @@
+Tue Apr 21 09:52:15 UTC 2026 - [email protected]
+
+- Update to version 5.1776765124.5d91657:
+  * feat: fail explicitly if always_rollback is not supported
+  * feat: add unique hash to pretty serial markers
+  * feat: include executed command in step details and serial markers
+  * docs: explain assert_screen semantics with multiple tags
+  * feat(debugviewer): Move to /usr/lib
+  * feat(snd2png): Move to /usr/lib
+  * feat: Prefer modules in CASEDIR/lib over test module paths
+
+-------------------------------------------------------------------

Old:
----
  os-autoinst-5.1776179508.bd2644d.obscpio

New:
----
  os-autoinst-5.1776765124.5d91657.obscpio

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

Other differences:
------------------
++++++ os-autoinst-devel-test.spec ++++++
--- /var/tmp/diff_new_pack.GFx1Q2/_old  2026-04-22 16:58:25.229081399 +0200
+++ /var/tmp/diff_new_pack.GFx1Q2/_new  2026-04-22 16:58:25.233081564 +0200
@@ -18,7 +18,7 @@
 
 %define         short_name os-autoinst-devel
 Name:           %{short_name}-test
-Version:        5.1776179508.bd2644d
+Version:        5.1776765124.5d91657
 Release:        0
 Summary:        Test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ os-autoinst-openvswitch-test.spec ++++++
--- /var/tmp/diff_new_pack.GFx1Q2/_old  2026-04-22 16:58:25.289083881 +0200
+++ /var/tmp/diff_new_pack.GFx1Q2/_new  2026-04-22 16:58:25.293084047 +0200
@@ -19,7 +19,7 @@
 %define name_ext -test
 %define         short_name os-autoinst-openvswitch
 Name:           %{short_name}%{?name_ext}
-Version:        5.1776179508.bd2644d
+Version:        5.1776765124.5d91657
 Release:        0
 Summary:        test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ os-autoinst-test.spec ++++++
--- /var/tmp/diff_new_pack.GFx1Q2/_old  2026-04-22 16:58:25.333085702 +0200
+++ /var/tmp/diff_new_pack.GFx1Q2/_new  2026-04-22 16:58:25.337085868 +0200
@@ -19,7 +19,7 @@
 %define name_ext -test
 %define         short_name os-autoinst
 Name:           %{short_name}%{?name_ext}
-Version:        5.1776179508.bd2644d
+Version:        5.1776765124.5d91657
 Release:        0
 Summary:        test package for os-autoinst
 License:        GPL-2.0-or-later

++++++ os-autoinst.spec ++++++
--- /var/tmp/diff_new_pack.GFx1Q2/_old  2026-04-22 16:58:25.401088516 +0200
+++ /var/tmp/diff_new_pack.GFx1Q2/_new  2026-04-22 16:58:25.405088681 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           os-autoinst
-Version:        5.1776179508.bd2644d
+Version:        5.1776765124.5d91657
 Release:        0
 Summary:        OS-level test automation
 License:        GPL-2.0-or-later
@@ -326,6 +326,8 @@
 %defattr(-,root,root)
 %{_docdir}/os-autoinst
 %dir %{_prefix}/lib/os-autoinst
+%{_prefix}/lib/os-autoinst/debugviewer
+%{_prefix}/lib/os-autoinst/snd2png
 %{_prefix}/lib/os-autoinst/videoencoder
 %{_prefix}/lib/os-autoinst/basetest.pm
 #

++++++ os-autoinst-5.1776179508.bd2644d.obscpio -> 
os-autoinst-5.1776765124.5d91657.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/.github/workflows/ci.yml 
new/os-autoinst-5.1776765124.5d91657/.github/workflows/ci.yml
--- old/os-autoinst-5.1776179508.bd2644d/.github/workflows/ci.yml       
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/.github/workflows/ci.yml       
2026-04-21 11:52:04.000000000 +0200
@@ -24,7 +24,7 @@
           verbose: true
       - run: |
           tar cvf coverage.tar build/cover_db
-      - uses: actions/upload-artifact@v4
+      - uses: actions/upload-artifact@v7
         with:
           name: coverage
           path: coverage.tar
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/Interface.pm 
new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/Interface.pm
--- old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/Interface.pm 
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/Interface.pm 
2026-04-21 11:52:04.000000000 +0200
@@ -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 = 51;
+our $version = 52;
 
 # 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.1776179508.bd2644d/OpenQA/Isotovideo/LLMAnalysis.pm 
new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/LLMAnalysis.pm
--- old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/LLMAnalysis.pm       
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/LLMAnalysis.pm       
2026-04-21 11:52:04.000000000 +0200
@@ -124,7 +124,7 @@
         $output = query_llm_api($prompt, $url, $model);
     }
     path("$result_dir/llm-failure-analysis.txt")->spew($output);
-    bmwqemu::diag("LLM Analysis complete. Saved to 
$result_dir/llm-failure-analysis.txt");
+    bmwqemu::diag("LLM Analysis:\n$output\nSaved to 
$result_dir/llm-failure-analysis.txt");
 }
 
 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/Utils.pm 
new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/Utils.pm
--- old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/Utils.pm     
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/Utils.pm     
2026-04-21 11:52:04.000000000 +0200
@@ -439,7 +439,7 @@
 sub spawn_debuggers () {
     my %debugging_tools;
     $debugging_tools{vncviewer} = ['vncviewer', '-viewonly', '-shared', 
"localhost:$bmwqemu::vars{VNC}"] if $ENV{RUN_VNCVIEWER};
-    $debugging_tools{debugviewer} = 
["$bmwqemu::topdir/debugviewer/debugviewer", 'qemuscreenshot/last.png'] if 
$ENV{RUN_DEBUGVIEWER};
+    $debugging_tools{debugviewer} = ["$bmwqemu::topdir/debugviewer", 
'qemuscreenshot/last.png'] if $ENV{RUN_DEBUGVIEWER};
     for my $tool (keys %debugging_tools) {
         my ($stdin, $stdout, $stderr, $ret);
         IPC::Run::run(\@{$debugging_tools{$tool}}, \$stdin, \$stdout, 
\$stderr);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/autotest.pm 
new/os-autoinst-5.1776765124.5d91657/autotest.pm
--- old/os-autoinst-5.1776179508.bd2644d/autotest.pm    2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/autotest.pm    2026-04-21 
11:52:04.000000000 +0200
@@ -188,10 +188,10 @@
         $module_code = "# line 1 $script_path\n";
         $module_code .= path($script_path)->slurp;
     }
-    $code .= "use lib '.';" unless path($casedir)->is_abs;
-    $code .= "use lib '$casedir/lib';";
     my $basename = dirname($script_path);
-    $code .= "use lib '$basename';\n";
+    $code .= "use lib '$basename';";
+    $code .= "use lib '.';" unless path($casedir)->is_abs;
+    $code .= "use lib '$casedir/lib';\n";
     die "Unsupported file extension for '$script'" unless $script =~ 
/\.(p[my]|lua)/;
     if ($script =~ m/\.pm$/) {
         $code .= $module_code // "require '$script_path';";
@@ -536,6 +536,9 @@
     for (my $testindex = 0; $testindex <= $#testorder; $testindex++) {
         my $t = $testorder[$testindex];
         my $flags = $t->test_flags();
+        if ($flags->{always_rollback} && !$snapshots_supported && 
$bmwqemu::vars{FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED}) {
+            die "always_rollback requested but snapshots are not supported by 
the backend\n";
+        }
         my $fullname = $t->{fullname};
 
         if (!$vmloaded && $fullname eq $firsttest) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/basetest.pm 
new/os-autoinst-5.1776765124.5d91657/basetest.pm
--- old/os-autoinst-5.1776179508.bd2644d/basetest.pm    2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/basetest.pm    2026-04-21 
11:52:04.000000000 +0200
@@ -429,12 +429,14 @@
     $self->write_resultfile($filename, $output);
 }
 
-sub record_serialresult ($self, $ref, $res, $string = undef) {
+sub record_serialresult ($self, $ref, $res, $string = undef, %args) {
     $string //= '';
     # take screenshot for documentation (screenshot does not represent fail 
itself)
     $self->take_screenshot() unless (testapi::is_serial_terminal);
 
-    my $output = "# wait_serial expected: $ref\n";
+    my $output = '';
+    $output .= "# Command: $args{command}\n" if defined $args{command};
+    $output .= "# wait_serial expected: $ref\n";
     $output .= "# Result:\n";
     $output .= "$string\n";
     $self->record_resultfile('wait_serial', $output, result => $res);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/bmwqemu.pm 
new/os-autoinst-5.1776765124.5d91657/bmwqemu.pm
--- old/os-autoinst-5.1776179508.bd2644d/bmwqemu.pm     2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/bmwqemu.pm     2026-04-21 
11:52:04.000000000 +0200
@@ -170,6 +170,7 @@
 
 sub _abort_if_storage_limit_exceeded () {
     my $keep_free = $vars{STORAGE_KEEP_FREE_RATIO} // STORAGE_KEEP_FREE_RATIO;
+    return undef if $keep_free <= 0;
     my $numdisks = $vars{NUMDISKS} // default_numdisks();
     my $total_hdd_size_gb = 0;
     for my $i (1 .. $numdisks) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/cmake/test-targets.cmake 
new/os-autoinst-5.1776765124.5d91657/cmake/test-targets.cmake
--- old/os-autoinst-5.1776179508.bd2644d/cmake/test-targets.cmake       
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/cmake/test-targets.cmake       
2026-04-21 11:52:04.000000000 +0200
@@ -139,6 +139,7 @@
 endif ()
 
 # add targets for invoking Perl test suite
+find_program(PROVE_PATH prove_wrapper PATHS tools NO_DEFAULT_PATH)
 find_program(PROVE_PATH prove)
 find_program(UNBUFFER_PATH unbuffer)
 if (PROVE_PATH)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/container/os-autoinst_dev/Dockerfile 
new/os-autoinst-5.1776765124.5d91657/container/os-autoinst_dev/Dockerfile
--- old/os-autoinst-5.1776179508.bd2644d/container/os-autoinst_dev/Dockerfile   
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/container/os-autoinst_dev/Dockerfile   
2026-04-21 11:52:04.000000000 +0200
@@ -29,6 +29,7 @@
        aspell-spell \
        cmake \
        cpio \
+       diffutils \
        ffmpeg \
        file \
        gcc-c++ \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/debugviewer/CMakeLists.txt 
new/os-autoinst-5.1776765124.5d91657/debugviewer/CMakeLists.txt
--- old/os-autoinst-5.1776179508.bd2644d/debugviewer/CMakeLists.txt     
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/debugviewer/CMakeLists.txt     
2026-04-21 11:52:04.000000000 +0200
@@ -4,4 +4,4 @@
 add_executable(${PROJECT_NAME} ${PROJECT_NAME}.cpp)
 target_link_libraries(${PROJECT_NAME} PRIVATE opencv_core opencv_imgcodecs 
opencv_highgui)
 target_compile_options(${PROJECT_NAME} PRIVATE ${PRIVATE_COMPILE_OPTIONS})
-install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${OS_AUTOINST_DATA_DIR}")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/dependencies.yaml 
new/os-autoinst-5.1776765124.5d91657/dependencies.yaml
--- old/os-autoinst-5.1776179508.bd2644d/dependencies.yaml      2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/dependencies.yaml      2026-04-21 
11:52:04.000000000 +0200
@@ -109,6 +109,7 @@
   shadow:
   sudo:
   which:
+  diffutils:
 
 spellcheck_requires:
   aspell-spell:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/dist/rpm/os-autoinst.spec 
new/os-autoinst-5.1776765124.5d91657/dist/rpm/os-autoinst.spec
--- old/os-autoinst-5.1776179508.bd2644d/dist/rpm/os-autoinst.spec      
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/dist/rpm/os-autoinst.spec      
2026-04-21 11:52:04.000000000 +0200
@@ -326,6 +326,8 @@
 %defattr(-,root,root)
 %{_docdir}/os-autoinst
 %dir %{_prefix}/lib/os-autoinst
+%{_prefix}/lib/os-autoinst/debugviewer
+%{_prefix}/lib/os-autoinst/snd2png
 %{_prefix}/lib/os-autoinst/videoencoder
 %{_prefix}/lib/os-autoinst/basetest.pm
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/distribution.pm 
new/os-autoinst-5.1776765124.5d91657/distribution.pm
--- old/os-autoinst-5.1776179508.bd2644d/distribution.pm        2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/distribution.pm        2026-04-21 
11:52:04.000000000 +0200
@@ -155,9 +155,9 @@
         if ($level == 3) {
             testapi::query_isotovideo('backend_clear_serial_buffer', {});
             testapi::type_string "$cmd\n", max_interval => $args{max_interval};
-            my $res = testapi::wait_serial(qr/OA:DONE-(\d+)-/, timeout => 
$args{timeout}, quiet => $args{quiet});
+            my $res = testapi::wait_serial(qr/OA:DONE-[0-9a-f]{4}-(\d+)-/, 
timeout => $args{timeout}, quiet => $args{quiet}, record_command => $cmd);
             return unless $res;
-            return ($res =~ /OA:DONE-(\d+)-/)[0];
+            return ($res =~ /OA:DONE-[0-9a-f]{4}-(\d+)-/)[0];
         }
         $str = testapi::hashed_string('SR' . $cmd . $args{timeout});
         $wait_pattern = qr/$str-(\d+)-/;
@@ -178,7 +178,7 @@
                 testapi::type_string "$marker > /dev/$testapi::serialdev\n", 
max_interval => $args{max_interval};
             }
         }
-        my $res = testapi::wait_serial($wait_pattern, timeout => 
$args{timeout}, quiet => $args{quiet});
+        my $res = testapi::wait_serial($wait_pattern, timeout => 
$args{timeout}, quiet => $args{quiet}, record_command => $cmd);
         return unless $res;
         return ($res =~ $wait_pattern)[0];
     }
@@ -439,13 +439,13 @@
     my $pc;
     my $dev = "/dev/$testapi::serialdev";
     if ($level == 3) {
-        $pc = "PROMPT_COMMAND='printf \"OA:DONE-%d-\\n\" \$? > $dev'";
+        $pc = "PROMPT_COMMAND='ret=\$?; cmd=\$(fc -ln -1 2>/dev/null); printf 
\"OA:DONE-%04x-%d-%s\\nOA:START\\n\" \$RANDOM \$ret 
\"\${cmd#\${cmd%%[![:space:]]*}}\" > $dev'";
     }
     else {
-        $pc = "PROMPT_COMMAND='if [ -n \"\$__OA_MARK\" ]; then echo 
\"\${__OA_MARK}-\$?-\" > $dev; unset __OA_MARK; fi'";
+        $pc = "PROMPT_COMMAND='if [ -n \"\$__OA_MARK\" ]; then echo 
\"\${__OA_MARK}-\$?-\" > $dev; unset __OA_MARK; fi; echo \"OA:START\" > $dev'";
     }
     testapi::type_string "$pc\n";
-    my $marker_match = $level == 3 ? 'OA:DONE' : '__OA_MARK';
+    my $marker_match = 'OA:START';
     my $hook_cmd = "for f in ~/.bashrc ~/.profile; do grep -q '$marker_match' 
\"\$f\" 2>/dev/null || cat <<'EOF' >> \"\$f\"\n$pc\nEOF\ndone\n";
     testapi::type_string $hook_cmd;
     my $console = testapi::current_console() // 'sut';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/doc/backend_vars.md 
new/os-autoinst-5.1776765124.5d91657/doc/backend_vars.md
--- old/os-autoinst-5.1776179508.bd2644d/doc/backend_vars.md    2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/doc/backend_vars.md    2026-04-21 
11:52:04.000000000 +0200
@@ -60,7 +60,8 @@
 | 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'. |
-| STORAGE_KEEP_FREE_RATIO | float | 0.2 | Ratio of total storage space to keep 
free (e.g. 0.2 for 20%). If the total requested HDD size exceeds the available 
space while keeping this ratio of total storage size free, the job is aborted 
early with "incomplete" status. |
+| STORAGE_KEEP_FREE_RATIO | float | 0.2 | Ratio of total storage space to keep 
free (e.g. 0.2 for 20%). If the total requested HDD size exceeds the available 
space while keeping this ratio of total storage size free, the job is aborted 
early with "incomplete" status. Set to 0 to disable this check. |
+| FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED | boolean | 0 | Fail explicitly if a 
test module is scheduled with the `always_rollback` flag but snapshots are not 
supported by the backend. |
 |  |
 
 ## ZVM backend
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml
  2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml
  2026-04-21 11:52:04.000000000 +0200
@@ -7,8 +7,10 @@
   base-check-commit-message:
     name: Check commit message
     runs-on: ubuntu-latest
+    permissions:
+      contents: read
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@v6
         with:
           fetch-depth: 0
       - name: Install gitlint
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/commit-message-checker.yml
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/commit-message-checker.yml
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/commit-message-checker.yml
       2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/commit-message-checker.yml
       2026-04-21 11:52:04.000000000 +0200
@@ -10,4 +10,6 @@
 
 jobs:
   check-commit-message:
+    permissions:
+      contents: read
     uses: ./.github/workflows/base-commit-message-checker.yml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/perl-author-tests.yml
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/perl-author-tests.yml
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/perl-author-tests.yml
    2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/perl-author-tests.yml
    2026-04-21 11:52:04.000000000 +0200
@@ -5,10 +5,14 @@
 
 jobs:
   perl-author-tests:
+    permissions:
+      contents: read
     runs-on: ubuntu-latest
     name: Perl author tests
     container:
       image: registry.opensuse.org/devel/openqa/containers/os-autoinst_dev
     steps:
-      - uses: actions/checkout@v4
-      - run: make test-author
+      - uses: actions/checkout@v6
+      - run: |
+          git config --system --add safe.directory "$GITHUB_WORKSPACE"
+          make test-author
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/perl-lint-checks.yml
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/perl-lint-checks.yml
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/perl-lint-checks.yml
     2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/perl-lint-checks.yml
     2026-04-21 11:52:04.000000000 +0200
@@ -5,10 +5,12 @@
 
 jobs:
   perl-lint-checks:
+    permissions:
+      contents: read
     runs-on: ubuntu-latest
     name: "Perltidy"
     container:
       image: registry.opensuse.org/devel/openqa/containers/os-autoinst_dev
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@v6
       - run: GITHUB_ACTIONS=1 make test-tidy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/test.yaml
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/test.yaml
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/test.yaml
        2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/test.yaml
        2026-04-21 11:52:04.000000000 +0200
@@ -5,9 +5,11 @@
 
 jobs:
   test:
+    permissions:
+      contents: read
     runs-on: ubuntu-latest
     container:
       image: perldocker/perl-tester
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@v6
       - run: make test-t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/yamllint.yml
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/yamllint.yml
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/yamllint.yml
     2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/yamllint.yml
     2026-04-21 11:52:04.000000000 +0200
@@ -6,9 +6,11 @@
 jobs:
   yaml-lint:
     runs-on: ubuntu-latest
+    permissions:
+      contents: read
     name: "YAML-lint"
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@v6
       - uses: 
docker://registry.opensuse.org/home/okurz/container/containers/tumbleweed:yamllint
         with:
           entrypoint: make
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.gitrepo 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.gitrepo
--- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.gitrepo   
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.gitrepo   
2026-04-21 11:52:04.000000000 +0200
@@ -6,7 +6,7 @@
 [subrepo]
        remote = [email protected]:os-autoinst/os-autoinst-common.git
        branch = master
-       commit = 7bbf40822c49031520d5d287daf89b8fdfe21fb8
-       parent = 5af53feb2cb2969b72228bab06f148c633668b23
+       commit = 4e71e20292cd76298e53e9726e4d2b49be0eb7e0
+       parent = 6913c369c5314bdc441fe373a954d42f3b15aebb
        method = merge
        cmdver = 0.4.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.perlcriticrc 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.perlcriticrc
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.perlcriticrc  
    2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.perlcriticrc  
    2026-04-21 11:52:04.000000000 +0200
@@ -25,10 +25,6 @@
 
 # == Community Policies
 # -- Test::Most brings in strict & warnings
-[Freenode::StrictWarnings]
-extra_importers = Test::Most
-
-# -- Test::Most brings in strict & warnings
 [Community::StrictWarnings]
 extra_importers = Test::Most
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/Makefile 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/Makefile
--- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/Makefile   
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/Makefile   
2026-04-21 11:52:04.000000000 +0200
@@ -1,3 +1,11 @@
+# PROVE: Test application for Perl tests
+PROVE ?= tools/prove_wrapper
+PROVE_JOBS ?= $(shell nproc 2>/dev/null || echo 1)
+PROVE_JOBS_ARGS ?= -j$(PROVE_JOBS)
+
+SH_FILES ?= $(shell file --mime-type $$(git ls-files) test/*.t | sed -n 
's/^\(.*\):.*text\/x-shellscript.*$$/\1/p')
+SH_SHELLCHECK_FILES ?= $(shell file --mime-type * | sed -n 
's/^\(.*\):.*text\/x-shellscript.*$$/\1/p')
+
 all: help
 
 .PHONY: help
@@ -12,8 +20,17 @@
 setup-hooks: ## Install pre-commit git hooks
        pre-commit install --install-hooks -t commit-msg -t pre-commit
 
+shfmt: ## Format shell scripts via shfmt
+       shfmt -w ${SH_FILES}
+
+test-shellcheck: ## Run shfmt and shellcheck tests
+       @which shfmt >/dev/null 2>&1 || echo "Command 'shfmt' not found, can 
not execute shell script formating checks"
+       shfmt -d ${SH_FILES}
+       @which shellcheck >/dev/null 2>&1 || echo "Command 'shellcheck' not 
found, can not execute shell script checks"
+       if [ -n "${SH_SHELLCHECK_FILES}" ]; then shellcheck -x 
${SH_SHELLCHECK_FILES}; fi
+
 .PHONY: test-checkstyle
-test-checkstyle: test-tidy test-yaml test-gitlint ## Run checkstyle checks
+test-checkstyle: test-tidy test-yaml test-gitlint test-shellcheck ## Run 
checkstyle checks
 
 .PHONY: test
 test: test-checkstyle test-author test-t ## Run all tests
@@ -35,8 +52,8 @@
 
 .PHONY: test-author
 test-author: ## Run author tests
-       prove -l -r xt/
+       "${PROVE}" $(PROVE_JOBS_ARGS) -l -r xt/
 
 .PHONY: test-t
 test-t: ## Run unit tests
-       prove -l -r t/
+       "${PROVE}" $(PROVE_JOBS_ARGS) -l -r t/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/dependencies.yaml
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/dependencies.yaml
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/dependencies.yaml
  2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/dependencies.yaml
  2026-04-21 11:52:04.000000000 +0200
@@ -23,6 +23,8 @@
   perl(Perl::Critic::Community):
   perl(Test::Perl::Critic):
   python3-gitlint:
+  expect:  # for unbuffer
+  shfmt:
 
 cover_requires:
   perl(Devel::Cover):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/lib/OpenQA/Test/TimeLimit.pm
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/lib/OpenQA/Test/TimeLimit.pm
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/lib/OpenQA/Test/TimeLimit.pm
       2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/lib/OpenQA/Test/TimeLimit.pm
       2026-04-21 11:52:04.000000000 +0200
@@ -13,6 +13,7 @@
     return if ($ENV{OPENQA_TEST_TIMEOUT_DISABLE} or $INC{'perl5db.pl'});
     $SCALE_FACTOR *= $ENV{OPENQA_TEST_TIMEOUT_SCALE_COVER} // 3 if 
Devel::Cover->can('report');
     $SCALE_FACTOR *= $ENV{OPENQA_TEST_TIMEOUT_SCALE_CI} // 2 if $ENV{CI};
+    $SCALE_FACTOR *= 5 if $ENV{HARNESS_IS_PARALLEL};
     $limit *= $SCALE_FACTOR;
     $SIG{ALRM} = sub { BAIL_OUT "test '$0' exceeds runtime limit of '$limit' 
seconds\n" };
     alarm $limit;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/t/01-compile-check-all.t
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/t/01-compile-check-all.t
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/t/01-compile-check-all.t
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/t/01-compile-check-all.t
   2026-04-21 11:52:04.000000000 +0200
@@ -0,0 +1,12 @@
+# Copyright SUSE LLC
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+use Test::Most;
+# We need :no_end_test here because otherwise it would output a no warnings
+# test for each of the modules, but with the same test number
+use Test::Warnings qw(:no_end_test :report_warnings);
+
+use Test::Compile;
+my $test = Test::Compile->new();
+$test->all_files_ok();
+$test->done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/tools/prove_wrapper
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/tools/prove_wrapper
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/tools/prove_wrapper
        2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/tools/prove_wrapper
        2026-04-21 11:52:04.000000000 +0200
@@ -4,11 +4,20 @@
 
 set -euo pipefail
 
-OUTPUT=$(mktemp)
+prove_cmd=(prove -I .)
+
+# skip the check for unhandled output when running in verbose mode
+for arg in "$@"; do [[ $arg =~ (-v|--verbose) ]] && TEST_VERBOSE=1 && break; 
done
+[[ ${TEST_VERBOSE:-} && $TEST_VERBOSE != 0 ]] && exec "${prove_cmd[@]}" "$@"
 
 echo "Running prove with TAP output check ..."
 
-prove -I . "$@" 2>&1 | tee "$OUTPUT"
+# use unbuffer if available and stdout is a terminal for immediate output
+[[ -t 1 ]] && unbuffer_cmd=("$(which unbuffer 2> /dev/null)") || 
unbuffer_cmd=()
+
+OUTPUT=$(mktemp)
+"${unbuffer_cmd[@]}" "${prove_cmd[@]}" "$@" 2>&1 | tee "$OUTPUT"
+
 STATUS=${PIPESTATUS[0]}
 
 if [ "$STATUS" -ne 0 ]; then
@@ -16,16 +25,20 @@
     exit "$STATUS"
 fi
 
-sed -E '
-  s/^\[[0-9]{2}:[0-9]{2}:[0-9]{2}\][[:space:]]*//
-  /^All tests successful\./,$d
-' "$OUTPUT" > "$OUTPUT.processed"
-
-UNHANDLED=$(grep -vE '^(x?t|t/compile)/.*([0-9]{2}-|)([[:alnum:]]|_|-)+\.t 
\.+' "$OUTPUT.processed" || true)
+UNHANDLED=$(sed --regexp-extended \
+    -e 's/^\[[0-9]{2}:[0-9]{2}:[0-9]{2}\][[:space:]]*//' \
+    -e '/x?t\/.*\.t\s*\.+/d' \
+    -e '/\s*[0-9]+\.\.[0-9]+.*/d' \
+    -e '/^# /d' \
+    -e '/Files=.*Tests=/d' \
+    -e '/Result: /d' \
+    -e '/All tests successful\./d' \
+    "$OUTPUT")
 
 if [ -n "$UNHANDLED" ]; then
-    echo "not ok - unhandled output found"
-    echo "Run with PROVE_COMMAND=tools/prove_wrapper to reproduce locally"
+    echo "not ok - unhandled output found:"
+    echo "$UNHANDLED"
+    echo "Run with PROVE=tools/prove_wrapper to reproduce locally"
     exit 1
 else
     echo "ok - no unhandled output found"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/xt/01-compile-check-all.t
 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/xt/01-compile-check-all.t
--- 
old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/xt/01-compile-check-all.t
  2026-04-14 17:11:48.000000000 +0200
+++ 
new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/xt/01-compile-check-all.t
  1970-01-01 01:00:00.000000000 +0100
@@ -1,20 +0,0 @@
-# Copyright SUSE LLC
-# SPDX-License-Identifier: GPL-2.0-or-later
-
-use Test::Most;
-# We need :no_end_test here because otherwise it would output a no warnings
-# test for each of the modules, but with the same test number
-use Test::Warnings qw(:no_end_test :report_warnings);
-use FindBin;
-use lib "$FindBin::Bin/lib";
-use OpenQA::Test::TimeLimit '400';
-
-use Test::Strict;
-
-push @Test::Strict::MODULES_ENABLING_STRICT, 'Test::Most';
-push @Test::Strict::MODULES_ENABLING_WARNINGS, 'Test::Most';
-
-$Test::Strict::TEST_SYNTAX = 1;
-$Test::Strict::TEST_STRICT = 1;
-$Test::Strict::TEST_WARNINGS = 1;
-all_perl_files_ok(qw(lib tools xt));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/script/os-autoinst-testmodules-strict 
new/os-autoinst-5.1776765124.5d91657/script/os-autoinst-testmodules-strict
--- old/os-autoinst-5.1776179508.bd2644d/script/os-autoinst-testmodules-strict  
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/script/os-autoinst-testmodules-strict  
2026-04-21 11:52:04.000000000 +0200
@@ -36,6 +36,10 @@
 Always add signatures.
 By default it does not add C<-signatures> if it was not alraedy used.
 
+=item B<-v, --force>
+
+Ignore C<## no os-autoinst style> comments.
+
 =item B<-h, -?, --help>
 
 Show this help.
@@ -56,7 +60,7 @@
 my $rc = 0;
 unless (caller) {
     $|++;
-    GetOptions(\my %options, 'help|h|?', 'verbose|v', 'write', 'signatures') 
or usage(1);
+    GetOptions(\my %options, 'help|h|?', 'verbose|v', 'force', 'write', 
'signatures') or usage(1);
     usage(0) if $options{help};
     usage(1) unless @ARGV;
     $rc = main(\%options, @ARGV);
@@ -77,7 +81,7 @@
         $options->{verbose} and printf $format, $progress, 'Analyzing', 
$length, $file;
         my $module;
         try {
-            $module = analyze($doc);
+            $module = analyze($doc, {force => $options->{force}});
         }
         catch ($e) {    # uncoverable statement
             say "\nError in '$file': $e";
@@ -160,15 +164,17 @@
     return \%include;
 }
 
-sub analyze ($doc) {
+sub analyze ($doc, $args) {
     my %module = (doc => $doc);
     $module{objects} = \my @objects;
     $module{base_classes} = \my @classes;
     my $comments = $doc->find('PPI::Token::Comment') || [];
     for my $comment (@$comments) {
         if ($comment->content =~ m/^## no os-autoinst style/) {
-            $module{nofix} = 1;
-            return \%module;
+            unless ($args->{force}) {
+                $module{nofix} = 1;
+                return \%module;
+            }
         }
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/snd2png/CMakeLists.txt 
new/os-autoinst-5.1776765124.5d91657/snd2png/CMakeLists.txt
--- old/os-autoinst-5.1776179508.bd2644d/snd2png/CMakeLists.txt 2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/snd2png/CMakeLists.txt 2026-04-21 
11:52:04.000000000 +0200
@@ -6,4 +6,4 @@
 target_compile_options(${PROJECT_NAME} PRIVATE ${PRIVATE_COMPILE_OPTIONS})
 target_use_pkg_config_module(${PROJECT_NAME} "fftw3")
 target_use_pkg_config_module(${PROJECT_NAME} "sndfile")
-install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${OS_AUTOINST_DATA_DIR}")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/03-testapi.t 
new/os-autoinst-5.1776765124.5d91657/t/03-testapi.t
--- old/os-autoinst-5.1776179508.bd2644d/t/03-testapi.t 2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/t/03-testapi.t 2026-04-21 
11:52:04.000000000 +0200
@@ -1334,6 +1334,16 @@
     }
 };
 
+subtest 'wait_serial record_command' => sub {
+    my $mock_test = Test::MockModule->new('basetest');
+    my $recorded_cmd;
+    $mock_test->redefine(record_serialresult => sub ($self, $ref, $res, 
$string, %args) {
+            $recorded_cmd = $args{command};
+    });
+    wait_serial('regex', record_command => 'my_command');
+    is($recorded_cmd, 'my_command', 'command passed to record_serialresult');
+};
+
 done_testing;
 
 END {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/05-distribution.t 
new/os-autoinst-5.1776765124.5d91657/t/05-distribution.t
--- old/os-autoinst-5.1776179508.bd2644d/t/05-distribution.t    2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/t/05-distribution.t    2026-04-21 
11:52:04.000000000 +0200
@@ -99,12 +99,12 @@
             my ($regexp) = @_;
             return 'BASH:4.4:' if ref($regexp) eq 'Regexp' && 'BASH:4.4:' =~ 
$regexp;
             return 'FC:OK:' if ref($regexp) eq 'Regexp' && 'FC:OK:' =~ $regexp;
-            return 'OA:foo3foo-0-';
+            return 'OA:DONE-abcd-0-foo';
     });
 
     $d->{_serial_marker_level} = {};
     $typed_string = '';
-    $d->script_run('foo');
+    is $d->script_run('foo'), 0, 'Level 3 returns exit code';
     like $typed_string, qr/foo\n$/, 'Level 3 ends with command + newline';
     is substr($typed_string, -4), "foo\n", 'Level 3 uses clean command line';
 
@@ -156,7 +156,7 @@
             my ($regexp) = @_;
             return 'BASH:4.4:' if ref($regexp) eq 'Regexp' && 'BASH:4.4:' =~ 
$regexp;
             return 'FC:OK:' if ref($regexp) eq 'Regexp' && 'FC:OK:' =~ $regexp;
-            return 'OA:DONE-0-';
+            return 'OA:DONE-abcd-0-';
     });
 
     $d->script_run('foo');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/08-autotest.t 
new/os-autoinst-5.1776765124.5d91657/t/08-autotest.t
--- old/os-autoinst-5.1776179508.bd2644d/t/08-autotest.t        2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/t/08-autotest.t        2026-04-21 
11:52:04.000000000 +0200
@@ -232,6 +232,15 @@
         is $reverts_done, 0, 'no snapshots loaded after fatal failure';
         is $snapshots_made, 0, 'no snapshots made after fatal failure';
     };
+    snapshot_subtest 'fails if snapshots are not supported and 
FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED is set' => sub {
+        $mock_basetest->redefine(test_flags => {always_rollback => 1});
+        $mock_autotest->redefine(query_isotovideo => sub { 0 });
+        $bmwqemu::vars{FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED} = 1;
+        my $w;
+        stderr_like { $w = warning { autotest::run_all } } qr/Snapshots are 
not supported/, 'run_all outputs on stderr';
+        like $w, qr/always_rollback requested but snapshots are not supported 
by the backend/, 'fails with explicit error message';
+        delete $bmwqemu::vars{FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED};
+    };
     $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.1776179508.bd2644d/t/12-bmwqemu.t 
new/os-autoinst-5.1776765124.5d91657/t/12-bmwqemu.t
--- old/os-autoinst-5.1776179508.bd2644d/t/12-bmwqemu.t 2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/t/12-bmwqemu.t 2026-04-21 
11:52:04.000000000 +0200
@@ -213,6 +213,42 @@
         bmwqemu::init;
         bmwqemu::ensure_valid_vars();
     } qr/keep-free 90%/, 'abort if requested HDDSIZEGB exceeds custom 
threshold';
+
+    unlink bmwqemu::STATE_FILE;
+    create_vars({CASEDIR => $dir, HDDSIZEGB => 1, STORAGE_KEEP_FREE_RATIO => 
0});
+    $bmw_mock->mock(_get_storage_stats => sub { return (1024**3, 100 * 
1024**2) });
+    lives_ok {
+        bmwqemu::init();
+        bmwqemu::ensure_valid_vars();
+    } 'succeed if requested HDDSIZEGB exceeds available space but ratio is 0';
+
+    unlink bmwqemu::STATE_FILE;
+    create_vars({CASEDIR => $dir});    # No HDDSIZEGB, uses default 10GB
+    $bmw_mock->mock(_get_storage_stats => sub { return (100 * 1024**3, 100 * 
1024**3) });
+    lives_ok {
+        bmwqemu::init();
+        bmwqemu::ensure_valid_vars();
+    } 'succeed with default HDDSIZEGB';
+};
+
+subtest '_get_storage_stats' => sub {
+    my $tmp = tempdir(CLEANUP => 1);
+    my $dummy_df = "$tmp/df";
+    for my $case (
+        {output => ' 1000 500', total => 1000, avail => 500, msg => 'matches 
dummy df'},
+        {output => 'malformed', total => undef, avail => undef, msg => 'is 
undef on malformed df output'},
+    ) {
+        path($dummy_df)->spew("#!/bin/sh\necho '$case->{output}'");
+        chmod 0755, $dummy_df;
+        local $ENV{PATH} = "$tmp:$ENV{PATH}";
+        my ($total, $available) = bmwqemu::_get_storage_stats('.');
+        is $total, $case->{total}, "total $case->{msg}";
+        is $available, $case->{avail}, "available $case->{msg}";
+    }
+
+    my ($total, $available) = bmwqemu::_get_storage_stats('.');
+    like $total, qr/^\d+$/, 'returns numeric total storage';
+    like $available, qr/^\d+$/, 'returns numeric available storage';
 };
 
 done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/14-isotovideo.t 
new/os-autoinst-5.1776765124.5d91657/t/14-isotovideo.t
--- old/os-autoinst-5.1776179508.bd2644d/t/14-isotovideo.t      2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/t/14-isotovideo.t      2026-04-21 
11:52:04.000000000 +0200
@@ -353,7 +353,7 @@
                 exit_code => 0)
         };
         like $log, qr/Starting LLM Analysis/, 'LLM analysis started';
-        like $log, qr/LLM Analysis complete/, 'LLM analysis finished';
+        like $log, qr/LLM Analysis:/, 'LLM analysis finished';
         my $analysis_file = path($pool_dir, 'testresults', 
'llm-failure-analysis.txt');
         ok -e $analysis_file, 'LLM analysis output file exists';
         like $analysis_file->slurp, qr/analyzing an automated test run/, 'LLM 
analysis output contains expected content';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/17-basetest.t 
new/os-autoinst-5.1776765124.5d91657/t/17-basetest.t
--- old/os-autoinst-5.1776179508.bd2644d/t/17-basetest.t        2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/t/17-basetest.t        2026-04-21 
11:52:04.000000000 +0200
@@ -518,4 +518,15 @@
     is($basetest->{result}, 'successfully called function', 'search for 
expected serial failures is working');
 };
 
+subtest record_serialresult_with_command => sub {
+    my $basetest = basetest->new();
+    $basetest->{name} = 'test';
+    my $recorded_output;
+    my $mock_basetest_local = Test::MockModule->new('basetest');
+    $mock_basetest_local->redefine(record_resultfile => sub ($self, $title, 
$output, %nargs) { $recorded_output = $output });
+    $basetest->record_serialresult('regex', 'ok', 'output', command => 
'my_command');
+    like($recorded_output, qr/# Command: my_command/, 'command is in output');
+    like($recorded_output, qr/# wait_serial expected: regex/, 'expected regex 
is in output');
+};
+
 done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/t/48-testmodules-style.t 
new/os-autoinst-5.1776765124.5d91657/t/48-testmodules-style.t
--- old/os-autoinst-5.1776179508.bd2644d/t/48-testmodules-style.t       
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/t/48-testmodules-style.t       
2026-04-21 11:52:04.000000000 +0200
@@ -23,7 +23,7 @@
         my $module;
         my $err;
         try {
-            $module = main::analyze($doc);
+            $module = main::analyze($doc, {});
         }
         catch ($e) {
             $err = $e;
@@ -46,7 +46,7 @@
     }
 };
 
-subtest 'main' => sub {
+subtest main => sub {
     my @args = qw(t/data/tests/bar/module2.pm);
     combined_like { main::main({}, @args) } qr/Would change @args/, 'checking 
file';
 
@@ -61,7 +61,7 @@
     is $code, q{use Mojo::Base 'x';}, 'changed string like expected';
 };
 
-subtest 'script' => sub {
+subtest script => sub {
     my $out = qx{$^X $script};
     is $? >> 8, 1, 'script exits with 1 in case of usage errors';
 
@@ -69,6 +69,18 @@
     is $? >> 8, 2, 'script exits with 2 in case of changes';
 };
 
+subtest force => sub {
+    my $code = <<~'EOM';
+    ## no os-autoinst style
+    use base 'foo';
+    EOM
+    my $doc = PPI::Document->new(\$code) or die 'Could not parse code';
+    my $module = main::analyze($doc, {});
+    is $module->{nofix}, 1, 'requested to skip by comment';
+    $module = main::analyze($doc, {force => 1});
+    !exists $module->{nofix}, 'requested to skip by comment';
+};
+
 done_testing;
 
 __DATA__
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/testapi.pm 
new/os-autoinst-5.1776765124.5d91657/testapi.pm
--- old/os-autoinst-5.1776179508.bd2644d/testapi.pm     2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/testapi.pm     2026-04-21 
11:52:04.000000000 +0200
@@ -397,6 +397,9 @@
 circumstance of the screen being shown this does not imply a longer waiting
 time as the method returns as soon as a successful needle match occurred.
 
+Note when using multiple tags the method returns on the first match and an
+additional C<assert_screen> may be needed for consecutive screens.
+
 Specify C<$no_wait> to run the screen check as fast as possible that is
 possibly more than once per second which is default. Select this to check a
 screen which can change in a range faster than 1-2 seconds not to miss the
@@ -866,6 +869,7 @@
             no_regex => 0,
             buffer_size => undef,
             record_output => undef,
+            record_command => undef,
         }, ['timeout', 'expect_not_found'], @_);
 
     bmwqemu::log_call(%args);
@@ -882,7 +886,7 @@
     # hyperv and vmware (backend/svirt.pm) connect serial line over TCP/IP 
(socat)
     # convert CRLF to LF only
     $ret->{string} =~ s,\r\n,\n,g;
-    $autotest::current_test->record_serialresult(bmwqemu::pp($regexp), 
$matched, $ret->{string}) unless ($args{quiet});
+    $autotest::current_test->record_serialresult(bmwqemu::pp($regexp), 
$matched, $ret->{string}, command => $args{record_command}) unless 
($args{quiet});
     bmwqemu::fctres("$regexp: $matched");
     return $ret->{string} if ($matched eq 'ok');
     return;    # false
@@ -1783,7 +1787,7 @@
     return query_isotovideo('backend_start_audiocapture', {filename => 
$filename});
 }
 
-sub _snd2png ($wavfile, $imgpath) { system "snd2png $wavfile $imgpath" }    # 
uncoverable statement
+sub _snd2png ($wavfile, $imgpath) { system "$bmwqemu::topdir/snd2png $wavfile 
$imgpath" }    # uncoverable statement
 
 sub _check_or_assert_sound ($mustmatch, $check = undef) {
     my $result = $autotest::current_test->stop_audiocapture();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/tools/container_run_ci 
new/os-autoinst-5.1776765124.5d91657/tools/container_run_ci
--- old/os-autoinst-5.1776179508.bd2644d/tools/container_run_ci 2026-04-14 
17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/tools/container_run_ci 2026-04-21 
11:52:04.000000000 +0200
@@ -71,7 +71,7 @@
 cd /opt
 ./tools/install-new-deps.sh
 export CI=1 WITH_COVER_OPTIONS=1 CHECK_GIT_STATUS=1 
PERL_TEST_WARNINGS_ONLY_REPORT_WARNINGS=$PERL_TEST_WARNINGS_ONLY_REPORT_WARNINGS
-cmake -G Ninja -DPROVE_PATH=\"/opt/tools/prove_wrapper\" 
-DCMAKE_BUILD_TYPE=Release -S . -B \"$build_dir\"
+cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -S . -B \"$build_dir\"
 cmake --build \"$build_dir\" --verbose --target check-pkg-build
 cmake --build \"$build_dir\" --verbose --target $target
 cover -report html_minimal \"$build_dir\"/cover_db"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1776179508.bd2644d/tools/install-new-deps.sh 
new/os-autoinst-5.1776765124.5d91657/tools/install-new-deps.sh
--- old/os-autoinst-5.1776179508.bd2644d/tools/install-new-deps.sh      
2026-04-14 17:11:48.000000000 +0200
+++ new/os-autoinst-5.1776765124.5d91657/tools/install-new-deps.sh      
2026-04-21 11:52:04.000000000 +0200
@@ -25,6 +25,10 @@
 listdeps > $NEWDEPS
 
 echo "Checking updated packages"
+command -v diff &> /dev/null || {
+    echo "ERROR: diff is not installed"
+    exit 1
+}
 if diff $OLDDEPS $NEWDEPS > $DIFFDEPS; then
     echo "NO DIFF"
 else

++++++ os-autoinst.obsinfo ++++++
--- /var/tmp/diff_new_pack.GFx1Q2/_old  2026-04-22 16:58:28.973236334 +0200
+++ /var/tmp/diff_new_pack.GFx1Q2/_new  2026-04-22 16:58:28.993237162 +0200
@@ -1,5 +1,5 @@
 name: os-autoinst
-version: 5.1776179508.bd2644d
-mtime: 1776179508
-commit: bd2644d4d18402e34c7e49ea9dab47bd110081b6
+version: 5.1776765124.5d91657
+mtime: 1776765124
+commit: 5d91657133aff9d9050b3837c9abc21c14d03cff
 

Reply via email to