Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ansible-core-2.18 for 
openSUSE:Factory checked in at 2025-12-11 18:41:02
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ansible-core-2.18 (Old)
 and      /work/SRC/openSUSE:Factory/.ansible-core-2.18.new.1939 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ansible-core-2.18"

Thu Dec 11 18:41:02 2025 rev:4 rq:1322167 version:2.18.12

Changes:
--------
--- /work/SRC/openSUSE:Factory/ansible-core-2.18/ansible-core-2.18.changes      
2025-11-06 18:13:48.148931853 +0100
+++ 
/work/SRC/openSUSE:Factory/.ansible-core-2.18.new.1939/ansible-core-2.18.changes
    2025-12-11 18:44:12.316692848 +0100
@@ -1,0 +2,12 @@
+Thu Dec 11 08:24:57 UTC 2025 - Johannes Kastl 
<[email protected]>
+
+- update to 2.18.12:
+  * Bugfixes
+    - Variable loading now uses file source instead of variables
+      when invalidly formmated vars file is loaded.
+    - ansible-test - The runtime-metadata sanity test now ignores
+      pre-release and build identifiers in collection versions.
+      This prevents errors if a tombstone version is X.0.0, while
+      the collection's version is X.0.0-prerelease (#85193)."
+
+-------------------------------------------------------------------

Old:
----
  ansible_core-2.18.11.tar.gz
  ansible_core-2.18.11.tar.gz.sha256

New:
----
  ansible_core-2.18.12.tar.gz
  ansible_core-2.18.12.tar.gz.sha256

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

Other differences:
------------------
++++++ ansible-core-2.18.spec ++++++
--- /var/tmp/diff_new_pack.ccoqfO/_old  2025-12-11 18:44:13.968762260 +0100
+++ /var/tmp/diff_new_pack.ccoqfO/_new  2025-12-11 18:44:13.980762765 +0100
@@ -43,7 +43,7 @@
 %endif
 
 Name:           ansible-core-2.18
-Version:        2.18.11
+Version:        2.18.12
 Release:        0
 Summary:        Radically simple IT automation
 License:        GPL-3.0-or-later

++++++ ansible_core-2.18.11.tar.gz -> ansible_core-2.18.12.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ansible_core-2.18.11/PKG-INFO 
new/ansible_core-2.18.12/PKG-INFO
--- old/ansible_core-2.18.11/PKG-INFO   2025-11-05 00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/PKG-INFO   2025-12-09 17:45:08.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: ansible-core
-Version: 2.18.11
+Version: 2.18.12
 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.18.11/ansible_core.egg-info/PKG-INFO 
new/ansible_core-2.18.12/ansible_core.egg-info/PKG-INFO
--- old/ansible_core-2.18.11/ansible_core.egg-info/PKG-INFO     2025-11-05 
00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/ansible_core.egg-info/PKG-INFO     2025-12-09 
17:45:08.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: ansible-core
-Version: 2.18.11
+Version: 2.18.12
 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.18.11/ansible_core.egg-info/SOURCES.txt 
new/ansible_core-2.18.12/ansible_core.egg-info/SOURCES.txt
--- old/ansible_core-2.18.11/ansible_core.egg-info/SOURCES.txt  2025-11-05 
00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/ansible_core.egg-info/SOURCES.txt  2025-12-09 
17:45:08.000000000 +0100
@@ -1085,10 +1085,13 @@
 
test/integration/targets/ansible-test-sanity-replace-urlopen/ansible_collections/ns/col/plugins/modules/check-me.py
 test/integration/targets/ansible-test-sanity-runtime-metadata/aliases
 
test/integration/targets/ansible-test-sanity-runtime-metadata/expected-no_version.txt
+test/integration/targets/ansible-test-sanity-runtime-metadata/expected-prerelease.txt
 
test/integration/targets/ansible-test-sanity-runtime-metadata/expected-version.txt
 test/integration/targets/ansible-test-sanity-runtime-metadata/runme.sh
 
test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/no_version/galaxy.yml
 
test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/no_version/meta/runtime.yml
+test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/galaxy.yml
+test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/meta/runtime.yml
 
test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/version/galaxy.yml
 
test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/version/meta/runtime.yml
 test/integration/targets/ansible-test-sanity-shebang/aliases
