Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package openQA for openSUSE:Factory checked 
in at 2026-07-08 17:37:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/openQA (Old)
 and      /work/SRC/openSUSE:Factory/.openQA.new.1982 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "openQA"

Wed Jul  8 17:37:37 2026 rev:865 rq:1364441 version:5.1783486111.5733fbdf

Changes:
--------
--- /work/SRC/openSUSE:Factory/openQA/openQA.changes    2026-07-07 
21:02:39.061138462 +0200
+++ /work/SRC/openSUSE:Factory/.openQA.new.1982/openQA.changes  2026-07-08 
17:39:57.728635217 +0200
@@ -1,0 +2,22 @@
+Wed Jul 08 04:48:42 UTC 2026 - [email protected]
+
+- Update to version 5.1783486111.5733fbdf:
+  * fix(source links): Category and module can contain an underscore
+  * fixup! feat: Log early aborts during disk space cleanup
+  * feat: Log early aborts during disk space cleanup
+  * feat: Abort results cleanup early to prevent load surges
+  * refactor: Make `t/05-scheduler-full.t` easier to understand
+  * refactor: Improve marking workers as dead in `t/05-scheduler-full.t`
+  * refactor: Use signatures in `t/05-scheduler-full.t`
+  * test: Remove simulation of "heavy load" from `t/05-scheduler-full.t`
+  * chore(deps): Dependency cron 2026-07-07
+  * fix(packaging): remove duplicate openqa spec dir
+  * fix(packaging): create podman cache dir via RPM
+  * fix(worker): ensure podman cache directory exists
+  * fix: XUnit: render skipped testcases as missing instead of ok
+  * test: Stabilize `t/ui/26-jobs_restart.t`
+  * chore(deps): bump the all-actions group across 1 directory with 5 updates
+  * ci: Reduce memory usage of `t/05-scheduler.t`
+  * feat: Turn code locations in autoinst-log into links
+
+-------------------------------------------------------------------

Old:
----
  openQA-5.1783327469.933c54e2.obscpio

New:
----
  openQA-5.1783486111.5733fbdf.obscpio

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

Other differences:
------------------
++++++ openQA-client-test.spec ++++++
--- /var/tmp/diff_new_pack.Nd9aIV/_old  2026-07-08 17:39:59.008679947 +0200
+++ /var/tmp/diff_new_pack.Nd9aIV/_new  2026-07-08 17:39:59.012680088 +0200
@@ -18,7 +18,7 @@
 
 %define         short_name openQA-client
 Name:           %{short_name}-test
-Version:        5.1783327469.933c54e2
+Version:        5.1783486111.5733fbdf
 Release:        0
 Summary:        Test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ openQA-devel-test.spec ++++++
--- /var/tmp/diff_new_pack.Nd9aIV/_old  2026-07-08 17:39:59.040681066 +0200
+++ /var/tmp/diff_new_pack.Nd9aIV/_new  2026-07-08 17:39:59.044681206 +0200
@@ -18,7 +18,7 @@
 
 %define         short_name openQA-devel
 Name:           %{short_name}-test
-Version:        5.1783327469.933c54e2
+Version:        5.1783486111.5733fbdf
 Release:        0
 Summary:        Test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ openQA-test.spec ++++++
--- /var/tmp/diff_new_pack.Nd9aIV/_old  2026-07-08 17:39:59.076682324 +0200
+++ /var/tmp/diff_new_pack.Nd9aIV/_new  2026-07-08 17:39:59.076682324 +0200
@@ -18,7 +18,7 @@
 
 %define         short_name openQA
 Name:           %{short_name}-test
-Version:        5.1783327469.933c54e2
+Version:        5.1783486111.5733fbdf
 Release:        0
 Summary:        Test package for openQA
 License:        GPL-2.0-or-later

++++++ openQA-worker-test.spec ++++++
--- /var/tmp/diff_new_pack.Nd9aIV/_old  2026-07-08 17:39:59.124684002 +0200
+++ /var/tmp/diff_new_pack.Nd9aIV/_new  2026-07-08 17:39:59.124684002 +0200
@@ -18,7 +18,7 @@
 
 %define         short_name openQA-worker
 Name:           %{short_name}-test
-Version:        5.1783327469.933c54e2
+Version:        5.1783486111.5733fbdf
 Release:        0
 Summary:        Test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ openQA.spec ++++++
--- /var/tmp/diff_new_pack.Nd9aIV/_old  2026-07-08 17:39:59.164685399 +0200
+++ /var/tmp/diff_new_pack.Nd9aIV/_new  2026-07-08 17:39:59.168685539 +0200
@@ -104,7 +104,7 @@
 %define devel_requires %devel_no_selenium_requires chromedriver
 
 Name:           openQA
-Version:        5.1783327469.933c54e2
+Version:        5.1783486111.5733fbdf
 Release:        0
 Summary:        Framework for automated system-level testing (web-frontend, 
scheduler and tools)
 Group:          Development/Tools/Other
@@ -642,7 +642,6 @@
 %dir %{_sysconfdir}/openqa/database.ini.d
 %{_datadir}/doc/openqa/examples/openqa.ini
 %{_datadir}/doc/openqa/examples/database.ini
-%dir %{_datadir}/openqa
 %config %{_sysconfdir}/logrotate.d
 # apache vhost
 %dir %{_sysconfdir}/apache2
@@ -833,6 +832,7 @@
 %dir %{_localstatedir}/lib/openqa/pool
 %defattr(-,_openqa-worker,root)
 %dir %{_localstatedir}/lib/openqa/cache
+%dir %{_localstatedir}/lib/openqa/cache/podman
 # own one pool - to create the others is task of the admin
 %dir %{_localstatedir}/lib/openqa/pool/1
 %if 0%{?suse_version} > 1500

