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

Reply via email to