@@ -3887,13 +3890,15 @@
 test/integration/targets/user/tasks/test_umask.yml
 test/integration/targets/user/vars/main.yml
 test/integration/targets/var_blending/aliases
+test/integration/targets/var_blending/error_handling.yml
 test/integration/targets/var_blending/inventory
 test/integration/targets/var_blending/runme.sh
+test/integration/targets/var_blending/supersecretvaultsecret
 test/integration/targets/var_blending/test_var_blending.yml
 test/integration/targets/var_blending/test_vars.yml
 test/integration/targets/var_blending/vars_file.yml
 test/integration/targets/var_blending/group_vars/all
-test/integration/targets/var_blending/group_vars/local
+test/integration/targets/var_blending/group_vars/local/main.yml
 test/integration/targets/var_blending/host_vars/testhost
 test/integration/targets/var_blending/roles/test_var_blending/defaults/main.yml
 test/integration/targets/var_blending/roles/test_var_blending/files/foo.txt
@@ -3901,6 +3906,7 @@
 test/integration/targets/var_blending/roles/test_var_blending/templates/foo.j2
 test/integration/targets/var_blending/roles/test_var_blending/vars/main.yml
 
test/integration/targets/var_blending/roles/test_var_blending/vars/more_vars.yml
+test/integration/targets/var_blending/vars/bad_vault.yml
 test/integration/targets/var_inheritance/aliases
 test/integration/targets/var_inheritance/tasks/main.yml
 test/integration/targets/var_precedence/aliases
@@ -4472,6 +4478,7 @@
 test/units/ansible_test/test_diff.py
 test/units/ansible_test/_internal/__init__.py
 test/units/ansible_test/_internal/test_util.py
+test/units/ansible_test/_internal/ci/test_azp.py
 test/units/ansible_test/diff/add_binary_file.diff
 test/units/ansible_test/diff/add_text_file.diff
 test/units/ansible_test/diff/add_trailing_newline.diff
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ansible_core-2.18.11/changelogs/CHANGELOG-v2.18.rst 
new/ansible_core-2.18.12/changelogs/CHANGELOG-v2.18.rst
--- old/ansible_core-2.18.11/changelogs/CHANGELOG-v2.18.rst     2025-11-05 
00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/changelogs/CHANGELOG-v2.18.rst     2025-12-09 
17:45:08.000000000 +0100
@@ -4,6 +4,21 @@
 
 .. contents:: Topics
 