++++++ openQA-5.1783327469.933c54e2.obscpio -> 
openQA-5.1783486111.5733fbdf.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/.github/workflows/check-containers.yml 
new/openQA-5.1783486111.5733fbdf/.github/workflows/check-containers.yml
--- old/openQA-5.1783327469.933c54e2/.github/workflows/check-containers.yml     
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/.github/workflows/check-containers.yml     
2026-07-08 06:48:31.000000000 +0200
@@ -8,6 +8,6 @@
       contents: read
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10  # v6
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # 
v7.0.0
       - name: Test our container definitions
         run: make test-check-containers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/.github/workflows/check-helm-chart.yml 
new/openQA-5.1783486111.5733fbdf/.github/workflows/check-helm-chart.yml
--- old/openQA-5.1783327469.933c54e2/.github/workflows/check-helm-chart.yml     
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/.github/workflows/check-helm-chart.yml     
2026-07-08 06:48:31.000000000 +0200
@@ -9,15 +9,15 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout repository
-        uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10  # v6
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # 
v7.0.0
 
       - name: Install Helm
-        uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4  # v4
+        uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310  # 
v5.0.1
         with:
           version: v3.8.1
 
       - name: Install Python
-        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065  # 
v5
+        uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1  # 
v6.3.0
         with:
           python-version: 3.13
 
@@ -35,15 +35,15 @@
       REGISTRY_PATH: registry.opensuse.org/devel/openqa/containers16.0
     steps:
       - name: Checkout repository
-        uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10  # v6
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # 
v7.0.0
 
       - name: Install Helm
-        uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4  # v4
+        uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310  # 
v5.0.1
         with:
           version: v3.8.1
 
       - name: Install Python
-        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065  # 
v5
+        uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1  # 
v6.3.0
         with:
           python-version: 3.13
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/.github/workflows/checklist.yml 
new/openQA-5.1783486111.5733fbdf/.github/workflows/checklist.yml
--- old/openQA-5.1783327469.933c54e2/.github/workflows/checklist.yml    
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/.github/workflows/checklist.yml    
2026-07-08 06:48:31.000000000 +0200
@@ -10,7 +10,7 @@
     name: Checklist job
     steps:
       - name: Checkout
-        uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10  # v6
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # 
v7.0.0
       - name: Checklist
         uses: 
wyozi/contextual-qa-checklist-action@dd4b6b51d85a59f537b7ca9e2f162164627ec811  
# master
         with:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/.github/workflows/compose.yml 
new/openQA-5.1783486111.5733fbdf/.github/workflows/compose.yml
--- old/openQA-5.1783327469.933c54e2/.github/workflows/compose.yml      
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/.github/workflows/compose.yml      
2026-07-08 06:48:31.000000000 +0200
@@ -9,6 +9,6 @@
     runs-on: ubuntu-latest
     timeout-minutes: 60
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10  # v6
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # 
v7.0.0
       - name: Verify that containers can be composed
         run: make test-containers-compose
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/.github/workflows/javascript.yml 
new/openQA-5.1783486111.5733fbdf/.github/workflows/javascript.yml
--- old/openQA-5.1783327469.933c54e2/.github/workflows/javascript.yml   
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/.github/workflows/javascript.yml   
2026-07-08 06:48:31.000000000 +0200
@@ -14,9 +14,9 @@
         node-version: [22]
         os: [ubuntu-latest]
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10  # v6
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # 
v7.0.0
       - name: Setup Node (version ${{ matrix.node-version }})
-        uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020  # v4
+        uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e  # 
v6.4.0
         with:
           node-version: ${{ matrix.node-version }}
       - name: npm clean-install
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/.github/workflows/obs-helper.yaml 
new/openQA-5.1783486111.5733fbdf/.github/workflows/obs-helper.yaml
--- old/openQA-5.1783327469.933c54e2/.github/workflows/obs-helper.yaml  
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/.github/workflows/obs-helper.yaml  
2026-07-08 06:48:31.000000000 +0200
@@ -12,7 +12,7 @@
     name: Report OBS URL
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10  # v6
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # 
v7.0.0
       - name: debug
         run: |
           env | sort
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/.github/workflows/prove.yml 
new/openQA-5.1783486111.5733fbdf/.github/workflows/prove.yml
--- old/openQA-5.1783327469.933c54e2/.github/workflows/prove.yml        
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/.github/workflows/prove.yml        
2026-07-08 06:48:31.000000000 +0200
@@ -19,7 +19,7 @@
     container:
       image: 
registry.opensuse.org/devel/openqa/containers/opensuse/openqa_devel:latest
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10  # v6
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # 
v7.0.0
       - name: Build os-autoinst
         run: bash -x tools/ci/build_autoinst.sh
       - name: Make project folder user-writable
@@ -32,7 +32,7 @@
         run: cover -write cover_db cover_db*
       - name: Generate coverage report
         run: make coverage-report-html
-      - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 
 # v4
+      - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a 
 # v7.0.1
         with:
           name: Upload artifacts
           path: |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/Makefile 
new/openQA-5.1783486111.5733fbdf/Makefile
--- old/openQA-5.1783327469.933c54e2/Makefile   2026-07-06 10:44:29.000000000 
+0200
+++ new/openQA-5.1783486111.5733fbdf/Makefile   2026-07-08 06:48:31.000000000 
+0200
@@ -120,7 +120,7 @@
                install -m 644 -D 
--target-directory="$(DESTDIR)/usr/share/openqa/$${f%/*}" "$$f";\
        done
 
