Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ansible-core for openSUSE:Factory checked in at 2026-02-03 21:28:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ansible-core (Old) and /work/SRC/openSUSE:Factory/.ansible-core.new.1995 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ansible-core" Tue Feb 3 21:28:31 2026 rev:52 rq:1330330 version:2.20.2 Changes: -------- --- /work/SRC/openSUSE:Factory/ansible-core/ansible-core.changes 2025-12-11 18:44:52.694389340 +0100 +++ /work/SRC/openSUSE:Factory/.ansible-core.new.1995/ansible-core.changes 2026-02-03 21:29:47.296322512 +0100 @@ -1,0 +2,37 @@ +Fri Jan 30 08:22:41 UTC 2026 - Johannes Kastl <[email protected]> + +- update to 2.20.2: + https://github.com/ansible/ansible/blob/v2.20.2/changelogs/CHANGELOG-v2.20.rst + * Minor Changes + - ansible-test - Replace RHEL 10.0 remote with 10.1. + - ansible-test - Replace RHEL 9.6 remote with 9.7. + * Bugfixes + - Fix Windows LIB env var corruption + (ansible-collections/ansible.windows#297). + - ansible, ansible-console - fix executing - meta: end_play + tasks. + - ansible-test - Upgrade expat during provisioning of Fedora 42 + remote instances. + - ansible_local will no longer trigger variable injection + default value deprecation. + - copy - when a single-file local directory was specified as + the source, changed used to be false even when the source was + actually copied. It now makes sure changed is true in this + case. (#85833) + - deb822_repository - Remove Install-Python-Debian from files + outputed by the deb822_repository module (#86395) + - dnf - When installing a dnf module, install and enable when + missing, upgrade when present (#73457) + - dnf - fix package installation when specifying architecture + without version (e.g., libgcc.i686) where a different + architecture of the same package is already installed + (#86156). + - package, service, gather_facts - fix templating + module_defaults for modules executed by these action plugins. + (#85848) + - winrm - Provide a better error message if a domain user is + specified using a User Principal Name (UPN) but the + pykerberos library is not installed so Kerberos is + unavailable. + +------------------------------------------------------------------- Old: ---- ansible_core-2.20.1.tar.gz ansible_core-2.20.1.tar.gz.sha256 New: ---- ansible_core-2.20.2.tar.gz ansible_core-2.20.2.tar.gz.sha256 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ansible-core.spec ++++++ --- /var/tmp/diff_new_pack.Z1e6HU/_old 2026-02-03 21:29:48.148358275 +0100 +++ /var/tmp/diff_new_pack.Z1e6HU/_new 2026-02-03 21:29:48.156358610 +0100 @@ -1,7 +1,7 @@ # # spec file for package ansible-core # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -43,7 +43,7 @@ %endif Name: ansible-core -Version: 2.20.1 +Version: 2.20.2 Release: 0 Summary: Radically simple IT automation License: GPL-3.0-or-later ++++++ ansible_core-2.20.1.tar.gz -> ansible_core-2.20.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/PKG-INFO new/ansible_core-2.20.2/PKG-INFO --- old/ansible_core-2.20.1/PKG-INFO 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/PKG-INFO 2026-01-29 20:20:02.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: ansible-core -Version: 2.20.1 +Version: 2.20.2 Summary: Radically simple IT automation Author: Ansible Project Project-URL: Homepage, https://ansible.com/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/ansible_core.egg-info/PKG-INFO new/ansible_core-2.20.2/ansible_core.egg-info/PKG-INFO --- old/ansible_core-2.20.1/ansible_core.egg-info/PKG-INFO 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/ansible_core.egg-info/PKG-INFO 2026-01-29 20:20:02.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: ansible-core -Version: 2.20.1 +Version: 2.20.2 Summary: Radically simple IT automation Author: Ansible Project Project-URL: Homepage, https://ansible.com/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/ansible_core.egg-info/SOURCES.txt new/ansible_core-2.20.2/ansible_core.egg-info/SOURCES.txt --- old/ansible_core-2.20.1/ansible_core.egg-info/SOURCES.txt 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/ansible_core.egg-info/SOURCES.txt 2026-01-29 20:20:02.000000000 +0100 @@ -816,6 +816,7 @@ test/integration/targets/add_host/tasks/main.yml test/integration/targets/adhoc/aliases test/integration/targets/adhoc/runme.sh +test/integration/targets/adhoc/roles/end_play/tasks/main.yml test/integration/targets/ansiballz_debug/aliases test/integration/targets/ansiballz_debug/tasks/main.yml test/integration/targets/ansiballz_debugging/aliases @@ -846,6 +847,7 @@ test/integration/targets/ansible-config/tasks/main.yml test/integration/targets/ansible-console/aliases test/integration/targets/ansible-console/runme.sh +test/integration/targets/ansible-console/roles/end_play/tasks/main.yml test/integration/targets/ansible-doc/aliases test/integration/targets/ansible-doc/fakecollrole.output test/integration/targets/ansible-doc/fakemodule.output @@ -1957,6 +1959,7 @@ test/integration/targets/copy/files/subdir/subdir1/empty.txt test/integration/targets/copy/files/subdir/subdir2/baz.txt test/integration/targets/copy/files/subdir/subdir2/subdir3/subdir4/qux.txt +test/integration/targets/copy/files/subdir_with_deep_single_file/dir/file.txt test/integration/targets/copy/meta/main.yml test/integration/targets/copy/tasks/acls.yml test/integration/targets/copy/tasks/check_mode.yml @@ -1966,6 +1969,7 @@ test/integration/targets/copy/tasks/no_log.yml test/integration/targets/copy/tasks/selinux.yml test/integration/targets/copy/tasks/setgid.yml +test/integration/targets/copy/tasks/src_directory_contaning_one_single_file.yml test/integration/targets/copy/tasks/src_file_dest_file_in_non_existent_dir.yml test/integration/targets/copy/tasks/src_file_dest_file_in_non_existent_dir_remote_src.yml test/integration/targets/copy/tasks/src_remote_file_is_not_file.yml @@ -4743,6 +4747,8 @@ test/sanity/code-smell/mypy.py test/sanity/code-smell/mypy.requirements.in test/sanity/code-smell/mypy.requirements.txt +test/sanity/code-smell/no-s3.json +test/sanity/code-smell/no-s3.py test/sanity/code-smell/no-unwanted-characters.json test/sanity/code-smell/no-unwanted-characters.py test/sanity/code-smell/no-unwanted-files.json diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/changelogs/CHANGELOG-v2.20.rst new/ansible_core-2.20.2/changelogs/CHANGELOG-v2.20.rst --- old/ansible_core-2.20.1/changelogs/CHANGELOG-v2.20.rst 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/changelogs/CHANGELOG-v2.20.rst 2026-01-29 20:20:02.000000000 +0100 @@ -4,6 +4,35 @@ .. contents:: Topics +v2.20.2 +======= + +Release Summary +--------------- + +| Release Date: 2026-01-29 +| `Porting Guide <https://docs.ansible.com/ansible-core/2.20/porting_guides/porting_guide_core_2.20.html>`__ + +Minor Changes +------------- + +- ansible-test - Replace RHEL 10.0 remote with 10.1. +- ansible-test - Replace RHEL 9.6 remote with 9.7. + +Bugfixes +-------- + +- Fix Windows LIB env var corruption (https://github.com/ansible-collections/ansible.windows/issues/297). +- ``ansible``, ``ansible-console`` - fix executing ``- meta: end_play`` tasks. +- ansible-test - Upgrade ``expat`` during provisioning of Fedora 42 remote instances. +- ansible_local will no longer trigger variable injection default value deprecation. +- copy - when a single-file local directory was specified as the source, ``changed`` used to be ``false`` even when the source was actually copied. It now makes sure ``changed`` is ``true`` in this case. (https://github.com/ansible/ansible/issues/85833) +- deb822_repository - Remove ``Install-Python-Debian`` from files outputed by the ``deb822_repository`` module (https://github.com/ansible/ansible/issues/86395) +- dnf - When installing a dnf module, install and enable when missing, upgrade when present (https://github.com/ansible/ansible/issues/73457) +- dnf - fix package installation when specifying architecture without version (e.g., ``libgcc.i686``) where a different architecture of the same package is already installed (https://github.com/ansible/ansible/issues/86156). +- package, service, gather_facts - fix templating module_defaults for modules executed by these action plugins. (https://github.com/ansible/ansible/issues/85848) +- winrm - Provide a better error message if a domain user is specified using a User Principal Name (``UPN``) but the ``pykerberos`` library is not installed so Kerberos is unavailable. + v2.20.1 ======= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/changelogs/changelog.yaml new/ansible_core-2.20.2/changelogs/changelog.yaml --- old/ansible_core-2.20.1/changelogs/changelog.yaml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/changelogs/changelog.yaml 2026-01-29 20:20:02.000000000 +0100 @@ -438,3 +438,59 @@ - getuser-exception-handling.yml - varloaderror.yml release_date: '2025-12-02' + 2.20.2: + changes: + release_summary: '| Release Date: 2026-01-29 + + | `Porting Guide <https://docs.ansible.com/ansible-core/2.20/porting_guides/porting_guide_core_2.20.html>`__ + + ' + codename: Good Times Bad Times + fragments: + - 2.20.2_summary.yaml + release_date: '2026-01-29' + 2.20.2rc1: + changes: + bugfixes: + - Fix Windows LIB env var corruption (https://github.com/ansible-collections/ansible.windows/issues/297). + - '``ansible``, ``ansible-console`` - fix executing ``- meta: end_play`` tasks.' + - ansible-test - Upgrade ``expat`` during provisioning of Fedora 42 remote instances. + - ansible_local will no longer trigger variable injection default value deprecation. + - copy - when a single-file local directory was specified as the source, ``changed`` + used to be ``false`` even when the source was actually copied. It now makes + sure ``changed`` is ``true`` in this case. (https://github.com/ansible/ansible/issues/85833) + - deb822_repository - Remove ``Install-Python-Debian`` from files outputed by + the ``deb822_repository`` module (https://github.com/ansible/ansible/issues/86395) + - dnf - When installing a dnf module, install and enable when missing, upgrade + when present (https://github.com/ansible/ansible/issues/73457) + - dnf - fix package installation when specifying architecture without version + (e.g., ``libgcc.i686``) where a different architecture of the same package + is already installed (https://github.com/ansible/ansible/issues/86156). + - package, service, gather_facts - fix templating module_defaults for modules + executed by these action plugins. (https://github.com/ansible/ansible/issues/85848) + - winrm - Provide a better error message if a domain user is specified using + a User Principal Name (``UPN``) but the ``pykerberos`` library is not installed + so Kerberos is unavailable. + minor_changes: + - ansible-test - Replace RHEL 10.0 remote with 10.1. + - ansible-test - Replace RHEL 9.6 remote with 9.7. + release_summary: '| Release Date: 2026-01-23 + + | `Porting Guide <https://docs.ansible.com/ansible-core/2.20/porting_guides/porting_guide_core_2.20.html>`__ + + ' + codename: Good Times Bad Times + fragments: + - 2.20.2rc1_summary.yaml + - 73457-dnf-install-modules-latest.yml + - 85834-fix-copy-in-single-file-directory.yml + - 86156-dnf-multilib-arch.yml + - 86403-fix-deb822-repository-output.yml + - ansible-test-fedora42-expat.yml + - ansible-test-rhel-10.1.yml + - ansible_local_nodepr.yml + - fix-adhoc-meta-end_play.yml + - fix-windows-lib-env-corruption.yml + - module_defaults-action-plugin-templating.yml + - winrm-kerberos.yml + release_date: '2026-01-22' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/cli/adhoc.py new/ansible_core-2.20.2/lib/ansible/cli/adhoc.py --- old/ansible_core-2.20.1/lib/ansible/cli/adhoc.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/cli/adhoc.py 2026-01-29 20:20:02.000000000 +0100 @@ -14,7 +14,7 @@ from ansible import context from ansible.cli.arguments import option_helpers as opt_help from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError -from ansible.executor.task_queue_manager import TaskQueueManager +from ansible.executor.task_queue_manager import AnsibleEndPlay, TaskQueueManager from ansible.module_utils.common.text.converters import to_text from ansible.parsing.splitter import parse_kv from ansible.playbook import Playbook @@ -198,6 +198,8 @@ result = self._tqm.run(play) self._tqm.send_callback('v2_playbook_on_stats', self._tqm._stats) + except AnsibleEndPlay as e: + result = e.result finally: if self._tqm: self._tqm.cleanup() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/cli/console.py new/ansible_core-2.20.2/lib/ansible/cli/console.py --- old/ansible_core-2.20.1/lib/ansible/cli/console.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/cli/console.py 2026-01-29 20:20:02.000000000 +0100 @@ -20,7 +20,7 @@ from ansible import constants as C from ansible import context from ansible.cli.arguments import option_helpers as opt_help -from ansible.executor.task_queue_manager import TaskQueueManager +from ansible.executor.task_queue_manager import AnsibleEndPlay, TaskQueueManager from ansible.module_utils.common.text.converters import to_native, to_text from ansible.module_utils.parsing.convert_bool import boolean from ansible.parsing.splitter import parse_kv @@ -230,6 +230,8 @@ result = self._tqm.run(play) display.debug(result) + except AnsibleEndPlay as e: + result = e.result finally: if self._tqm: self._tqm.cleanup() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/executor/module_common.py new/ansible_core-2.20.2/lib/ansible/executor/module_common.py --- old/ansible_core-2.20.1/lib/ansible/executor/module_common.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/executor/module_common.py 2026-01-29 20:20:02.000000000 +0100 @@ -1357,6 +1357,9 @@ def _get_action_arg_defaults(action: str, task: Task, templar: TemplateEngine) -> dict[str, t.Any]: + """ + Get module_defaults that match or contain a fully qualified action/module name. + """ action_groups = task._parent._play._action_groups defaults = task.module_defaults @@ -1393,7 +1396,14 @@ def _apply_action_arg_defaults(action: str, task: Task, action_args: dict[str, t.Any], templar: Templar) -> dict[str, t.Any]: + """ + Finalize arguments from module_defaults and update with action_args. + + This is used by action plugins like gather_facts, package, and service, + which select modules to execute after normal task argument finalization. + """ args = _get_action_arg_defaults(action, task, templar._engine) + args = templar.template({k: v for k, v in args.items() if k not in action_args}) args.update(action_args) return args diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/module_utils/ansible_release.py new/ansible_core-2.20.2/lib/ansible/module_utils/ansible_release.py --- old/ansible_core-2.20.1/lib/ansible/module_utils/ansible_release.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/module_utils/ansible_release.py 2026-01-29 20:20:02.000000000 +0100 @@ -17,6 +17,6 @@ from __future__ import annotations -__version__ = '2.20.1' +__version__ = '2.20.2' __author__ = 'Ansible, Inc.' __codename__ = "Good Times Bad Times" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 new/ansible_core-2.20.2/lib/ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 --- old/ansible_core-2.20.1/lib/ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 2026-01-29 20:20:02.000000000 +0100 @@ -378,7 +378,7 @@ $originalEnv = @{} try { 'LIB' | ForEach-Object -Process { - $value = Get-Item -LiteralPath "Env:\$_" -ErrorAction SilentlyContinue + $value = (Get-Item -LiteralPath "Env:\$_" -ErrorAction SilentlyContinue).Value if ($value) { $originalEnv[$_] = $value Remove-Item -LiteralPath "Env:\$_" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/modules/deb822_repository.py new/ansible_core-2.20.2/lib/ansible/modules/deb822_repository.py --- old/ansible_core-2.20.1/lib/ansible/modules/deb822_repository.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/modules/deb822_repository.py 2026-01-29 20:20:02.000000000 +0100 @@ -542,6 +542,7 @@ # popped non-deb822 args mode = params.pop('mode') state = params.pop('state') + params.pop('install_python_debian') name = params['name'] slug = re.sub( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/modules/dnf.py new/ansible_core-2.20.2/lib/ansible/modules/dnf.py --- old/ansible_core-2.20.1/lib/ansible/modules/dnf.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/modules/dnf.py 2026-01-29 20:20:02.000000000 +0100 @@ -717,9 +717,16 @@ else: solution = dnf.subject.Subject(pkg_spec).get_best_solution(self.base.sack) q = solution["query"] - if not q or not solution['nevra'] or solution['nevra'].has_just_name(): + nevra = solution['nevra'] + if not q or not nevra or nevra.has_just_name() or not nevra.version: return False - installed = self.base.sack.query().installed().filter(name=solution['nevra'].name) + + # Filter by name and arch (if specified), but NOT by version + # since we need to find installed packages to compare versions against + filter_kwargs = {'name': nevra.name} + if nevra.arch: + filter_kwargs['arch'] = nevra.arch + installed = self.base.sack.query().installed().filter(**filter_kwargs) if not installed: return False return installed[0].evr_gt(q[0]) @@ -1006,8 +1013,12 @@ for module in module_specs: try: if self._is_module_installed(module): + self.module_base.upgrade([module]) response['results'].append("Module {0} upgraded.".format(module)) - self.module_base.upgrade([module]) + else: + self.module_base.install([module]) + self.module_base.enable([module]) + response['results'].append("Module {0} installed.".format(module)) except dnf.exceptions.MarkingErrors as e: failure_response['failures'].append(' '.join((module, to_native(e)))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/plugins/action/copy.py new/ansible_core-2.20.2/lib/ansible/plugins/action/copy.py --- old/ansible_core-2.20.1/lib/ansible/plugins/action/copy.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/plugins/action/copy.py 2026-01-29 20:20:02.000000000 +0100 @@ -529,11 +529,9 @@ result.update(module_return) return self._ensure_invocation(result) - paths = os.path.split(source_rel) - dir_path = '' - for dir_component in paths: - os.path.join(dir_path, dir_component) - implicit_directories.add(dir_path) + while (source_rel := os.path.dirname(source_rel)) != '': + implicit_directories.add(source_rel) + if 'diff' in result and not result['diff']: del result['diff'] module_executed = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/plugins/connection/winrm.py new/ansible_core-2.20.2/lib/ansible/plugins/connection/winrm.py --- old/ansible_core-2.20.1/lib/ansible/plugins/connection/winrm.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/plugins/connection/winrm.py 2026-01-29 20:20:02.000000000 +0100 @@ -31,6 +31,8 @@ remote_user: description: - The user to log in as to the Windows machine + - If O(transport) is not defined, the authentication used will be V(kerberos) if the user is in the UPN format V(user@domain), + otherwise it will be V(basic) vars: - name: ansible_user - name: ansible_winrm_user @@ -75,7 +77,8 @@ transport: description: - List of winrm transports to attempt to use (ssl, plaintext, kerberos, etc) - - If None (the default) the plugin will try to automatically guess the correct list + - If None (the default) the plugin will try to automatically guess the correct list. It will use + V(kerberos) if the username looks like a UPN V(user@domain), otherwise it will use V(basic). - The choices available depend on your version of pywinrm type: list elements: string @@ -288,12 +291,11 @@ # calculate transport if needed if self._winrm_transport is None or self._winrm_transport[0] is None: # TODO: figure out what we want to do with auto-transport selection in the face of NTLM/Kerb/CredSSP/Cert/Basic - transport_selector = ['ssl'] if self._winrm_scheme == 'https' else ['plaintext'] - - if HAVE_KERBEROS and ((self._winrm_user and '@' in self._winrm_user)): - self._winrm_transport = ['kerberos'] + transport_selector + if self._winrm_user and '@' in self._winrm_user: + # A UPN must be a domain account and we always default to Kerberos for this. + self._winrm_transport = ['kerberos'] else: - self._winrm_transport = transport_selector + self._winrm_transport = ['ssl'] if self._winrm_scheme == 'https' else ['plaintext'] unsupported_transports = set(self._winrm_transport).difference(self._winrm_supported_authtypes) @@ -418,7 +420,12 @@ for transport in self._winrm_transport: if transport == 'kerberos': if not HAVE_KERBEROS: - errors.append('kerberos: the python kerberos library is not installed') + kerb_msg = ( + 'WinRM Kerberos authentication requested but the python kerberos library is not installed. ' + 'Please install the pykerberos library, set a different authentication method with ansible_winrm_transport, ' + 'or use a local user account to connect using basic authentication.' + ) + errors.append(kerb_msg) continue if self._kerb_managed: self._kerb_auth(self._winrm_user, self._winrm_pass) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/release.py new/ansible_core-2.20.2/lib/ansible/release.py --- old/ansible_core-2.20.1/lib/ansible/release.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/release.py 2026-01-29 20:20:02.000000000 +0100 @@ -17,6 +17,6 @@ from __future__ import annotations -__version__ = '2.20.1' +__version__ = '2.20.2' __author__ = 'Ansible, Inc.' __codename__ = "Good Times Bad Times" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/lib/ansible/vars/manager.py new/ansible_core-2.20.2/lib/ansible/vars/manager.py --- old/ansible_core-2.20.1/lib/ansible/vars/manager.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/lib/ansible/vars/manager.py 2026-01-29 20:20:02.000000000 +0100 @@ -299,7 +299,7 @@ # push facts to main namespace if inject: if origin == 'default': - clean_top = {k: _deprecate_top_level_fact(v) for k, v in clean_facts(facts).items()} + clean_top = {k: (_deprecate_top_level_fact(v) if k != 'ansible_local' else v) for k, v in clean_facts(facts).items()} else: clean_top = clean_facts(facts) all_vars = _combine_and_track(all_vars, clean_top, "facts") @@ -371,7 +371,7 @@ raise AnsibleUndefinedVariable("an undefined variable was found when attempting to template the vars_files item '%s'" % vars_file_item, obj=vars_file_item) from ex - display.warning("skipping vars_file item due to an undefined variable", obj=vars_file_item) + display.warning("skipping vars_files item due to an undefined variable", obj=vars_file_item) continue # We now merge in all exported vars from all roles in the play (very high precedence) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/pyproject.toml new/ansible_core-2.20.2/pyproject.toml --- old/ansible_core-2.20.1/pyproject.toml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/pyproject.toml 2026-01-29 20:20:02.000000000 +0100 @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools >= 66.1.0, <= 80.9.0", "wheel == 0.45.1"] # lower bound to support controller Python versions, upper bound for latest version tested at release +requires = ["setuptools >= 66.1.0, <= 80.10.2", "wheel == 0.45.1"] # lower bound to support controller Python versions, upper bound for latest version tested at release build-backend = "setuptools.build_meta" [project] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/adhoc/roles/end_play/tasks/main.yml new/ansible_core-2.20.2/test/integration/targets/adhoc/roles/end_play/tasks/main.yml --- old/ansible_core-2.20.1/test/integration/targets/adhoc/roles/end_play/tasks/main.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/adhoc/roles/end_play/tasks/main.yml 2026-01-29 20:20:02.000000000 +0100 @@ -0,0 +1 @@ +- meta: end_play diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/adhoc/runme.sh new/ansible_core-2.20.2/test/integration/targets/adhoc/runme.sh --- old/ansible_core-2.20.1/test/integration/targets/adhoc/runme.sh 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/adhoc/runme.sh 2026-01-29 20:20:02.000000000 +0100 @@ -26,3 +26,5 @@ ansible localhost -m assert -a '{"that": "ansible_facts.distribution is defined"}' # test flushing the fact cache ansible --flush-cache localhost -m debug -a "msg={{ ansible_facts }}" | grep '"msg": {}' +# test meta end_play +ansible localhost -m include_role -a name=end_play diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/ansible-console/roles/end_play/tasks/main.yml new/ansible_core-2.20.2/test/integration/targets/ansible-console/roles/end_play/tasks/main.yml --- old/ansible_core-2.20.1/test/integration/targets/ansible-console/roles/end_play/tasks/main.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/ansible-console/roles/end_play/tasks/main.yml 2026-01-29 20:20:02.000000000 +0100 @@ -0,0 +1 @@ +- meta: end_play diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/ansible-console/runme.sh new/ansible_core-2.20.2/test/integration/targets/ansible-console/runme.sh --- old/ansible_core-2.20.1/test/integration/targets/ansible-console/runme.sh 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/ansible-console/runme.sh 2026-01-29 20:20:02.000000000 +0100 @@ -8,3 +8,9 @@ unset ANSIBLE_HOST_PATTERN_MISMATCH echo debug var=inventory_hostname | ansible-console '{{"localhost"}}' + +echo include_role name=end_play | ansible-console localhost 2>&1 | tee err.txt +if grep -q "ERROR" err.txt; then + echo "Failed to execute end_play" + exit 1 +fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/copy/tasks/src_directory_contaning_one_single_file.yml new/ansible_core-2.20.2/test/integration/targets/copy/tasks/src_directory_contaning_one_single_file.yml --- old/ansible_core-2.20.1/test/integration/targets/copy/tasks/src_directory_contaning_one_single_file.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/copy/tasks/src_directory_contaning_one_single_file.yml 2026-01-29 20:20:02.000000000 +0100 @@ -0,0 +1,29 @@ +# Test copying to a source directory that contains only a single file in a deeper structure + +- name: Ensure that dest top directory doesn't exist + file: + path: '{{ remote_dir }}/subdir_with_deep_single_file' + state: absent + +- name: Copy subdir_with_deep_single_file directory which contains a single file + copy: + src: subdir_with_deep_single_file + dest: '{{ remote_dir }}' + register: copy_result + +- name: Debug copy result + debug: + var: copy_result + verbosity: 1 + +- name: Check the transferred file + stat: + path: '{{ remote_dir }}/subdir_with_deep_single_file/dir/file.txt' + register: stat_file + +- name: Assert that transferred file exists and copy_result is as expected for deeper structure + assert: + that: + - 'stat_file.stat.exists' + - 'copy_result.changed' + - 'copy_result.dest == remote_dir + "/subdir_with_deep_single_file/dir/file.txt"' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/copy/tasks/tests.yml new/ansible_core-2.20.2/test/integration/targets/copy/tasks/tests.yml --- old/ansible_core-2.20.1/test/integration/targets/copy/tasks/tests.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/copy/tasks/tests.yml 2026-01-29 20:20:02.000000000 +0100 @@ -2531,3 +2531,5 @@ state: absent loop: - '{{ remote_file }}' + +- include_tasks: src_directory_contaning_one_single_file.yml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/deb822_repository/tasks/test.yml new/ansible_core-2.20.2/test/integration/targets/deb822_repository/tasks/test.yml --- old/ansible_core-2.20.1/test/integration/targets/deb822_repository/tasks/test.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/deb822_repository/tasks/test.yml 2026-01-29 20:20:02.000000000 +0100 @@ -119,7 +119,6 @@ focal_archive_expected: |- Components: main restricted Date-Max-Future: 10 - Install-Python-Debian: no X-Repolib-Name: ansible-test focal archive Suites: focal focal-updates Types: deb @@ -193,7 +192,6 @@ vars: signed_by_inline_expected: |- Components: main contrib non-free - Install-Python-Debian: no X-Repolib-Name: ansible-test Signed-By: -----BEGIN PGP PUBLIC KEY BLOCK----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/deprecations/injectfacts.yml new/ansible_core-2.20.2/test/integration/targets/deprecations/injectfacts.yml --- old/ansible_core-2.20.1/test/integration/targets/deprecations/injectfacts.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/deprecations/injectfacts.yml 2026-01-29 20:20:02.000000000 +0100 @@ -3,3 +3,6 @@ tasks: - debug: msg: '{{ansible_distribution}}' + - debug: + msg: '{{ansible_local}}' + tags: alocal diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/deprecations/runme.sh new/ansible_core-2.20.2/test/integration/targets/deprecations/runme.sh --- old/ansible_core-2.20.1/test/integration/targets/deprecations/runme.sh 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/deprecations/runme.sh 2026-01-29 20:20:02.000000000 +0100 @@ -59,3 +59,6 @@ # Injection default is deprecated [ "$(ANSIBLE_INJECT_FACT_VARS=1 ansible-playbook injectfacts.yml 2>&1 | grep -c 'INJECT_FACTS_AS_VARS')" -eq "0" ] + +# Injection default is deprecated but not ansible_local +[ "$(ansible-playbook injectfacts.yml --tags alocal 2>&1 | grep -c 'INJECT_FACTS_AS_VARS')" -eq "0" ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/dnf/tasks/modularity.yml new/ansible_core-2.20.2/test/integration/targets/dnf/tasks/modularity.yml --- old/ansible_core-2.20.1/test/integration/targets/dnf/tasks/modularity.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/dnf/tasks/modularity.yml 2026-01-29 20:20:02.000000000 +0100 @@ -93,3 +93,61 @@ that: - "not dnf_result.failed" - "not dnf_result.changed" + +- name: install "{{ astream_name }}" module with state=latest + dnf: + name: "{{ astream_name }}" + state: latest + register: dnf_result + +- name: verify installation of "{{ astream_name }}" module with state=latest + assert: + that: + - dnf_result is not failed + - dnf_result is changed + +- name: install "{{ astream_name }}" module with state=latest again (idempotency) + dnf: + name: "{{ astream_name }}" + state: latest + register: dnf_result + +- name: verify installation of "{{ astream_name }}" module with state=latest again (idempotency) + assert: + that: + - dnf_result is not failed + - dnf_result is not changed + +- name: uninstall "{{ astream_name }}" module + dnf: + name: "{{ astream_name }}" + state: absent + +- name: install "{{ astream_name_no_stream }}" module with state=latest without providing stream + dnf: + name: "{{ astream_name_no_stream }}" + state: latest + register: dnf_result + +- name: verify installation of "{{ astream_name_no_stream }}" module with state=latest without providing stream + assert: + that: + - dnf_result is not failed + - dnf_result is changed + +- name: install "{{ astream_name_no_stream }}" module with state=latest again without providing stream (idempotency) + dnf: + name: "{{ astream_name_no_stream }}" + state: latest + register: dnf_result + +- name: verify installation of "{{ astream_name_no_stream }}" module with state=latest again without providing stream (idempotency) + assert: + that: + - dnf_result is not failed + - dnf_result is not changed + +- name: uninstall "{{ astream_name_no_stream }}" module + dnf: + name: "{{ astream_name_no_stream }}" + state: absent diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/dnf/tasks/multilib.yml new/ansible_core-2.20.2/test/integration/targets/dnf/tasks/multilib.yml --- old/ansible_core-2.20.1/test/integration/targets/dnf/tasks/multilib.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/dnf/tasks/multilib.yml 2026-01-29 20:20:02.000000000 +0100 @@ -57,6 +57,51 @@ - "not dnf_result.changed" - "rpm_result.stdout_lines[0].startswith('multilib-dinginessentail-1.1-1')" - "rpm_result.stdout_lines[1].startswith('multilib-dinginessentail-1.1-1')" + + - name: remove multilib-dinginessentail for arch-only test + dnf: + name: multilib-dinginessentail + state: absent + + - name: install x86_64 version first + dnf: + name: "multilib-dinginessentail-1.0-1.x86_64" + state: present + register: dnf_result + + - assert: + that: + - dnf_result is changed + + - name: install i686 version by specifying only arch (no version) + dnf: + name: "multilib-dinginessentail.i686" + state: present + register: dnf_result + + - name: check multilib-dinginessentail with rpm + shell: rpm -q multilib-dinginessentail + register: rpm_result + + - name: verify both architectures are installed + assert: + that: + - dnf_result is changed + - rpm_result.stdout_lines | length == 2 + - rpm_result.stdout_lines | select('match', '.*\\.x86_64$') | list | length == 1 + - rpm_result.stdout_lines | select('match', '.*\\.i686$') | list | length == 1 + + - name: install i686 version again to verify idempotency + dnf: + name: "multilib-dinginessentail.i686" + state: present + register: dnf_result + + - name: verify no changes on second install + assert: + that: + - dnf_result is not changed + always: - name: Clean up dnf: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/gathering_facts/runme.sh new/ansible_core-2.20.2/test/integration/targets/gathering_facts/runme.sh --- old/ansible_core-2.20.1/test/integration/targets/gathering_facts/runme.sh 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/gathering_facts/runme.sh 2026-01-29 20:20:02.000000000 +0100 @@ -26,6 +26,9 @@ ansible-playbook test_module_defaults.yml "$@" --tags networking +# test gather_facts action templates module_defaults for different module name +ansible-playbook test_module_defaults.yml "$@" --tags templating + # test it works by default ANSIBLE_FACTS_MODULES='ansible.legacy.slow' ansible -m gather_facts localhost --playbook-dir ./ "$@" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/gathering_facts/test_module_defaults.yml new/ansible_core-2.20.2/test/integration/targets/gathering_facts/test_module_defaults.yml --- old/ansible_core-2.20.1/test/integration/targets/gathering_facts/test_module_defaults.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/gathering_facts/test_module_defaults.yml 2026-01-29 20:20:02.000000000 +0100 @@ -128,3 +128,21 @@ - assert: that: - "ansible_facts.gather_subset == 'min'" + +- name: Test module_defaults templating when the action and module differ + hosts: localhost + gather_facts: True + tags: + - templating + vars: + subset_facts: + - "!all" + - "!min" + - env + module_defaults: + setup: + gather_subset: "{{ subset_facts }}" + tasks: + - assert: + that: + - ansible_facts.gather_subset == subset_facts diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/module_defaults/collections/ansible_collections/testns/testcoll/meta/runtime.yml new/ansible_core-2.20.2/test/integration/targets/module_defaults/collections/ansible_collections/testns/testcoll/meta/runtime.yml --- old/ansible_core-2.20.1/test/integration/targets/module_defaults/collections/ansible_collections/testns/testcoll/meta/runtime.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/module_defaults/collections/ansible_collections/testns/testcoll/meta/runtime.yml 2026-01-29 20:20:02.000000000 +0100 @@ -69,6 +69,8 @@ - metadata: extend_group: - testgroup + contains_setup: + - ansible.builtin.setup empty_metadata: - metadata: {} bad_metadata_format: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/module_defaults/test_action_groups.yml new/ansible_core-2.20.2/test/integration/targets/module_defaults/test_action_groups.yml --- old/ansible_core-2.20.1/test/integration/targets/module_defaults/test_action_groups.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/module_defaults/test_action_groups.yml 2026-01-29 20:20:02.000000000 +0100 @@ -130,3 +130,18 @@ - metadata: collections: - testns.testcoll + + - name: Test action plugin templates group defaults + vars: + setup_subset: + - "!all" + - "!min" + - local + module_defaults: + group/testns.testcoll.contains_setup: + gather_subset: "{{ setup_subset }}" + block: + - gather_facts: + - assert: + that: + - ansible_facts.gather_subset == setup_subset diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/module_utils_Ansible.ModuleUtils.AddType/library/add_type_test.ps1 new/ansible_core-2.20.2/test/integration/targets/module_utils_Ansible.ModuleUtils.AddType/library/add_type_test.ps1 --- old/ansible_core-2.20.1/test/integration/targets/module_utils_Ansible.ModuleUtils.AddType/library/add_type_test.ps1 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/module_utils_Ansible.ModuleUtils.AddType/library/add_type_test.ps1 2026-01-29 20:20:02.000000000 +0100 @@ -322,6 +322,7 @@ $env:LIB = "C:\fake\folder\path" try { Add-CSharpType -Reference $lib_set + Assert-Equal -actual $env:LIB -expected "C:\fake\folder\path" } finally { Remove-Item -LiteralPath env:\LIB diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/package/tasks/main.yml new/ansible_core-2.20.2/test/integration/targets/package/tasks/main.yml --- old/ansible_core-2.20.1/test/integration/targets/package/tasks/main.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/package/tasks/main.yml 2026-01-29 20:20:02.000000000 +0100 @@ -69,28 +69,53 @@ # Verify module_defaults for package and the underlying module are utilized # Validates: https://github.com/ansible/ansible/issues/72918 - block: - # 'name' is required + # note: dnf module unexpectedly succeeds when no arguments are provided. + # Until the requires_one_of (?) bug is fixed, this test asserts changes are made to avoid false positives. - name: install apt with package defaults package: module_defaults: package: name: apt state: present + register: result + - assert: + that: result is changed + + - name: uninstall apt between tests + dnf5: + name: apt + state: absent + + # Validate package handles applying templated defaults for dnf + # https://github.com/ansible/ansible/issues/85848 - name: install apt with dnf defaults (auto) package: module_defaults: - dnf: - name: apt + dnf5: + name: "{{ 'apt' }}" state: present + register: result - - name: install apt with dnf defaults (use dnf) + - assert: + that: result is changed + + - name: uninstall apt between tests + dnf5: + name: apt + state: absent + + - name: install apt with dnf defaults (use dnf5) package: - use: dnf + use: dnf5 module_defaults: - dnf: + dnf5: name: apt state: present + register: result + + - assert: + that: result is changed always: - name: remove apt dnf: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/rpm_key/tasks/main.yaml new/ansible_core-2.20.2/test/integration/targets/rpm_key/tasks/main.yaml --- old/ansible_core-2.20.1/test/integration/targets/rpm_key/tasks/main.yaml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/rpm_key/tasks/main.yaml 2026-01-29 20:20:02.000000000 +0100 @@ -1,3 +1,7 @@ + - name: Skip RHEL 10.1 until rpm_key has been updated + meta: end_play + when: ansible_distribution == "RedHat" and ansible_distribution_version == "10.1" + - when: ansible_os_family == "RedHat" block: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/service/tasks/tests.yml new/ansible_core-2.20.2/test/integration/targets/service/tasks/tests.yml --- old/ansible_core-2.20.1/test/integration/targets/service/tasks/tests.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/service/tasks/tests.yml 2026-01-29 20:20:02.000000000 +0100 @@ -32,10 +32,12 @@ when: "ansible_service_mgr in ['sysvinit', 'systemd']" module_defaults: sysvinit: - name: ansible_test + # Test the action plugin templates sysvinit defaults + # https://github.com/ansible/ansible/issues/85848 + name: "{{ 'ansible_test' }}" enabled: yes systemd: - name: ansible_test + name: "{{ 'ansible_test' }}" enabled: yes - name: assert that changes reported for check mode run diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/integration/targets/win_app_control/setup.yml new/ansible_core-2.20.2/test/integration/targets/win_app_control/setup.yml --- old/ansible_core-2.20.1/test/integration/targets/win_app_control/setup.yml 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/integration/targets/win_app_control/setup.yml 2026-01-29 20:20:02.000000000 +0100 @@ -82,7 +82,7 @@ - name: install OpenAuthenticode shell: | if (-not (Get-Module -Name OpenAuthenticode -ListAvailable | Where-Object Version -ge '0.5.0')) { - $url = 'https://ansible-ci-files.s3.us-east-1.amazonaws.com/test/integration/targets/win_app_control/openauthenticode.0.6.1.nupkg' + $url = 'https://ci-files.testing.ansible.com/test/integration/targets/win_app_control/openauthenticode.0.6.1.nupkg' Invoke-WebRequest -Uri $url -OutFile '{{ local_tmp_dir }}/openauthenticode.0.6.1.nupkg' Register-PSResourceRepository -Name AnsibleTemp -Trusted -Uri '{{ local_tmp_dir }}' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/lib/ansible_test/_data/completion/remote.txt new/ansible_core-2.20.2/test/lib/ansible_test/_data/completion/remote.txt --- old/ansible_core-2.20.1/test/lib/ansible_test/_data/completion/remote.txt 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/lib/ansible_test/_data/completion/remote.txt 2026-01-29 20:20:02.000000000 +0100 @@ -7,8 +7,8 @@ freebsd python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64 macos/15.3 python=3.13 python_dir=/usr/local/bin become=sudo provider=parallels arch=x86_64 macos python_dir=/usr/local/bin become=sudo provider=parallels arch=x86_64 -rhel/9.6 python=3.9,3.12 become=sudo provider=aws arch=x86_64 -rhel/10.0 python=3.12 become=sudo provider=aws arch=x86_64 +rhel/9.7 python=3.9,3.12 become=sudo provider=aws arch=x86_64 +rhel/10.1 python=3.12 become=sudo provider=aws arch=x86_64 rhel become=sudo provider=aws arch=x86_64 ubuntu/22.04 python=3.10 become=sudo provider=aws arch=x86_64 ubuntu/24.04 python=3.12 become=sudo provider=aws arch=x86_64 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/lib/ansible_test/_util/target/setup/bootstrap.sh new/ansible_core-2.20.2/test/lib/ansible_test/_util/target/setup/bootstrap.sh --- old/ansible_core-2.20.1/test/lib/ansible_test/_util/target/setup/bootstrap.sh 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/lib/ansible_test/_util/target/setup/bootstrap.sh 2026-01-29 20:20:02.000000000 +0100 @@ -163,6 +163,18 @@ && break retry_or_fail done + + packages=" + expat + " + + retry_init + while true; do + # shellcheck disable=SC2086 + dnf update -q -y ${packages} \ + && break + retry_or_fail + done } bootstrap_remote_freebsd() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/sanity/code-smell/no-s3.json new/ansible_core-2.20.2/test/sanity/code-smell/no-s3.json --- old/ansible_core-2.20.1/test/sanity/code-smell/no-s3.json 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible_core-2.20.2/test/sanity/code-smell/no-s3.json 2026-01-29 20:20:02.000000000 +0100 @@ -0,0 +1,4 @@ +{ + "text": true, + "output": "path-line-column-message" +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/sanity/code-smell/no-s3.py new/ansible_core-2.20.2/test/sanity/code-smell/no-s3.py --- old/ansible_core-2.20.1/test/sanity/code-smell/no-s3.py 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible_core-2.20.2/test/sanity/code-smell/no-s3.py 2026-01-29 20:20:02.000000000 +0100 @@ -0,0 +1,27 @@ +""" +Disallow direct linking to S3 buckets. +S3 buckets should be accessed through a CloudFront distribution. +""" + +from __future__ import annotations + +import re +import sys + + +def main(): + """Main entry point.""" + for path in sys.argv[1:] or sys.stdin.read().splitlines(): + with open(path, 'rb') as path_fd: + for line, b_text in enumerate(path_fd.readlines()): + try: + text = b_text.decode() + except UnicodeDecodeError: + continue + + if match := re.search(r'(http.*?s3\..*?amazonaws\.com)', text): + print(f'{path}:{line + 1}:{match.start(1) + 1}: use a CloudFront distribution instead of an S3 bucket: {match.group(1)}') + + +if __name__ == '__main__': + main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.20.1/test/units/plugins/connection/test_winrm.py new/ansible_core-2.20.2/test/units/plugins/connection/test_winrm.py --- old/ansible_core-2.20.1/test/units/plugins/connection/test_winrm.py 2025-12-09 17:24:07.000000000 +0100 +++ new/ansible_core-2.20.2/test/units/plugins/connection/test_winrm.py 2026-01-29 20:20:02.000000000 +0100 @@ -63,7 +63,7 @@ '_winrm_kwargs': {'username': '[email protected]', 'password': None}, '_winrm_pass': None, - '_winrm_transport': ['kerberos', 'ssl'], + '_winrm_transport': ['kerberos'], '_winrm_user': '[email protected]' }, True @@ -78,7 +78,7 @@ '_winrm_kwargs': {'username': '[email protected]', 'password': None}, '_winrm_pass': None, - '_winrm_transport': ['ssl'], + '_winrm_transport': ['kerberos'], '_winrm_user': '[email protected]' }, False @@ -93,7 +93,7 @@ '_winrm_kwargs': {'username': '[email protected]', 'password': 'pass'}, '_winrm_pass': 'pass', - '_winrm_transport': ['kerberos', 'ssl'], + '_winrm_transport': ['kerberos'], '_winrm_user': '[email protected]' }, True ++++++ ansible_core-2.20.1.tar.gz.sha256 -> ansible_core-2.20.2.tar.gz.sha256 ++++++ --- /work/SRC/openSUSE:Factory/ansible-core/ansible_core-2.20.1.tar.gz.sha256 2025-12-11 18:44:52.758392029 +0100 +++ /work/SRC/openSUSE:Factory/.ansible-core.new.1995/ansible_core-2.20.2.tar.gz.sha256 2026-02-03 21:29:47.548333090 +0100 @@ -1 +1 @@ -a891e5f90cd46626778f0f3d545ec1115840c9b50e8adf25944c5e1748452106 ansible_core-2.20.1.tar.gz +75e19a3ad8cf659579ea182cdf948ee0900d700e564802e92876de53dbd9715d ansible_core-2.20.2.tar.gz
