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