-       for i in db images testresults pool/1 cache webui/cache backup; do \
+       for i in db images testresults pool/1 cache cache/podman webui/cache 
backup; do \
                mkdir -p "$(DESTDIR)"/var/lib/openqa/$$i ;\
        done
 # shared dirs between openQA web and workers + compatibility links
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/assets/javascripts/render.js 
new/openQA-5.1783486111.5733fbdf/assets/javascripts/render.js
--- old/openQA-5.1783327469.933c54e2/assets/javascripts/render.js       
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/assets/javascripts/render.js       
2026-07-08 06:48:31.000000000 +0200
@@ -53,7 +53,8 @@
   const E = createElement;
   const params = new URLSearchParams({
     filename: 'autoinst-log.txt',
-    filter: `[step:${module.category},${module.name},${step.num}]`
+    filter: `[step:${module.category},${module.name},${step.num}]`,
+    sl: 1
   });
   const currentPath = window.location.pathname.replace(/\/$/, '');
   const logHref = `${currentPath}/logfile?${params.toString()}`;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/assets/javascripts/test_result.js 
new/openQA-5.1783486111.5733fbdf/assets/javascripts/test_result.js
--- old/openQA-5.1783327469.933c54e2/assets/javascripts/test_result.js  
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/assets/javascripts/test_result.js  
2026-07-08 06:48:31.000000000 +0200
@@ -1,6 +1,8 @@
 // jshint multistr: true
 // jshint esversion: 6
 
+const testGitInfoRe = /TEST_GIT_HASH=([a-fA-F0-9]+) 
TEST_GIT_URL=([^\p{Cc}]+)/u;
+
 const testStatus = {
   state: null,
   result: null,
@@ -635,6 +637,16 @@
       return;
     }
     const lines = Array.from(content);
+    if (logFileElement.dataset.showSourceLinks && 
!logFileElement.dataset.gitBaseUrl) {
+      for (const line of lines) {
+        const found = line.match(testGitInfoRe);
+        if (found) {
+          logFileElement.dataset.gitBaseUrl = found[2] + '/blob/' + found[1];
+          break;
+        }
+      }
+    }
+
     let lineNumber = 0;
     let matchingLines = 0;
     if (string.length > 0) {
@@ -669,6 +681,24 @@
   loadEmbeddedLogFiles(filterLogLines.bind(null, searchBox, false));
 }
 
+const stepRe = / \[step:[a-zA-Z0-9_-]+,[a-zA-Z0-9_-]+,[0-9]+\] /;
+const sourceRe = /(?<= )([a-zA-Z0-9_/.-]+\.p[my]):(\d+)/g;
+function createSourceLinks(logFileElement, lineContentElement) {
+  const E = createElement;
+  const found = lineContentElement.innerHTML.match(stepRe);
+  if (found) {
+    lineContentElement.innerHTML = 
lineContentElement.innerHTML.replace(sourceRe, (match, filePath, lineNumber) => 
{
+      const i = E('i', [''], {class: 'fa-regular fa-file-code fa-lg'});
+      const a = E('a', [i, ` ${filePath}:${lineNumber}`], {
+        class: 'source-link',
+        target: '_blank',
+        href: `${logFileElement.dataset.gitBaseUrl}/${filePath}#L${lineNumber}`
+      });
+      return a.outerHTML;
+    });
+  }
+}
+
 function showLogLines(logFileElement, lines, viaSearchBox = false) {
   const tableElement = document.createElement('table');
   const currentHash = document.location.hash;
@@ -700,6 +730,10 @@
       lineNumberLinkElement.onclick();
     }
     lineContentElement.innerHTML = ansiToHtml(line);
+    if (logFileElement.dataset.gitBaseUrl) {
+      createSourceLinks(logFileElement, lineContentElement);
+    }
+
     lineNumberElement.appendChild(lineNumberLinkElement);
     lineElement.append(lineNumberElement, lineContentElement);
     tableElement.appendChild(lineElement);
@@ -729,11 +763,17 @@
   window.hasHandlerForUpdatingCurrentLine = true;
 }
 