+v2.18.12
+========
+
+Release Summary
+---------------
+
+| Release Date: 2025-12-09
+| `Porting Guide 
<https://docs.ansible.com/ansible-core/2.18/porting_guides/porting_guide_core_2.18.html>`__
+
+Bugfixes
+--------
+
+- Variable loading now uses file source instead of variables when invalidly 
formmated vars file is loaded.
+- ansible-test - The runtime-metadata sanity test now ignores pre-release and 
build identifiers in collection versions. This prevents errors if a tombstone 
version is ``X.0.0``, while the collection's version is ``X.0.0-prerelease`` 
(https://github.com/ansible/ansible/issues/85193)."
+
 v2.18.11
 ========
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ansible_core-2.18.11/changelogs/changelog.yaml 
new/ansible_core-2.18.12/changelogs/changelog.yaml
--- old/ansible_core-2.18.11/changelogs/changelog.yaml  2025-11-05 
00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/changelogs/changelog.yaml  2025-12-09 
17:45:08.000000000 +0100
@@ -678,6 +678,37 @@
     - 2.18.11rc1_summary.yaml
     - 85361-collection-name-from-path-none.yml
     release_date: '2025-10-29'
+  2.18.12:
+    changes:
+      release_summary: '| Release Date: 2025-12-09
+
+        | `Porting Guide 
<https://docs.ansible.com/ansible-core/2.18/porting_guides/porting_guide_core_2.18.html>`__
+
+        '
+    codename: Fool in the Rain
+    fragments:
+    - 2.18.12_summary.yaml
+    release_date: '2025-12-09'
+  2.18.12rc1:
+    changes:
+      bugfixes:
+      - Variable loading now uses file source instead of variables when 
invalidly
+        formmated vars file is loaded.
+      - ansible-test - The runtime-metadata sanity test now ignores 
pre-release and
+        build identifiers in collection versions. This prevents errors if a 
tombstone
+        version is ``X.0.0``, while the collection's version is 
``X.0.0-prerelease``
+        (https://github.com/ansible/ansible/issues/85193)."
+      release_summary: '| Release Date: 2025-12-02
+
+        | `Porting Guide 
<https://docs.ansible.com/ansible-core/2.18/porting_guides/porting_guide_core_2.18.html>`__
+
+        '
+    codename: Fool in the Rain
+    fragments:
+    - 2.18.12rc1_summary.yaml
+    - 85193-runtime-metadata.yml
+    - varloaderror.yml
+    release_date: '2025-12-02'
   2.18.1rc1:
     changes:
       bugfixes:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/lib/ansible/module_utils/ansible_release.py 
new/ansible_core-2.18.12/lib/ansible/module_utils/ansible_release.py
--- old/ansible_core-2.18.11/lib/ansible/module_utils/ansible_release.py        
2025-11-05 00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/lib/ansible/module_utils/ansible_release.py        
2025-12-09 17:45:08.000000000 +0100
@@ -17,6 +17,6 @@
 
 from __future__ import annotations
 
-__version__ = '2.18.11'
+__version__ = '2.18.12'
 __author__ = 'Ansible, Inc.'
 __codename__ = "Fool in the Rain"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/lib/ansible/plugins/vars/host_group_vars.py 
new/ansible_core-2.18.12/lib/ansible/plugins/vars/host_group_vars.py
--- old/ansible_core-2.18.11/lib/ansible/plugins/vars/host_group_vars.py        
2025-11-05 00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/lib/ansible/plugins/vars/host_group_vars.py        
2025-12-09 17:45:08.000000000 +0100
@@ -53,7 +53,7 @@
 '''
 
 import os
-from ansible.errors import AnsibleParserError
+from ansible.errors import AnsibleError, AnsibleParserError
 from ansible.module_utils.common.text.converters import to_native
 from ansible.plugins.vars import BaseVarsPlugin
 from ansible.utils.path import basedir
@@ -75,7 +75,10 @@
         for found in found_files:
             new_data = loader.load_from_file(found, cache='all', unsafe=True)
             if new_data:  # ignore empty files
-                data = combine_vars(data, new_data)
+                try:
+                    data = combine_vars(data, new_data)
+                except AnsibleError as e:
+                    raise AnsibleParserError("Could not process '%s'." % 
found, orig_exc=e)
         return data
 
     def get_vars(self, loader, path, entities, cache=True):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ansible_core-2.18.11/lib/ansible/release.py 
new/ansible_core-2.18.12/lib/ansible/release.py
--- old/ansible_core-2.18.11/lib/ansible/release.py     2025-11-05 
00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/lib/ansible/release.py     2025-12-09 
17:45:08.000000000 +0100
@@ -17,6 +17,6 @@
 
 from __future__ import annotations
 
-__version__ = '2.18.11'
+__version__ = '2.18.12'
 __author__ = 'Ansible, Inc.'
 __codename__ = "Fool in the Rain"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ansible_core-2.18.11/lib/ansible/utils/vars.py 
new/ansible_core-2.18.12/lib/ansible/utils/vars.py
--- old/ansible_core-2.18.11/lib/ansible/utils/vars.py  2025-11-05 
00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/lib/ansible/utils/vars.py  2025-12-09 
17:45:08.000000000 +0100
@@ -69,9 +69,7 @@
                 myvars.append(dumps(x))
             except Exception:
                 myvars.append(to_native(x))
-        raise AnsibleError("failed to combine variables, expected dicts but 
got a '{0}' and a '{1}': \n{2}\n{3}".format(
-            a.__class__.__name__, b.__class__.__name__, myvars[0], myvars[1])
-        )
+        raise AnsibleError("failed to combine variables, expected dicts but 
got a '{0}' and a '{1}'.".format(a.__class__.__name__, b.__class__.__name__))
 
 
 def combine_vars(a, b, merge=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ansible_core-2.18.11/lib/ansible/vars/manager.py 
new/ansible_core-2.18.12/lib/ansible/vars/manager.py
--- old/ansible_core-2.18.11/lib/ansible/vars/manager.py        2025-11-05 
00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/lib/ansible/vars/manager.py        2025-12-09 
17:45:08.000000000 +0100
@@ -60,7 +60,7 @@
 
     for item in data:
         if not isinstance(item, MutableMapping):
-            raise AnsibleError("variable files must contain either a 
dictionary of variables, or a list of dictionaries. Got: %s (%s)" % (a, 
type(a)))
+            raise AnsibleError("variable files must contain either a 
dictionary of variables, or a list of dictionaries. Got: %s " % (type(a)))
 
     return data
 
@@ -367,6 +367,8 @@
                                 continue
                             except AnsibleParserError:
                                 raise
+                            except AnsibleError as e:
+                                raise AnsibleError("Invalid vars_file '%s'." % 
found_file, orig_exc=e)
                     except (UndefinedError, AnsibleUndefinedVariable):
                         if host is not None and 
self._fact_cache.get(host.name, dict()).get('module_setup') and task is not 
None:
                             raise AnsibleUndefinedVariable("an undefined 
variable was found when attempting to template the vars_files item '%s'"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/galaxy.yml
 
new/ansible_core-2.18.12/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/galaxy.yml
--- 
old/ansible_core-2.18.11/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/galaxy.yml
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/ansible_core-2.18.12/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/galaxy.yml
 2025-12-09 17:45:08.000000000 +0100
@@ -0,0 +1,5 @@
+namespace: ns
+name: prerelease
+version: 3.0.0-prerelease
+authors:
+  - Ansible
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/meta/runtime.yml
 
new/ansible_core-2.18.12/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/meta/runtime.yml
--- 
old/ansible_core-2.18.11/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/meta/runtime.yml
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/ansible_core-2.18.12/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/meta/runtime.yml
   2025-12-09 17:45:08.000000000 +0100
@@ -0,0 +1,25 @@
+plugin_routing:
+  modules:
+    deprecated_module:
+      deprecation:
+        removal_version: 4.0.0
+        warning_text: Will no longer be there.
+    tombstoned_module:
+      tombstone:
+        removal_version: 3.0.0
+        warning_text: Is no longer there.
+    tombstoned_module_with_prerelease_version:
+      tombstone:
+        removal_version: 3.0.0-a1
+        warning_text: Is no longer there.
+    tombstoned_module_with_prerelease_and_build_meta_version:
+      tombstone:
+        removal_version: 3.0.0-a1+bla.test.1234567
+        warning_text: Is no longer there.
+    tombstoned_module_with_build_meta_version:
+      tombstone:
+        removal_version: 3.0.0+bla.test.1234567
+        warning_text: Is no longer there.
+    module_with_invalid_removal_version:
+      tombstone:
+        removal_version: 4.0.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/integration/targets/ansible-test-sanity-runtime-metadata/expected-prerelease.txt
 
new/ansible_core-2.18.12/test/integration/targets/ansible-test-sanity-runtime-metadata/expected-prerelease.txt
--- 
old/ansible_core-2.18.11/test/integration/targets/ansible-test-sanity-runtime-metadata/expected-prerelease.txt
      1970-01-01 01:00:00.000000000 +0100
+++ 
new/ansible_core-2.18.12/test/integration/targets/ansible-test-sanity-runtime-metadata/expected-prerelease.txt
      2025-12-09 17:45:08.000000000 +0100
@@ -0,0 +1 @@
+meta/runtime.yml:0:0: The tombstone removal_version ('4.0.0') must not be 
after the current version (SemanticVersion('3.0.0')) for dictionary value @ 
data['plugin_routing']['modules']['module_with_invalid_removal_version']['tombstone']['removal_version'].
 Got '4.0.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/integration/targets/ansible-test-sanity-runtime-metadata/runme.sh
 
new/ansible_core-2.18.12/test/integration/targets/ansible-test-sanity-runtime-metadata/runme.sh
--- 
old/ansible_core-2.18.11/test/integration/targets/ansible-test-sanity-runtime-metadata/runme.sh
     2025-11-05 00:26:58.000000000 +0100
+++ 
new/ansible_core-2.18.12/test/integration/targets/ansible-test-sanity-runtime-metadata/runme.sh
     2025-12-09 17:45:08.000000000 +0100
@@ -13,3 +13,8 @@
 ansible-test sanity --test runtime-metadata --color --truncate 0 --failure-ok 
--lint "${@}" 1> actual-stdout.txt 2> actual-stderr.txt
 diff -u "${TEST_DIR}/expected-no_version.txt" actual-stdout.txt
 grep -F -f "${TEST_DIR}/expected-no_version.txt" actual-stderr.txt
+
+cd ../prerelease
+ansible-test sanity --test runtime-metadata --color --truncate 0 --failure-ok 
--lint "${@}" 1> actual-stdout.txt 2> actual-stderr.txt
+diff -u "${TEST_DIR}/expected-prerelease.txt" actual-stdout.txt
+grep -F -f "${TEST_DIR}/expected-prerelease.txt" actual-stderr.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/integration/targets/iptables/tasks/main.yml 
new/ansible_core-2.18.12/test/integration/targets/iptables/tasks/main.yml
--- old/ansible_core-2.18.11/test/integration/targets/iptables/tasks/main.yml   
2025-11-05 00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/test/integration/targets/iptables/tasks/main.yml   
2025-12-09 17:45:08.000000000 +0100
@@ -35,4 +35,17 @@
     # prevent attempts to upgrade the kernel and install kernel modules for a 
non-running kernel version
     exclude: "{{ 'kernel-core' if ansible_distribution == 'RedHat' else omit 
}}"
 
+- name: install xt_comment for iptables `-m comment` tests on RHEL 10
+  dnf:
+    name:
+    - kernel-modules-extra-{{ ansible_facts.kernel }}
+    state: present
+    exclude:
+    # prevent attempts to upgrade the kernel and install kernel modules for a 
non-running kernel version
+    - kernel-core
+  when:
+  - ansible_distribution == 'RedHat'
+  - >-
+    ansible_distribution_major_version | int >= 10
+
 - import_tasks: chain_management.yml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/integration/targets/var_blending/error_handling.yml
 
new/ansible_core-2.18.12/test/integration/targets/var_blending/error_handling.yml
--- 
old/ansible_core-2.18.11/test/integration/targets/var_blending/error_handling.yml
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/ansible_core-2.18.12/test/integration/targets/var_blending/error_handling.yml
   2025-12-09 17:45:08.000000000 +0100
@@ -0,0 +1,14 @@
+- hosts: all
+  name: test vault errors
+  gather_facts: false
+  tasks:
+
+  - name: bad included vault
+    include_vars:
+      file: vars/bad_vault.yml
+    tags: includevault, never
+    no_log: false
+
+  - name: Show bad vault contents ... if i get here, it was a good vault!
+    debug:
+      msg: "{{ test_password }} {{ jdbc_test_password }} {{ api_test_password 
}}"
File 
old/ansible_core-2.18.11/test/integration/targets/var_blending/group_vars/local 
is a regular file while file 
new/ansible_core-2.18.12/test/integration/targets/var_blending/group_vars/local 
is a directory
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/integration/targets/var_blending/runme.sh 
new/ansible_core-2.18.12/test/integration/targets/var_blending/runme.sh
--- old/ansible_core-2.18.11/test/integration/targets/var_blending/runme.sh     
2025-11-05 00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/test/integration/targets/var_blending/runme.sh     
2025-12-09 17:45:08.000000000 +0100
@@ -3,3 +3,12 @@
 set -eux
 
 ansible-playbook test_var_blending.yml -i inventory -e @test_vars.yml -v "$@"
+
+# check bad vault file erros
+[ "$(ansible-playbook error_handling.yml -i inventory --vault-password-file 
supersecretvaultsecret -e @vars/bad_vault.yml 2>&1 | grep -c 'dummy')" -eq "0" ]
+[ "$(ansible-playbook error_handling.yml -i inventory --vault-password-file 
supersecretvaultsecret --tags includevault 2>&1 | grep -c 'dummy')" -eq "0" ]
+
+# setup group file for bad vault tests
+trap 'rm group_vars/local/bad_vault.yml' EXIT
+ln -s "${PWD}/vars/bad_vault.yml" group_vars/local/
+[ "$(ansible-playbook error_handling.yml -i inventory --vault-password-file 
supersecretvaultsecret 2>&1 | grep -c 'dummy')" -eq "0" ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/integration/targets/var_blending/supersecretvaultsecret
 
new/ansible_core-2.18.12/test/integration/targets/var_blending/supersecretvaultsecret
--- 
old/ansible_core-2.18.11/test/integration/targets/var_blending/supersecretvaultsecret
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/ansible_core-2.18.12/test/integration/targets/var_blending/supersecretvaultsecret
       2025-12-09 17:45:08.000000000 +0100
@@ -0,0 +1 @@
+test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/integration/targets/var_blending/vars/bad_vault.yml
 
new/ansible_core-2.18.12/test/integration/targets/var_blending/vars/bad_vault.yml
--- 
old/ansible_core-2.18.11/test/integration/targets/var_blending/vars/bad_vault.yml
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/ansible_core-2.18.12/test/integration/targets/var_blending/vars/bad_vault.yml
   2025-12-09 17:45:08.000000000 +0100
@@ -0,0 +1,10 @@
+$ANSIBLE_VAULT;1.1;AES256
+65616232393566313961313431386633366639386133383230656230333934656366363636393730
+3266313739663639636161373033333865303461343936370a356463393635623664316464353061
+63396639643331303231616336663562303764653733326532316139643036336436396565653531
+3836383032626262620a316666363164626537346663383333376330623339633762363932613537
+32663462613532646139633364363136656132346661373331363164356162313762343337393666
+38653864363938316534333438643761623264376535336233656630376430346366333262313532
+33366662663137306431623464303561383730336466613166386136656364306436343032343631
+37396234633230626263373435623731616664653939343630393935626461396230663734373861
+3634
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/lib/ansible_test/_internal/ci/azp.py 
new/ansible_core-2.18.12/test/lib/ansible_test/_internal/ci/azp.py
--- old/ansible_core-2.18.11/test/lib/ansible_test/_internal/ci/azp.py  
2025-11-05 00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/test/lib/ansible_test/_internal/ci/azp.py  
2025-12-09 17:45:08.000000000 +0100
@@ -1,6 +1,7 @@
 """Support code for working with Azure Pipelines."""
 from __future__ import annotations
 
+import json
 import os
 import tempfile
 import uuid
@@ -26,6 +27,7 @@
 
 from ..util import (
     display,
+    ApplicationError,
     MissingEnvironmentVariable,
 )
 
@@ -219,6 +221,19 @@
             self.diff = []
 
     def get_successful_merge_run_commits(self) -> set[str]:
+        """
+        Return a set of recent successful merge commits from Azure Pipelines.
+        A warning will be displayed and no commits returned if an error occurs.
+        """
+        try:
+            commits = self._get_successful_merge_run_commits()
+        except ApplicationError as ex:
+            commits = set()
+            display.warning(f'Cannot determine changes. All tests will be 
executed. Reason: {ex}')
+
+        return commits
+
+    def _get_successful_merge_run_commits(self) -> set[str]:
         """Return a set of recent successful merge commits from Azure 
Pipelines."""
         parameters = dict(
             maxBuildsPerDefinition=100,  # max 5000
@@ -229,20 +244,29 @@
             repositoryId='%s/%s' % (self.org, self.project),
         )
 
-        url = '%s%s/_apis/build/builds?api-version=6.0&%s' % (self.org_uri, 
self.project, urllib.parse.urlencode(parameters))
+        url = '%s%s/_apis/build/builds?api-version=7.1&%s' % (self.org_uri, 
self.project, urllib.parse.urlencode(parameters))
 
         http = HttpClient(self.args, always=True)
         response = http.get(url)
 
-        # noinspection PyBroadException
         try:
-            result = response.json()
-        except Exception:  # pylint: disable=broad-except
-            # most likely due to a private project, which returns an HTTP 203 
response with HTML
-            display.warning('Unable to find project. Cannot determine changes. 
All tests will be executed.')
-            return set()
+            result = json.loads(response.response)
+            result_type = 'JSON'
+        except json.JSONDecodeError:
+            result = ...
+            result_type = 'Non-JSON'
 
-        commits = set(build['sourceVersion'] for build in result['value'])
+        result_description = f'HTTP {response.status_code} {result_type} 
result'
+
+        if response.status_code != 200 or result is ...:
+            raise ApplicationError(f'Unable to find project due to 
{result_description}.')
+
+        try:
+            commits = {build['sourceVersion'] for build in result['value']}
+        except KeyError as ex:
+            raise ApplicationError(f'Missing {ex.args[0]!r} key in response 
from {result_description}.') from ex
+        except (ValueError, TypeError) as ex:
+            raise ApplicationError(f'Unexpected response format from 
{result_description}: {ex}') from ex
 
         return commits
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/lib/ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py
 
new/ansible_core-2.18.12/test/lib/ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py
--- 
old/ansible_core-2.18.11/test/lib/ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py
       2025-11-05 00:26:58.000000000 +0100
+++ 
new/ansible_core-2.18.12/test/lib/ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py
       2025-12-09 17:45:08.000000000 +0100
@@ -124,7 +124,7 @@
     try:
         result = collection_detail.read_manifest_json('.') or 
collection_detail.read_galaxy_yml('.')
         version = SemanticVersion()
-        version.parse(result['version'])
+        version.parse(result['version'].split('-', 1)[0].split('+', 1)[0])
         return version
     except Exception:  # pylint: disable=broad-except
         # We do not care why it fails, in case we cannot get the version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/sanity/code-smell/mypy/ansible-core.ini 
new/ansible_core-2.18.12/test/sanity/code-smell/mypy/ansible-core.ini
--- old/ansible_core-2.18.11/test/sanity/code-smell/mypy/ansible-core.ini       
2025-11-05 00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/test/sanity/code-smell/mypy/ansible-core.ini       
2025-12-09 17:45:08.000000000 +0100
@@ -21,6 +21,9 @@
 [mypy-ansible_test.*]
 ignore_missing_imports = True
 
+[mypy-pytest_mock]
+ignore_missing_imports = True
+
 [mypy-ansible.module_utils.six.moves.*]
 ignore_missing_imports = True
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/units/ansible_test/_internal/ci/test_azp.py 
new/ansible_core-2.18.12/test/units/ansible_test/_internal/ci/test_azp.py
--- old/ansible_core-2.18.11/test/units/ansible_test/_internal/ci/test_azp.py   
1970-01-01 01:00:00.000000000 +0100
+++ new/ansible_core-2.18.12/test/units/ansible_test/_internal/ci/test_azp.py   
2025-12-09 17:45:08.000000000 +0100
@@ -0,0 +1,96 @@
+from __future__ import annotations
+
+import argparse
+import json
+import os
+import typing as t
+
+import pytest
+import pytest_mock
+
+if t.TYPE_CHECKING:
+    from ansible_test._internal.ci.azp import AzurePipelinesChanges
+
+
+def create_azure_pipelines_changes(mocker: pytest_mock.MockerFixture) -> 
AzurePipelinesChanges:
+    """Prepare an AzurePipelinesChanges instance for testing."""
+    from ansible_test._internal.ci.azp import AzurePipelinesChanges
+    from ansible_test._internal.config import CommonConfig
+
+    namespace = argparse.Namespace()
+    namespace.color = False
+    namespace.explain = False
+    namespace.verbosity = False
+    namespace.debug = False
+    namespace.truncate = False
+    namespace.redact = False
+    namespace.display_traceback = False
+
+    config = CommonConfig(namespace, 'sanity')
+
+    env = dict(
+        HOME=os.environ['HOME'],
+        SYSTEM_COLLECTIONURI='https://dev.azure.com/ansible/',
+        SYSTEM_TEAMPROJECT='ansible',
+        BUILD_REPOSITORY_PROVIDER='GitHub',
+        BUILD_SOURCEBRANCH='devel',
+        BUILD_SOURCEBRANCHNAME='devel',
+    )
+
+    mocker.patch.dict(os.environ, env, clear=True)
+
+    return AzurePipelinesChanges(config)
+
+
[email protected]("status_code,response,expected_commits,expected_warning",
 (
+    # valid 200 responses
+    (200, dict(value=[]), None, None),
+    (200, dict(value=[dict(sourceVersion='abc')]), {'abc'}, None),
+    # invalid 200 responses
+    (200, 'not-json', None, "Unable to find project due to HTTP 200 Non-JSON 
result."),
+    (200, '"not-a-dict"', None, "Unexpected response format from HTTP 200 JSON 
result: string indices must be integers, not 'str'"),
+    (200, dict(value='not-a-list'), None, "Unexpected response format from 
HTTP 200 JSON result: string indices must be integers, not 'str'"),
+    (200, dict(value=['not-a-dict']), None, "Unexpected response format from 
HTTP 200 JSON result: string indices must be integers, not 'str'"),
+    (200, dict(), None, "Missing 'value' key in response from HTTP 200 JSON 
result."),
+    (200, dict(value=[{}]), None, "Missing 'sourceVersion' key in response 
from HTTP 200 JSON result."),
+    # non-200 responses
+    (404, '', None, "Unable to find project due to HTTP 404 Non-JSON result."),
+    (404, '""', None, "Unable to find project due to HTTP 404 JSON result."),
+    (404, dict(value=[]), None, "Unable to find project due to HTTP 404 JSON 
result."),
+))
+def test_get_successful_merge_run_commits(
+    status_code: int,
+    response: object,
+    expected_commits: set[str] | None,
+    expected_warning: str | None,
+    mocker: pytest_mock.MockerFixture,
+) -> None:
+    """Verify AZP commit retrieval handles invalid responses gracefully."""
+    from ansible_test._internal.ci.azp import AzurePipelinesChanges
+    from ansible_test._internal.git import Git
+    from ansible_test._internal.http import HttpClient, HttpResponse
+    from ansible_test._internal.util import display
+
+    if not isinstance(response, str):
+        response = json.dumps(response)
+
+    if expected_warning:
+        expected_warning = f'Cannot determine changes. All tests will be 
executed. Reason: {expected_warning}'
+
+    patched_get = mocker.patch.object(HttpClient, 'get', 
return_value=HttpResponse('GET', 'URL', status_code, response))
+    patched_warning = mocker.patch.object(display, 'warning')
+
+    mocker.patch.object(Git, 'run_git', return_value='')  # avoid git
+
+    spy_get_successful_merge_run_commits = mocker.spy(AzurePipelinesChanges, 
'get_successful_merge_run_commits')
+
+    create_azure_pipelines_changes(mocker)
+
+    assert patched_get.call_count == 1
+
+    if expected_warning:
+        patched_warning.assert_called_once_with(expected_warning)
+    else:
+        patched_warning.assert_not_called()
+
+    assert spy_get_successful_merge_run_commits.spy_return == 
(expected_commits or set())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ansible_core-2.18.11/test/units/playbook/test_task.py 
new/ansible_core-2.18.12/test/units/playbook/test_task.py
--- old/ansible_core-2.18.11/test/units/playbook/test_task.py   2025-11-05 
00:26:58.000000000 +0100
+++ new/ansible_core-2.18.12/test/units/playbook/test_task.py   2025-12-09 
17:45:08.000000000 +0100
@@ -102,16 +102,16 @@
                 self.assertEqual(t.get_validated_value('delay', 
t.fattributes.get('delay'), delay, None), expected)
 
         bad_params = [
-            ('E', ValueError),
-            ('1.E', ValueError),
-            ('E.1', ValueError),
+            'E',
+            '1.E',
+            'E.1',
         ]
-        for delay, expected in bad_params:
-            with self.subTest(f'type "{type(delay)} was cast to float w/o 
error', delay=delay, expected=expected):
+        for delay in bad_params:
+            with self.subTest(f'type "{type(delay)} was cast to float w/o 
error', delay=delay):
                 p = dict(delay=delay)
                 p.update(self._task_base)
                 t = Task().load_data(p)
-                with self.assertRaises(expected):
+                with self.assertRaises(ValueError):
                     dummy = t.get_validated_value('delay', 
t.fattributes.get('delay'), delay, None)
 
     def test_task_auto_name_with_role(self):

++++++ ansible_core-2.18.11.tar.gz.sha256 -> ansible_core-2.18.12.tar.gz.sha256 
++++++
--- 
/work/SRC/openSUSE:Factory/ansible-core-2.18/ansible_core-2.18.11.tar.gz.sha256 
    2025-11-06 18:13:48.224935082 +0100
+++ 
/work/SRC/openSUSE:Factory/.ansible-core-2.18.new.1939/ansible_core-2.18.12.tar.gz.sha256
   2025-12-11 18:44:12.392696041 +0100
@@ -1 +1 @@
-e1e6611559d730e95a9456895e8e157c378e97c479d1dd8299e25a89689bfd9f  
ansible_core-2.18.11.tar.gz
+40e03f74bee7f0eb65e76827017373c4e56dc57ba0618e98c435d875e8e349fc  
ansible_core-2.18.12.tar.gz

Reply via email to