+const srcRe = /tests\/.*\/file\/autoinst-log\.txt/;
 function loadEmbeddedLogFiles(filter) {
   $('.embedded-logfile').each(function (index, logFileElement) {
     if (logFileElement.dataset.contentsLoaded) {
       return;
     }
+    const params = new URLSearchParams(window.location.search);
+    const found = logFileElement.dataset.src.match(srcRe);
+    if (found && params.get('sl')) {
+      logFileElement.dataset.showSourceLinks = true;
+    }
     fetch(logFileElement.dataset.src)
       .then(response => {
         if (!response.ok) throw `Server returned ${response.status}: 
${response.statusText}`;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/dist/rpm/openQA.spec 
new/openQA-5.1783486111.5733fbdf/dist/rpm/openQA.spec
--- old/openQA-5.1783327469.933c54e2/dist/rpm/openQA.spec       2026-07-06 
10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/dist/rpm/openQA.spec       2026-07-08 
06:48:31.000000000 +0200
@@ -643,7 +643,6 @@
 %dir %{_sysconfdir}/openqa/database.ini.d
 %{_datadir}/doc/openqa/examples/openqa.ini
 %{_datadir}/doc/openqa/examples/database.ini
-%dir %{_datadir}/openqa
 %config %{_sysconfdir}/logrotate.d
 # apache vhost
 %dir %{_sysconfdir}/apache2
@@ -834,6 +833,7 @@
 %dir %{_localstatedir}/lib/openqa/pool
 %defattr(-,_openqa-worker,root)
 %dir %{_localstatedir}/lib/openqa/cache
+%dir %{_localstatedir}/lib/openqa/cache/podman
 # own one pool - to create the others is task of the admin
 %dir %{_localstatedir}/lib/openqa/pool/1
 %if 0%{?suse_version} > 1500
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/lib/OpenQA/Parser/Format/XUnit.pm 
new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Parser/Format/XUnit.pm
--- old/openQA-5.1783327469.933c54e2/lib/OpenQA/Parser/Format/XUnit.pm  
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Parser/Format/XUnit.pm  
2026-07-08 06:48:31.000000000 +0200
@@ -11,7 +11,7 @@
 
 sub addproperty ($self, $prop) { 
$self->{properties}->add(OpenQA::Parser::Result::XUnit::Property->new($prop)) }
 
-my %TC_RESULT_BY_TAG = (softfailure => 'softfail', failure => 'fail', error => 
'fail');
+my %TC_RESULT_BY_TAG = (softfailure => 'softfail', failure => 'fail', error => 
'fail', skipped => 'missing');
 
 sub parse ($self, $xml) {
     confess 'No XML given/loaded' unless $xml;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/lib/OpenQA/Task/Job/Limit.pm 
new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Task/Job/Limit.pm
--- old/openQA-5.1783327469.933c54e2/lib/OpenQA/Task/Job/Limit.pm       
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Task/Job/Limit.pm       
2026-07-08 06:48:31.000000000 +0200
@@ -5,10 +5,11 @@
 use Mojo::Base 'Mojolicious::Plugin', -signatures;
 
 use OpenQA::Jobs::Constants;
-use OpenQA::Log 'log_debug';
+use OpenQA::Log qw(log_debug log_info);
 use OpenQA::ScreenshotDeletion;
 use OpenQA::Utils qw(:DEFAULT resultdir archivedir check_df);
-use OpenQA::Task::Utils qw(acquire_limit_lock_or_retry 
finish_job_if_disk_usage_below_percentage);
+use OpenQA::Task::Utils
+  qw(acquire_limit_lock_or_retry finish_job_if_disk_usage_below_percentage 
is_disk_usage_below_percentage);
 use OpenQA::Task::SignalGuard;
 use Scalar::Util 'looks_like_number';
 use List::Util 'min';
@@ -55,6 +56,17 @@
     my $gru = $app->gru;
     my %options = (priority => -20, ttl => 2 * ONE_DAY);
     while (my $group = $groups->next) {
+        if (
+            my $msg = is_disk_usage_below_percentage(
+                job => $job,
+                setting => 'result_cleanup_max_free_percentage',
+                dir => resultdir
+            ))
+        {
+            log_info "Early abort during job groups loop: $msg";
+            $job->note(early_abort_results => $msg);
+            last;
+        }
         my @preserved_important_jobs;
         $group->limit_results_and_logs(\@preserved_important_jobs);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/lib/OpenQA/Task/Utils.pm 
new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Task/Utils.pm
--- old/openQA-5.1783327469.933c54e2/lib/OpenQA/Task/Utils.pm   2026-07-06 
10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Task/Utils.pm   2026-07-08 
06:48:31.000000000 +0200
@@ -5,13 +5,14 @@
 use Mojo::Base -signatures;
 
 use Exporter qw(import);
-use OpenQA::Log qw(log_warning);
+use OpenQA::Log qw(log_warning log_info);
 use OpenQA::Utils qw(check_df);
 use Scalar::Util qw(looks_like_number);
 use Time::Seconds;
 use Feature::Compat::Try;
 
-our @EXPORT_OK = (qw(acquire_limit_lock_or_retry 
finish_job_if_disk_usage_below_percentage));
+our @EXPORT_OK
+  = (qw(acquire_limit_lock_or_retry finish_job_if_disk_usage_below_percentage 
is_disk_usage_below_percentage));
 
 # acquire lock to prevent multiple limit_* tasks to run in parallel unless
 # concurrency is configured to be allowed
@@ -24,7 +25,7 @@
     return 0;
 }
 
-sub finish_job_if_disk_usage_below_percentage (%args) {
+sub is_disk_usage_below_percentage (%args) {
     my $job = $args{job};
     my $percentage = $job->app->config->{misc_limits}->{$args{setting}};
 
@@ -44,9 +45,17 @@
 
     my $free_percentage = $available_bytes / $total_bytes * 100;
     return undef if $free_percentage <= $percentage;
-    $job->finish("Skipping, free disk space on '$dir' exceeds configured 
percentage $percentage %"
-          . " (free percentage: $free_percentage %)");
-    return 1;
+    return
+"Skipping, free disk space on '$dir' exceeds configured percentage $percentage 
% (free percentage: $free_percentage %)";
+}
+
+sub finish_job_if_disk_usage_below_percentage (%args) {
+    if (my $msg = is_disk_usage_below_percentage(%args)) {
+        log_info $msg;
+        $args{job}->finish($msg);
+        return 1;
+    }
+    return undef;
 }
 
 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/lib/OpenQA/Worker/Engines/isotovideo.pm 
new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Worker/Engines/isotovideo.pm
--- old/openQA-5.1783327469.933c54e2/lib/OpenQA/Worker/Engines/isotovideo.pm    
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Worker/Engines/isotovideo.pm    
2026-07-08 06:48:31.000000000 +0200
@@ -537,6 +537,7 @@
           // 
'registry.opensuse.org/devel/openqa/containers/os-autoinst_dev:latest';
 
         my $podman_dir = prjdir() . '/cache/podman';
+        path($podman_dir)->make_path;
         my @cmd = (
             'env',
             "HOME=$podman_dir",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/05-scheduler-full.t 
new/openQA-5.1783486111.5733fbdf/t/05-scheduler-full.t
--- old/openQA-5.1783327469.933c54e2/t/05-scheduler-full.t      2026-07-06 
10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/t/05-scheduler-full.t      2026-07-08 
06:48:31.000000000 +0200
@@ -5,6 +5,7 @@
 
 use Test::Most;
 use Test::Warnings ':report_warnings';
+use Mojo::Base -signatures;
 use OpenQA::Utils;
 
 BEGIN {
@@ -53,6 +54,7 @@
 # setup directories and database
 my $tempdir = setup_fullstack_temp_dir('scheduler');
 my $schema = OpenQA::Test::Database->new->create(fixtures_glob => '01-jobs.pl 
02-workers.pl');
+my $workers = $schema->resultset('Workers');
 my $api_credentials = create_user_for_workers;
 my $api_key = $api_credentials->key;
 my $api_secret = $api_credentials->secret;
@@ -70,8 +72,10 @@
 my $resultdir = path($ENV{OPENQA_BASEDIR}, 'openqa', 'testresults')->make_path;
 ok -d $resultdir, "results directory created under $resultdir";
 
-sub create_worker {
-    my ($apikey, $apisecret, $host, $instance, $log) = @_;
+my $last_worker_id = $workers->find({}, {order_by => {-desc => 'id'}, rows => 
1})->id;
+sub expected_worker_id ($instance_number) { $last_worker_id + $instance_number 
}
+
+sub create_worker ($apikey, $apisecret, $host, $instance, $log = undef) {
     my @connect_args = ("--instance=${instance}", "--apikey=${apikey}", 
"--apisecret=${apisecret}", "--host=${host}");
     note "Starting standard worker. Instance: $instance for host $host";
     # save testing time as we do not test a webUI host being down for
@@ -84,23 +88,21 @@
 
 sub stop_workers { stop_service($_, 1) for @workers }
 
-sub dead_workers {
-    my $schema = shift;
-    $_->update({t_seen => DateTime->from_epoch(epoch => time - 
DEFAULT_WORKER_TIMEOUT - DB_TIMESTAMP_ACCURACY)})
-      for $schema->resultset('Workers')->all();
+sub mark_all_workers_as_dead ($schema) {
+    $workers->update({t_seen => DateTime->from_epoch(epoch => time - 
DEFAULT_WORKER_TIMEOUT - DB_TIMESTAMP_ACCURACY)});
 }
 
 # waits until a worker with the given ID has registered; this does not mean 
its ws connection is ready so we might still need to retry job allocation
-sub wait_for_worker {
-    my ($schema, $id, %opts) = @_;
+sub wait_for_worker ($schema, $instance_number, %opts) {
+    my $expected_id = expected_worker_id($instance_number);
     my $expected_error = $opts{error};
     wait_for_or_bail_out {
-        my $worker = $schema->resultset('Workers')->find($id);
+        my $worker = $workers->find($expected_id);
         defined $worker
           && !$worker->dead
           && (!defined $expected_error || ($worker->error // '') eq 
$expected_error);
     }
-    "worker $id to be active";
+    "worker instance $instance_number has registered with ID $expected_id";
 }
 
 my $job_model = OpenQA::Scheduler::Model::Jobs->singleton;
@@ -118,8 +120,7 @@
     note 'starting two workers';
     my $new_job = 
$schema->resultset('Jobs')->find(80000)->auto_duplicate({settings => 
{WORKER_CLASS => 'foo'}});
     @workers = map { create_worker(@$worker_settings, $_) } (1, 2);
-    wait_for_worker($schema, 3);
-    wait_for_worker($schema, 4);
+    wait_for_worker($schema, $_) for (1, 2);
 
     note 'assigning one job to each worker';
     wait_for_or_bail_out { push @$allocated, @{$job_model->schedule}; 
@$allocated >= 2 } 'two jobs allocated';
@@ -142,7 +143,7 @@
     $new_job->delete;
 
     stop_workers;
-    dead_workers($schema);
+    mark_all_workers_as_dead($schema);
 };
 
 subtest 're-scheduling and incompletion of jobs when worker rejects jobs or 
goes offline' => sub {
@@ -160,22 +161,22 @@
 
     # simulate a worker in broken state; it will register itself but declare 
itself as broken
     @workers = broken_worker(@$worker_settings, 3, 'out of order');
-    wait_for_worker($schema, 5, error => 'out of order');
+    wait_for_worker($schema, 3, error => 'out of order');
     $allocated = $job_model->schedule;
     is @$allocated, 0, 'scheduler does not consider broken worker for 
allocating job';
     stop_workers;
-    dead_workers($schema);
+    mark_all_workers_as_dead($schema);
 
     # simulate a worker in idle state that rejects all jobs assigned to it
     @workers = rejective_worker(@$worker_settings, 3, 'rejection reason');
     $allocated = [];
-    wait_for_worker($schema, 5);
+    wait_for_worker($schema, 3);
 
     note 'waiting for job to be assigned and set back to re-scheduled';
     wait_for_or_bail_out { push @$allocated, @{$job_model->schedule}; 
@$allocated >= 1 } 'at least one job allocated';
     is @$allocated, 1, 'one job allocated'
       and is @{$allocated}[0]->{job}, $duplicated_id, 'right job allocated'
-      and is @{$allocated}[0]->{worker}, 5, 'job allocated to expected worker';
+      and is @{$allocated}[0]->{worker}, expected_worker_id(3), 'job allocated 
to expected worker';
     my $job_assigned = 0;
     my $job_scheduled = 0;
     for (0 .. 100) {
@@ -192,25 +193,26 @@
     }
     ok $job_scheduled, 'assigned job set back to scheduled if worker reports 
back again but has abandoned the job';
     stop_workers;
-    dead_workers($schema);
+    mark_all_workers_as_dead($schema);
 
     # start an unstable worker; it will register itself but ignore any job 
assignment (also not explicitly reject
     # assignments)
     @workers = unstable_worker(@$worker_settings, 3, -1);
     $allocated = [];
-    wait_for_worker($schema, 5);
+    wait_for_worker($schema, 3);
     wait_for_or_bail_out { push @$allocated, @{$job_model->schedule}; 
@$allocated >= 1 } 'at least one job allocated';
     is @$allocated, 1, 'one job allocated'
       and is @{$allocated}[0]->{job}, $duplicated_id, 'right job allocated'
-      and is @{$allocated}[0]->{worker}, 5, 'job allocated to expected worker';
+      and is @{$allocated}[0]->{worker}, expected_worker_id(3), 'job allocated 
to expected worker';
 
     # kill the worker but assume the job has been actually started and is 
running
     # note: Also setting back assigned_worker_id and result because the worker 
might have actually picked up the job.
     stop_workers;
-    $jobs->find($duplicated_id)->update({assigned_worker_id => 5, state => 
RUNNING, result => NONE});
+    $jobs->find($duplicated_id)
+      ->update({assigned_worker_id => expected_worker_id(3), state => RUNNING, 
result => NONE});
 
     @workers = unstable_worker(@$worker_settings, 3, -1);
-    wait_for_worker($schema, 5);
+    wait_for_worker($schema, 3);
     wait_for { $jobs->find($duplicated_id)->state eq DONE } "job 
$duplicated_id is incompleted", {timeout => 20};
 
     my $job = $jobs->find($duplicated_id);
@@ -219,18 +221,17 @@
     like $job->reason, qr/abandoned: associated worker .+:\d+ re-connected but 
abandoned the job/, 'reason is set';
 
     stop_workers;
-    dead_workers($schema);
+    mark_all_workers_as_dead($schema);
 };
 
-subtest 'Simulation of heavy unstable load' => sub {
-    dead_workers($schema);
+subtest 'behavior in presence of unresponsive and unstable workers' => sub {
+    mark_all_workers_as_dead($schema);
 
     # duplicate latest jobs ignoring failures
     my @duplicated = map { my $dup = $_->auto_duplicate; ref $dup ? $dup : () 
} $schema->resultset('Jobs')->latest_jobs;
-    my $nr = $ENV{OPENQA_SCHEDULER_TEST_UNRESPONSIVE_COUNT} // ($ENV{CI} ? 10 
: 50);
+    my $nr = $ENV{OPENQA_SCHEDULER_TEST_UNRESPONSIVE_COUNT} // 10;
     @workers = map { unresponsive_worker(@$worker_settings, $_) } (1 .. $nr);
-    my $i = 2;
-    wait_for_worker($schema, ++$i) for 1 .. $nr;
+    wait_for_worker($schema, $_) for 1 .. $nr;
 
     my $allocated = [];    # Will try to allocate to previous worker and fail!
     wait_for_or_bail_out { push @$allocated, @{$job_model->schedule}; 
@$allocated >= 10 } 'at least ten jobs allocated';
@@ -252,12 +253,11 @@
         is $dup->state, SCHEDULED, 'Job(' . $dup->id . ') back in scheduled 
state';
     }
     stop_workers;
-    dead_workers($schema);
+    mark_all_workers_as_dead($schema);
 
-    my $unstable_workers = $ENV{OPENQA_SCHEDULER_TEST_UNSTABLE_COUNT} // 30;
+    my $unstable_workers = $ENV{OPENQA_SCHEDULER_TEST_UNSTABLE_COUNT} // 10;
     @workers = map { unstable_worker(@$worker_settings, $_, 3) } (1 .. 
$unstable_workers);
-    $i = 5;
-    wait_for_worker($schema, ++$i) for 0 .. 12;
+    wait_for_worker($schema, $_) for 1 .. $unstable_workers;
 
     $allocated = $job_model->schedule;    # Will try to allocate to previous 
worker and fail!
     is @$allocated, 0, 'All failed allocation on second step - workers were 
killed';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/30-test_parser.t 
new/openQA-5.1783486111.5733fbdf/t/30-test_parser.t
--- old/openQA-5.1783327469.933c54e2/t/30-test_parser.t 2026-07-06 
10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/t/30-test_parser.t 2026-07-08 
06:48:31.000000000 +0200
@@ -454,6 +454,8 @@
       'Overall 11 testsuites, 2 tests does not have title containing bacon';
     is $parser->results->search_in_details('text', qr/bacon/)->size, 16,
       'Overall 11 testsuites, 15 tests are for bacon';
+    is $parser->results->search_in_details('result', qr/^missing$/)->size, 3,
+      'skipped testcases are mapped to missing, not ok';
     is $parser->generated_tests_output->size, 24, '24 Outputs';
 
     my $resultsdir = tempdir;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/42-df-based-cleanup.t 
new/openQA-5.1783486111.5733fbdf/t/42-df-based-cleanup.t
--- old/openQA-5.1783327469.933c54e2/t/42-df-based-cleanup.t    2026-07-06 
10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/t/42-df-based-cleanup.t    2026-07-08 
06:48:31.000000000 +0200
@@ -62,14 +62,19 @@
 subtest 'abort early if there is enough free disk space' => sub {
 
     $app->config->{misc_limits}->{result_cleanup_max_free_percentage} = 10;
-    my $job = run_gru_job($app, limit_results_and_logs => []);
+    my $job;
+    combined_like { $job = run_gru_job($app, limit_results_and_logs => []) }
+    qr/Skipping, free disk space on '.*' exceeds configured percentage 10 % 
\(free percentage: 11 %\)/,
+      'result cleanup early abort logged';
     is $job->{state}, 'finished', 'result cleanup still considered successful';
     like $job->{result},
       qr|Skipping.*/openqa/testresults.*exceeds configured percentage 10 % 
\(free percentage: 11 %\)|,
       'result cleanup aborted early';
 
     $app->config->{misc_limits}->{asset_cleanup_max_free_percentage} = 9;
-    $job = run_gru_job($app, limit_assets => []);
+    combined_like { $job = run_gru_job($app, limit_assets => []) }
+    qr/Skipping, free disk space on '.*' exceeds configured percentage 9 % 
\(free percentage: 11 %\)/,
+      'asset cleanup early abort logged';
     is $job->{state}, 'finished', 'asset cleanup still considered successful';
     like $job->{result},
       qr|Skipping.*/openqa/share/factory.*exceeds configured percentage 9 % 
\(free percentage: 11 %\)|,
@@ -90,6 +95,27 @@
     is $job->{state}, undef, 'job not finished when proceeding with cleanup';
 };
 
+subtest 'abort early during the loop' => sub {
+    # We will simulate `df` returning low space on the first call, and high 
space on the second call.
+    my $df_call_count = 0;
+    my @bavail = (5);
+    $df_mock->redefine(df => sub ($dir, @) { {bavail => 
$bavail[$df_call_count++] // 20, blocks => 100} });
+    $app->config->{misc_limits}->{result_cleanup_max_free_percentage} = 10;
+
+    my $group_bar = $app->schema->resultset('JobGroups')->create({name => 
'bar'});
+    my $loop_job;
+    combined_like { $loop_job = run_gru_job($app, limit_results_and_logs => 
[]) }
+qr/Early abort during job groups loop: Skipping, free disk space on '.*' 
exceeds configured percentage 10 % \(free percentage: 20 %\)/,
+      'early abort during loop logged';
+    is $loop_job->{state}, 'finished', 'result cleanup still considered 
successful';
+    like $loop_job->{notes}->{early_abort_results},
+      qr|Skipping.*/openqa/testresults.*exceeds configured percentage 10 % 
\(free percentage: 20 %\)|,
+      'result cleanup aborted early inside the loop';
+    $group_bar->delete;
+
+    $mock_df->();    # restore
+};
+
 $app->config->{misc_limits}->{result_cleanup_max_free_percentage} = 100;
 $app->config->{misc_limits}->{asset_cleanup_max_free_percentage} = 100;
 $app->config->{misc_limits}->{dry_min_free_disk_space_cleanup} = 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/t/testresults/00099/00099946-opensuse-13.1-DVD-i586-Build0091-textmode/autoinst-log.txt
 
new/openQA-5.1783486111.5733fbdf/t/testresults/00099/00099946-opensuse-13.1-DVD-i586-Build0091-textmode/autoinst-log.txt
--- 
old/openQA-5.1783327469.933c54e2/t/testresults/00099/00099946-opensuse-13.1-DVD-i586-Build0091-textmode/autoinst-log.txt
    2026-07-06 10:44:29.000000000 +0200
+++ 
new/openQA-5.1783486111.5733fbdf/t/testresults/00099/00099946-opensuse-13.1-DVD-i586-Build0091-textmode/autoinst-log.txt
    2026-07-08 06:48:31.000000000 +0200
@@ -1281,6 +1281,10 @@
  waiting for console read thread to quit...
 WARNING: read qmp 145 - {"timestamp": {"seconds": 1392728646, "microseconds": 
936768}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "ide1-cd0", 
"tray-open": true}}
 
+[2026-06-22T20:28:39.215621+02:00] [debug] [pid:14231] TEST_GIT_HASH=c0ffee 
TEST_GIT_URL=https://example.org/fortest
+[2026-06-22T20:29:10.379120+02:00] [debug] [pid:14264] 
[step:installation,bootloader,1] tests/installaton/bootloader.pm:5 called 
utils::wait_for_desktop -> lib/utils.pm:47 called utils::handle_gui_password
+[2026-06-22T20:29:10.379120+02:00] [debug] [pid:14264] 
[step:installation,bootloader,2] tests/installaton/bootloader.pm:5 called 
utils::wait_for_desktop -> lib/utils.pm:47 called utils::handle_gui_password
+
 ALARM: backend.run got deleted! - exiting...
 read HMP failed: 
 management thread exit at 2014-02-18 13:04:07
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/ui/18-tests-details.t 
new/openQA-5.1783486111.5733fbdf/t/ui/18-tests-details.t
--- old/openQA-5.1783327469.933c54e2/t/ui/18-tests-details.t    2026-07-06 
10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/t/ui/18-tests-details.t    2026-07-08 
06:48:31.000000000 +0200
@@ -492,8 +492,18 @@
             my $link = $log_link_elems[0];
             is $link->get_attribute('title'), 'Jump to logfile', 'log link 
exists';
             like $link->get_attribute('href'),
-              
qr{/tests/99946/logfile\?filename=autoinst-log\.txt&filter=.*step.*installation.*bootloader.*$step},
+              
qr{/tests/99946/logfile\?filename=autoinst-log\.txt&filter=.*step.*installation.*bootloader.*$step.*sl=1},
               'log href correct';
+
+            $link->click;
+            wait_for_ajax msg => 'log contents';
+            like $driver->find_element('.embedded-logfile')->get_text,
+              qr/ \[step:installation,bootloader,$step\].* called /, 'test';
+            my @source_links = $driver->find_element_by_class('source-link');
+            my $sl = $source_links[0];
+            is $sl->get_attribute('href'),
+              
'https://example.org/fortest/blob/c0ffee/tests/installaton/bootloader.pm#L5', 
'source link ok';
+            $driver->go_back;
         };
     }
 };
@@ -579,14 +589,14 @@
     like $driver->find_element('.embedded-logfile')->get_text, 
qr{/usr/bin/qemu-kvm}, 'qemu-kvm is shown in log viewer';
 
     $driver->find_element('#filter-log-file')->send_keys('kate');
-    wait_until(sub { $driver->find_element('#filter-info')->get_text =~ 
qr{Showing 3 / 1292 lines} },
+    wait_until(sub { $driver->find_element('#filter-info')->get_text =~ 
qr{Showing 3 / 1296 lines} },
         'Showing filter result info for substring');
     unlike $driver->find_element('.embedded-logfile')->get_text, 
qr{/usr/bin/qemu-kvm},
       'qemu-kvm is not shown when filtering for something else';
     $driver->find_element('#filter-log-file')->clear;
     wait_until(sub { $driver->find_element('#filter-info')->get_text eq '' }, 
'Filter result info cleared');
     $driver->find_element('#filter-log-file')->send_keys('/kate-[12]/');
-    wait_until(sub { $driver->find_element('#filter-info')->get_text =~ 
qr{Showing 2 / 1292 lines} },
+    wait_until(sub { $driver->find_element('#filter-info')->get_text =~ 
qr{Showing 2 / 1296 lines} },
         'Showing filter result info for regex');
 
     my $url = Mojo::URL->new($driver->execute_script('return 
document.location.toString()'));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/ui/26-jobs_restart.t 
new/openQA-5.1783486111.5733fbdf/t/ui/26-jobs_restart.t
--- old/openQA-5.1783327469.933c54e2/t/ui/26-jobs_restart.t     2026-07-06 
10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/t/ui/26-jobs_restart.t     2026-07-08 
06:48:31.000000000 +0200
@@ -91,6 +91,8 @@
 $driver->title_is('openQA', 'on main page');
 $driver->find_element_by_link_text('Login')->click();
 
+sub flash_messages { $driver->find_element('#flash-messages')->get_text }
+
 subtest 'restart job from info panel in test results' => sub {
     subtest 'parent job shows options for advanced restart' => sub {
         $driver->get_ok('/tests/99900', 'go to job 99900');
@@ -122,10 +124,8 @@
         $driver->find_element('#restart-result')->click();
         wait_for_ajax(msg => 'fail to start job with missing asset and no 
parent');
         like $driver->get_current_url, qr|tests/99939|, 'no auto refresh when 
there are errors/warnings';
-        like
-          $driver->find_element('#flash-messages')->get_text,
-          qr/Job 99939 misses.*\.iso.*Ensure to provide mandatory assets/s,
-          'restarting job with missing asset results in an error';
+        wait_until(sub { flash_messages =~ m/Job 99939 misses.*\.iso.*Ensure 
to provide mandatory assets/s },
+            'restarting job with missing asset results in an error', 20);
     };
     subtest 'assets missing; there is a parent' => sub {
         $schema->resultset('JobDependencies')
@@ -133,11 +133,8 @@
             {child_job_id => 99939, parent_job_id => 99947, dependency => 
OpenQA::JobDependencies::Constants::CHAINED});
         is $driver->get('/tests/99939'), 1, 'go to job 99939';
         $driver->find_element('#restart-result')->click();
-        wait_for_ajax(msg => 'fail to start job with missing asset and no 
parent');
-        like
-          $driver->find_element('#flash-messages')->get_text,
-          qr/Job 99939 misses.*\.iso.*You may try to retrigger the parent 
job/s,
-          'restarting job with missing asset results in an error';
+        wait_until(sub { flash_messages =~ m/Job 99939 misses.*\.iso.*You may 
try to retrigger the parent job/s },
+            'restarting job with missing asset results in an error', 20);
     };
     subtest 'force restart' => sub {
         update_last_job_id;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1783327469.933c54e2/templates/webapi/step/viewimg.html.ep 
new/openQA-5.1783486111.5733fbdf/templates/webapi/step/viewimg.html.ep
--- old/openQA-5.1783327469.933c54e2/templates/webapi/step/viewimg.html.ep      
2026-07-06 10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/templates/webapi/step/viewimg.html.ep      
2026-07-08 06:48:31.000000000 +0200
@@ -91,7 +91,7 @@
         % if ($video_file_name && $frametime) {
             %= stepvideolink_for $testid, $video_file_name, $frametime
         % }
-        %= steploglink_for 'Jump to logfile' => 
url_for('logfile')->query(filename => 'autoinst-log.txt', filter => 
sprintf("[step:%s,%s,%d]", $module->category, $module->name, param 'stepid')), 
'fa-file-lines', 'view_log'
+        %= steploglink_for 'Jump to logfile' => 
url_for('logfile')->query(filename => 'autoinst-log.txt', filter => 
sprintf("[step:%s,%s,%d]", $module->category, $module->name, param 'stepid'), 
sl => 1), 'fa-file-lines', 'view_log'
     </span>
 </div>
 <div id="needle_diff">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/tools/ci/autoinst.sha 
new/openQA-5.1783486111.5733fbdf/tools/ci/autoinst.sha
--- old/openQA-5.1783327469.933c54e2/tools/ci/autoinst.sha      2026-07-06 
10:44:29.000000000 +0200
+++ new/openQA-5.1783486111.5733fbdf/tools/ci/autoinst.sha      2026-07-08 
06:48:31.000000000 +0200
@@ -1 +1 @@
-c3cb41daa60ce53156b4c36222a89e14145e7c93
\ No newline at end of file
+ad31d328dcfe42082b3805e7d883e56296d687e5
\ No newline at end of file

++++++ openQA.obsinfo ++++++
--- /var/tmp/diff_new_pack.Nd9aIV/_old  2026-07-08 17:40:23.597537028 +0200
+++ /var/tmp/diff_new_pack.Nd9aIV/_new  2026-07-08 17:40:23.601537168 +0200
@@ -1,5 +1,5 @@
 name: openQA
-version: 5.1783327469.933c54e2
-mtime: 1783327469
-commit: 933c54e227e654c9db2fc2394abe5ef5f00f2130
+version: 5.1783486111.5733fbdf
+mtime: 1783486111
+commit: 5733fbdf1f5b1b7a3dae7c428aa74651ad1750ea
 

Reply via email to