Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ansible-core-2.19 for
openSUSE:Factory checked in at 2025-12-11 18:41:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ansible-core-2.19 (Old)
and /work/SRC/openSUSE:Factory/.ansible-core-2.19.new.1939 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ansible-core-2.19"
Thu Dec 11 18:41:09 2025 rev:2 rq:1322171 version:2.19.5
Changes:
--------
--- /work/SRC/openSUSE:Factory/ansible-core-2.19/ansible-core-2.19.changes
2025-11-21 16:55:51.644293076 +0100
+++
/work/SRC/openSUSE:Factory/.ansible-core-2.19.new.1939/ansible-core-2.19.changes
2025-12-11 18:44:32.825554539 +0100
@@ -1,0 +2,19 @@
+Thu Dec 11 08:53:51 UTC 2025 - Johannes Kastl
<[email protected]>
+
+- update to 2.19.5:
+ * Bugfixes
+ - Fix AnsibleModule.human_to_bytes(), which was never adjusted
+ after the standalone human_to_bytes() got a new parameter
+ default_unit (#85259).
+ - 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)."
+ - first_found - Correct the "Include tasks only if one of the
+ files exists, otherwise skip" example.
+ - get_url - fix regex for GNU Digest line which is used in
+ comparing checksums (#86132).
+
+-------------------------------------------------------------------
Old:
----
ansible_core-2.19.4.tar.gz
ansible_core-2.19.4.tar.gz.sha256
New:
----
ansible_core-2.19.5.tar.gz
ansible_core-2.19.5.tar.gz.sha256
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ansible-core-2.19.spec ++++++
--- /var/tmp/diff_new_pack.90fJjk/_old 2025-12-11 18:44:35.325659583 +0100
+++ /var/tmp/diff_new_pack.90fJjk/_new 2025-12-11 18:44:35.329659751 +0100
@@ -43,7 +43,7 @@
%endif
Name: ansible-core-2.19
-Version: 2.19.4
+Version: 2.19.5
Release: 0
Summary: Radically simple IT automation
License: GPL-3.0-or-later
@@ -52,6 +52,8 @@
Source1: ansible_core-%{version}.tar.gz.sha256
BuildArch: noarch
+Provides: ansible-core = %{version}
+
# cannot be installed with ansible < 3 or ansible-base
Conflicts: ansible < 3
Conflicts: ansible-base
++++++ ansible_core-2.19.4.tar.gz -> ansible_core-2.19.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.4/PKG-INFO
new/ansible_core-2.19.5/PKG-INFO
--- old/ansible_core-2.19.4/PKG-INFO 2025-11-05 00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/PKG-INFO 2025-12-09 17:24:02.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: ansible-core
-Version: 2.19.4
+Version: 2.19.5
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.19.4/ansible_core.egg-info/PKG-INFO
new/ansible_core-2.19.5/ansible_core.egg-info/PKG-INFO
--- old/ansible_core-2.19.4/ansible_core.egg-info/PKG-INFO 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/ansible_core.egg-info/PKG-INFO 2025-12-09
17:24:02.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: ansible-core
-Version: 2.19.4
+Version: 2.19.5
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.19.4/ansible_core.egg-info/SOURCES.txt
new/ansible_core-2.19.5/ansible_core.egg-info/SOURCES.txt
--- old/ansible_core-2.19.4/ansible_core.egg-info/SOURCES.txt 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/ansible_core.egg-info/SOURCES.txt 2025-12-09
17:24:02.000000000 +0100
@@ -1220,10 +1220,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
@@ -4183,13 +4186,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
@@ -4197,6 +4202,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
@@ -4861,6 +4867,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
@@ -5012,6 +5019,7 @@
test/units/module_utils/basic/test_get_file_attributes.py
test/units/module_utils/basic/test_get_module_path.py
test/units/module_utils/basic/test_heuristic_log_sanitize.py
+test/units/module_utils/basic/test_human_to_bytes.py
test/units/module_utils/basic/test_imports.py
test/units/module_utils/basic/test_log.py
test/units/module_utils/basic/test_no_log.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.4/changelogs/CHANGELOG-v2.19.rst
new/ansible_core-2.19.5/changelogs/CHANGELOG-v2.19.rst
--- old/ansible_core-2.19.4/changelogs/CHANGELOG-v2.19.rst 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/changelogs/CHANGELOG-v2.19.rst 2025-12-09
17:24:02.000000000 +0100
@@ -4,6 +4,24 @@
.. contents:: Topics
+v2.19.5
+=======
+
+Release Summary
+---------------
+
+| Release Date: 2025-12-09
+| `Porting Guide
<https://docs.ansible.com/ansible-core/2.19/porting_guides/porting_guide_core_2.19.html>`__
+
+Bugfixes
+--------
+
+- Fix ``AnsibleModule.human_to_bytes()``, which was never adjusted after the
standalone ``human_to_bytes()`` got a new parameter ``default_unit``
(https://github.com/ansible/ansible/pull/85259).
+- 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)."
+- first_found - Correct the "Include tasks only if one of the files exists,
otherwise skip" example.
+- get_url - fix regex for GNU Digest line which is used in comparing checksums
(https://github.com/ansible/ansible/issues/86132).
+
v2.19.4
=======
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.4/changelogs/changelog.yaml
new/ansible_core-2.19.5/changelogs/changelog.yaml
--- old/ansible_core-2.19.4/changelogs/changelog.yaml 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/changelogs/changelog.yaml 2025-12-09
17:24:02.000000000 +0100
@@ -1408,3 +1408,43 @@
- option_deprecation_help.yml
- package_facts.yml
release_date: '2025-10-29'
+ 2.19.5:
+ changes:
+ release_summary: '| Release Date: 2025-12-09
+
+ | `Porting Guide
<https://docs.ansible.com/ansible-core/2.19/porting_guides/porting_guide_core_2.19.html>`__
+
+ '
+ codename: What Is and What Should Never Be
+ fragments:
+ - 2.19.5_summary.yaml
+ release_date: '2025-12-09'
+ 2.19.5rc1:
+ changes:
+ bugfixes:
+ - Fix ``AnsibleModule.human_to_bytes()``, which was never adjusted after
the
+ standalone ``human_to_bytes()`` got a new parameter ``default_unit``
(https://github.com/ansible/ansible/pull/85259).
+ - 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)."
+ - first_found - Correct the "Include tasks only if one of the files
exists,
+ otherwise skip" example.
+ - get_url - fix regex for GNU Digest line which is used in comparing
checksums
+ (https://github.com/ansible/ansible/issues/86132).
+ release_summary: '| Release Date: 2025-12-02
+
+ | `Porting Guide
<https://docs.ansible.com/ansible-core/2.19/porting_guides/porting_guide_core_2.19.html>`__
+
+ '
+ codename: What Is and What Should Never Be
+ fragments:
+ - 2.19.5rc1_summary.yaml
+ - 85193-runtime-metadata.yml
+ - 85259-fix-human_to_bytes.yml
+ - first-found-example.yml
+ - get_url_regex.yml
+ - varloaderror.yml
+ release_date: '2025-12-02'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/lib/ansible/module_utils/ansible_release.py
new/ansible_core-2.19.5/lib/ansible/module_utils/ansible_release.py
--- old/ansible_core-2.19.4/lib/ansible/module_utils/ansible_release.py
2025-11-05 00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/lib/ansible/module_utils/ansible_release.py
2025-12-09 17:24:02.000000000 +0100
@@ -17,6 +17,6 @@
from __future__ import annotations
-__version__ = '2.19.4'
+__version__ = '2.19.5'
__author__ = 'Ansible, Inc.'
__codename__ = "What Is and What Should Never Be"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/lib/ansible/module_utils/basic.py
new/ansible_core-2.19.5/lib/ansible/module_utils/basic.py
--- old/ansible_core-2.19.4/lib/ansible/module_utils/basic.py 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/lib/ansible/module_utils/basic.py 2025-12-09
17:24:02.000000000 +0100
@@ -2150,14 +2150,16 @@
with open(filename, 'a') as fh:
fh.write(str)
- def bytes_to_human(self, size):
+ @staticmethod
+ def bytes_to_human(size: int) -> str:
return bytes_to_human(size)
# for backwards compatibility
pretty_bytes = bytes_to_human
- def human_to_bytes(self, number, isbits=False):
- return human_to_bytes(number, isbits)
+ @staticmethod
+ def human_to_bytes(number: str, isbits: bool = False) -> int:
+ return human_to_bytes(number, isbits=isbits)
#
# Backwards compat
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/lib/ansible/module_utils/common/text/formatters.py
new/ansible_core-2.19.5/lib/ansible/module_utils/common/text/formatters.py
--- old/ansible_core-2.19.4/lib/ansible/module_utils/common/text/formatters.py
2025-11-05 00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/lib/ansible/module_utils/common/text/formatters.py
2025-12-09 17:24:02.000000000 +0100
@@ -60,7 +60,7 @@
if 'Mb'/'Kb'/... is passed, the ValueError will be rased.
When isbits is True, converts bits from a human-readable format to integer.
- example: human_to_bytes('1Mb', isbits=True) returns 8388608 (int) -
+ example: human_to_bytes('1Mb', isbits=True) returns 1048576 (int) -
string bits representation was passed and return as a number or bits.
The function expects 'b' (lowercase) as a bit identifier, e.g.
'Mb'/'Kb'/etc.
if 'MB'/'KB'/... is passed, the ValueError will be rased.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.4/lib/ansible/modules/get_url.py
new/ansible_core-2.19.5/lib/ansible/modules/get_url.py
--- old/ansible_core-2.19.4/lib/ansible/modules/get_url.py 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/lib/ansible/modules/get_url.py 2025-12-09
17:24:02.000000000 +0100
@@ -477,17 +477,13 @@
return urlsplit(checksum).scheme in supported_schemes
-def parse_digest_lines(filename, lines):
+def parse_digest_lines(filename: str, lines: list[str]) -> list[tuple[str,
str]]:
"""Returns a list of tuple containing the filename and digest depending
upon
the lines provided
-
- Args:
- filename (str): Name of the filename, used only when the digest is
one-liner
- lines (list): A list of lines containing filenames and checksums
"""
checksum_map = []
BSD_DIGEST_LINE = re.compile(r'^(\w+) ?\((?P<path>.+)\) ?=
(?P<digest>[\w.]+)$')
- GNU_DIGEST_LINE = re.compile(r'^(?P<digest>[\w.]+) ([ *])(?P<path>.+)$')
+ GNU_DIGEST_LINE =
re.compile(r'^(?P<digest>[\w.]+)\s+(\*|\.\/|\.)?(?P<path>.+)$')
if len(lines) == 1 and len(lines[0].split()) == 1:
# Only a single line with a single string
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/lib/ansible/plugins/lookup/first_found.py
new/ansible_core-2.19.5/lib/ansible/plugins/lookup/first_found.py
--- old/ansible_core-2.19.4/lib/ansible/plugins/lookup/first_found.py
2025-11-05 00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/lib/ansible/plugins/lookup/first_found.py
2025-12-09 17:24:02.000000000 +0100
@@ -79,7 +79,7 @@
- name: Include tasks only if one of the files exists, otherwise skip
ansible.builtin.include_tasks: '{{ tasks_file }}'
- when: tasks_file != ""
+ when: tasks_file is not none
vars:
tasks_file: "{{ lookup('ansible.builtin.first_found', files=['tasks.yaml',
'other_tasks.yaml'], errors='ignore') }}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/lib/ansible/plugins/vars/host_group_vars.py
new/ansible_core-2.19.5/lib/ansible/plugins/vars/host_group_vars.py
--- old/ansible_core-2.19.4/lib/ansible/plugins/vars/host_group_vars.py
2025-11-05 00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/lib/ansible/plugins/vars/host_group_vars.py
2025-12-09 17:24:02.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
@@ -74,7 +74,10 @@
for found in found_files:
new_data = loader.load_from_file(found, cache='all', unsafe=True,
trusted_as_template=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(f"Could not process {found!r}.")
from 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.19.4/lib/ansible/release.py
new/ansible_core-2.19.5/lib/ansible/release.py
--- old/ansible_core-2.19.4/lib/ansible/release.py 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/lib/ansible/release.py 2025-12-09
17:24:02.000000000 +0100
@@ -17,6 +17,6 @@
from __future__ import annotations
-__version__ = '2.19.4'
+__version__ = '2.19.5'
__author__ = 'Ansible, Inc.'
__codename__ = "What Is and What Should Never Be"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.4/lib/ansible/utils/vars.py
new/ansible_core-2.19.5/lib/ansible/utils/vars.py
--- old/ansible_core-2.19.4/lib/ansible/utils/vars.py 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/lib/ansible/utils/vars.py 2025-12-09
17:24:02.000000000 +0100
@@ -72,9 +72,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(f"failed to combine variables, expected dicts but
got a '{a.__class__.__name__}' and a '{b.__class__.__name__}'.")
def combine_vars(a, b, merge=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.4/lib/ansible/vars/manager.py
new/ansible_core-2.19.5/lib/ansible/vars/manager.py
--- old/ansible_core-2.19.4/lib/ansible/vars/manager.py 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/lib/ansible/vars/manager.py 2025-12-09
17:24:02.000000000 +0100
@@ -345,18 +345,16 @@
data =
preprocess_vars(self._loader.load_from_file(found_file, unsafe=True,
cache='vaulted', trusted_as_template=True))
if data is not None:
for item in data:
- all_vars = _combine_and_track(all_vars,
item, "play vars_files from '%s'" % vars_file)
+ all_vars = _combine_and_track(all_vars,
item, f"play vars_files from {vars_file!r}")
display.vvv(f"Read `vars_file` {found_file!r}.")
break
except AnsibleFileNotFound:
# we continue on loader failures
continue
- except AnsibleParserError:
+ except (AnsibleParserError, AnsibleUndefinedVariable):
raise
- except AnsibleUndefinedVariable:
- raise
- except Exception as ex:
- raise AnsibleParserError(f"Error reading
`vars_files` file {vars_file!r}.", obj=vars_file) from ex
+ except AnsibleError as e:
+ raise AnsibleError(f"Invalid vars_files file
{found_file!r}.") from e
except AnsibleUndefinedVariable as ex:
if host is not None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/galaxy.yml
new/ansible_core-2.19.5/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/galaxy.yml
---
old/ansible_core-2.19.4/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.19.5/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/galaxy.yml
2025-12-09 17:24:02.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.19.4/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/meta/runtime.yml
new/ansible_core-2.19.5/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/meta/runtime.yml
---
old/ansible_core-2.19.4/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.19.5/test/integration/targets/ansible-test-sanity-runtime-metadata/ansible_collections/ns/prerelease/meta/runtime.yml
2025-12-09 17:24:02.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.19.4/test/integration/targets/ansible-test-sanity-runtime-metadata/expected-prerelease.txt
new/ansible_core-2.19.5/test/integration/targets/ansible-test-sanity-runtime-metadata/expected-prerelease.txt
---
old/ansible_core-2.19.4/test/integration/targets/ansible-test-sanity-runtime-metadata/expected-prerelease.txt
1970-01-01 01:00:00.000000000 +0100
+++
new/ansible_core-2.19.5/test/integration/targets/ansible-test-sanity-runtime-metadata/expected-prerelease.txt
2025-12-09 17:24:02.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.19.4/test/integration/targets/ansible-test-sanity-runtime-metadata/runme.sh
new/ansible_core-2.19.5/test/integration/targets/ansible-test-sanity-runtime-metadata/runme.sh
---
old/ansible_core-2.19.4/test/integration/targets/ansible-test-sanity-runtime-metadata/runme.sh
2025-11-05 00:27:03.000000000 +0100
+++
new/ansible_core-2.19.5/test/integration/targets/ansible-test-sanity-runtime-metadata/runme.sh
2025-12-09 17:24:02.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.19.4/test/integration/targets/get_url/tasks/main.yml
new/ansible_core-2.19.5/test/integration/targets/get_url/tasks/main.yml
--- old/ansible_core-2.19.4/test/integration/targets/get_url/tasks/main.yml
2025-11-05 00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/test/integration/targets/get_url/tasks/main.yml
2025-12-09 17:24:02.000000000 +0100
@@ -1,20 +1,6 @@
# Test code for the get_url module
# (c) 2014, Richard Isaacson <[email protected]>
-
-# This file is part of Ansible
-#
-# Ansible is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Ansible is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
+# GNU General Public License v3.0+ (see COPYING or
https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Determine if python looks like it will support modern ssl features
like SNI
command: "{{ ansible_python.executable }} -c 'from ssl import SSLContext'"
@@ -332,13 +318,13 @@
- name: create src file
copy:
- dest: '{{ files_dir }}/27617.txt'
- content: "ptux"
-
-- name: create duplicate src file
- copy:
- dest: '{{ files_dir }}/71420.txt'
+ dest: '{{ files_dir }}/{{ item }}.txt'
content: "ptux"
+ loop:
+ - 27617
+ - 71420
+ - 86132
+ - 86132_single_space
- name: create sha1 checksum file of src
copy:
@@ -346,6 +332,8 @@
content: |
a97e6837f60cec6da4491bab387296bbcd72bdba 27617.txt
a97e6837f60cec6da4491bab387296bbcd72bdba 71420.txt
+ a97e6837f60cec6da4491bab387296bbcd72bdba 86132.txt
+ a97e6837f60cec6da4491bab387296bbcd72bdba 86132_single_space.txt
3911340502960ca33aece01129234460bfeb2791 not_target1.txt
1b4b6adf30992cedb0f6edefd6478ff0a593b2e4 not_target2.txt
@@ -355,6 +343,8 @@
content: |
b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
27617.txt
b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
71420.txt
+ b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
86132.txt
+ b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
86132_single_space.txt
30949cc401e30ac494d695ab8764a9f76aae17c5d73c67f65e9b558f47eff892
not_target1.txt
d0dbfc1945bc83bf6606b770e442035f2c4e15c886ee0c22fb3901ba19900b5b
not_target2.txt
@@ -364,6 +354,8 @@
content: |
b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
./27617.txt
b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
./71420.txt
+ b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
./86132.txt
+ b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
./86132_single_space.txt
30949cc401e30ac494d695ab8764a9f76aae17c5d73c67f65e9b558f47eff892
./not_target1.txt
d0dbfc1945bc83bf6606b770e442035f2c4e15c886ee0c22fb3901ba19900b5b
./not_target2.txt
@@ -373,6 +365,8 @@
content: |
b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
*27617.txt
b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
*71420.txt
+ b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
*86132.txt
+ b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.
*86132_single_space.txt
30949cc401e30ac494d695ab8764a9f76aae17c5d73c67f65e9b558f47eff892
*not_target1.txt
d0dbfc1945bc83bf6606b770e442035f2c4e15c886ee0c22fb3901ba19900b5b
*not_target2.txt
@@ -551,6 +545,61 @@
path: "{{ remote_tmp_dir }}/27617.txt"
register: stat_result_sha256_checksum_only
+- name: download 86132.txt with sha1 checksum url
+ get_url:
+ url: 'http://localhost:{{ http_port }}/86132.txt'
+ dest: '{{ remote_tmp_dir }}'
+ checksum: 'sha1:http://localhost:{{ http_port }}/sha1sum.txt'
+ register: result_sha1_86132
+
+- stat:
+ path: "{{ remote_tmp_dir }}/86132.txt"
+ register: stat_result_sha1_86132
+
+- name: download 86132.txt with sha256 checksum url
+ get_url:
+ url: 'http://localhost:{{ http_port }}/86132.txt'
+ dest: '{{ remote_tmp_dir }}/86132sha256.txt'
+ checksum: 'sha256:http://localhost:{{ http_port }}/sha256sum.txt'
+ register: result_sha256_86132
+
+- stat:
+ path: "{{ remote_tmp_dir }}/86132.txt"
+ register: stat_result_sha256_86132
+
+- name: download 86132.txt with sha256 checksum url with dot leading paths
+ get_url:
+ url: 'http://localhost:{{ http_port }}/86132.txt'
+ dest: '{{ remote_tmp_dir }}/86132sha256_with_dot.txt'
+ checksum: 'sha256:http://localhost:{{ http_port }}/sha256sum_with_dot.txt'
+ register: result_sha256_with_dot_86132
+
+- stat:
+ path: "{{ remote_tmp_dir }}/86132sha256_with_dot.txt"
+ register: stat_result_sha256_with_dot_86132
+
+- name: download 86132.txt with sha256 checksum url with asterisk leading paths
+ get_url:
+ url: 'http://localhost:{{ http_port }}/86132.txt'
+ dest: '{{ remote_tmp_dir }}/86132sha256_with_asterisk.txt'
+ checksum: 'sha256:http://localhost:{{ http_port
}}/sha256sum_with_asterisk.txt'
+ register: result_sha256_with_asterisk_86132
+
+- stat:
+ path: "{{ remote_tmp_dir }}/86132sha256_with_asterisk.txt"
+ register: stat_result_sha256_with_asterisk_86132
+
+- name: download 86132_single_space.txt with sha256 checksum url
+ get_url:
+ url: 'http://localhost:{{ http_port }}/86132_single_space.txt'
+ dest: '{{ remote_tmp_dir }}/86132_single_space.txt'
+ checksum: 'sha256:http://localhost:{{ http_port }}/sha256sum.txt'
+ register: result_sha256_86132_single_space
+
+- stat:
+ path: "{{ remote_tmp_dir }}/86132_single_space.txt"
+ register: stat_result_sha256_86132_single_space
+
- name: Assert that the file was downloaded
assert:
that:
@@ -579,6 +628,16 @@
- "stat_result_sha256_with_asterisk_71420.stat.exists == true"
- "stat_result_sha256_with_file_scheme_71420.stat.exists == true"
- "stat_result_sha256_checksum_only.stat.exists == true"
+ - result_sha1_86132 is changed
+ - result_sha256_86132 is changed
+ - result_sha256_with_dot_86132 is changed
+ - result_sha256_with_asterisk_86132 is changed
+ - "stat_result_sha1_86132.stat.exists == true"
+ - "stat_result_sha256_86132.stat.exists == true"
+ - "stat_result_sha256_with_dot_86132.stat.exists == true"
+ - "stat_result_sha256_with_asterisk_86132.stat.exists == true"
+ - result_sha256_86132_single_space is changed
+ - "stat_result_sha256_86132_single_space.stat.exists == true"
- name: Test for incomplete data read (issue 85164)
get_url:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/test/integration/targets/iptables/tasks/main.yml
new/ansible_core-2.19.5/test/integration/targets/iptables/tasks/main.yml
--- old/ansible_core-2.19.4/test/integration/targets/iptables/tasks/main.yml
2025-11-05 00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/test/integration/targets/iptables/tasks/main.yml
2025-12-09 17:24:02.000000000 +0100
@@ -35,4 +35,14 @@
# 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'
+
- import_tasks: chain_management.yml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/test/integration/targets/var_blending/error_handling.yml
new/ansible_core-2.19.5/test/integration/targets/var_blending/error_handling.yml
---
old/ansible_core-2.19.4/test/integration/targets/var_blending/error_handling.yml
1970-01-01 01:00:00.000000000 +0100
+++
new/ansible_core-2.19.5/test/integration/targets/var_blending/error_handling.yml
2025-12-09 17:24:02.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.19.4/test/integration/targets/var_blending/group_vars/local
is a regular file while file
new/ansible_core-2.19.5/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.19.4/test/integration/targets/var_blending/runme.sh
new/ansible_core-2.19.5/test/integration/targets/var_blending/runme.sh
--- old/ansible_core-2.19.4/test/integration/targets/var_blending/runme.sh
2025-11-05 00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/test/integration/targets/var_blending/runme.sh
2025-12-09 17:24:02.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.19.4/test/integration/targets/var_blending/supersecretvaultsecret
new/ansible_core-2.19.5/test/integration/targets/var_blending/supersecretvaultsecret
---
old/ansible_core-2.19.4/test/integration/targets/var_blending/supersecretvaultsecret
1970-01-01 01:00:00.000000000 +0100
+++
new/ansible_core-2.19.5/test/integration/targets/var_blending/supersecretvaultsecret
2025-12-09 17:24:02.000000000 +0100
@@ -0,0 +1 @@
+test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/test/integration/targets/var_blending/vars/bad_vault.yml
new/ansible_core-2.19.5/test/integration/targets/var_blending/vars/bad_vault.yml
---
old/ansible_core-2.19.4/test/integration/targets/var_blending/vars/bad_vault.yml
1970-01-01 01:00:00.000000000 +0100
+++
new/ansible_core-2.19.5/test/integration/targets/var_blending/vars/bad_vault.yml
2025-12-09 17:24:02.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.19.4/test/lib/ansible_test/_internal/ci/azp.py
new/ansible_core-2.19.5/test/lib/ansible_test/_internal/ci/azp.py
--- old/ansible_core-2.19.4/test/lib/ansible_test/_internal/ci/azp.py
2025-11-05 00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/test/lib/ansible_test/_internal/ci/azp.py
2025-12-09 17:24:02.000000000 +0100
@@ -2,6 +2,7 @@
from __future__ import annotations
+import json
import os
import tempfile
import uuid
@@ -27,6 +28,7 @@
from ..util import (
display,
+ ApplicationError,
MissingEnvironmentVariable,
)
@@ -220,6 +222,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
@@ -230,20 +245,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.19.4/test/lib/ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py
new/ansible_core-2.19.5/test/lib/ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py
---
old/ansible_core-2.19.4/test/lib/ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py
2025-11-05 00:27:03.000000000 +0100
+++
new/ansible_core-2.19.5/test/lib/ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py
2025-12-09 17:24:02.000000000 +0100
@@ -135,7 +135,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.19.4/test/units/ansible_test/_internal/ci/test_azp.py
new/ansible_core-2.19.5/test/units/ansible_test/_internal/ci/test_azp.py
--- old/ansible_core-2.19.4/test/units/ansible_test/_internal/ci/test_azp.py
1970-01-01 01:00:00.000000000 +0100
+++ new/ansible_core-2.19.5/test/units/ansible_test/_internal/ci/test_azp.py
2025-12-09 17:24:02.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.19.4/test/units/module_utils/basic/test_human_to_bytes.py
new/ansible_core-2.19.5/test/units/module_utils/basic/test_human_to_bytes.py
---
old/ansible_core-2.19.4/test/units/module_utils/basic/test_human_to_bytes.py
1970-01-01 01:00:00.000000000 +0100
+++
new/ansible_core-2.19.5/test/units/module_utils/basic/test_human_to_bytes.py
2025-12-09 17:24:02.000000000 +0100
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2025 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or
https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import annotations
+
+import pytest
+
+from ansible.module_utils.basic import AnsibleModule
+
+
[email protected]('value, isbits, expected', [
+ ("4KB", False, 4096),
+ ("4KB", None, 4096),
+ ("4Kb", True, 4096),
+])
+def test_validator_function(value: str, isbits: bool | None, expected: int) ->
None:
+ assert AnsibleModule.human_to_bytes(value, isbits=isbits) == expected
+
+
[email protected]('value, expected', [
+ ("4KB", 4096),
+])
+def test_validator_function_default_isbits(value: str, expected: int) -> None:
+ assert AnsibleModule.human_to_bytes(value) == expected
+
+
[email protected]('value, isbits', [
+ ("4Kb", False),
+ ("4KB", True),
+])
+def test_validator_functions(value: str, isbits: bool) -> None:
+ with pytest.raises(ValueError):
+ AnsibleModule.human_to_bytes(value, isbits=isbits)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.4/test/units/modules/test_get_url.py
new/ansible_core-2.19.5/test/units/modules/test_get_url.py
--- old/ansible_core-2.19.4/test/units/modules/test_get_url.py 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/test/units/modules/test_get_url.py 2025-12-09
17:24:02.000000000 +0100
@@ -8,22 +8,59 @@
from ansible.modules.get_url import parse_digest_lines
+FILENAME = "sample.txt"
+
@pytest.mark.parametrize(
("lines", "expected"),
[
pytest.param(
[
+
"2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25 sample.txt",
+ ],
+
[("2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25",
FILENAME)],
+ id="single-line-digest-single-space",
+ ),
+ pytest.param(
+ [
+
"2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25
sample.txt",
+ ],
+
[("2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25",
FILENAME)],
+ id="single-line-digest-multiple-spaces",
+ ),
+ pytest.param(
+ [
+
"2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25
.sample.txt",
+ ],
+
[("2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25",
FILENAME)],
+ id="single-line-digest-multiple-spaces-with-dot",
+ ),
+ pytest.param(
+ [
+
"2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25
*sample.txt",
+ ],
+
[("2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25",
FILENAME)],
+ id="single-line-digest-multiple-spaces-with-asterisk",
+ ),
+ pytest.param(
+ [
+
"2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25
./sample.txt",
+ ],
+
[("2a32d433bf82355a3f78318a5affa21866c9a98b151785494b386e6b08f40b25",
FILENAME)],
+ id="single-line-digest-multiple-spaces-with-dot-and-slash",
+ ),
+ pytest.param(
+ [
"a97e6837f60cec6da4491bab387296bbcd72bdba",
],
- [("a97e6837f60cec6da4491bab387296bbcd72bdba", "sample.txt")],
+ [("a97e6837f60cec6da4491bab387296bbcd72bdba", FILENAME)],
id="single-line-digest",
),
pytest.param(
[
"a97e6837f60cec6da4491bab387296bbcd72bdba sample.txt",
],
- [("a97e6837f60cec6da4491bab387296bbcd72bdba", "sample.txt")],
+ [("a97e6837f60cec6da4491bab387296bbcd72bdba", FILENAME)],
id="GNU-style-digest",
),
pytest.param(
@@ -33,7 +70,7 @@
[
(
"b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006.",
- "sample.txt",
+ FILENAME,
)
],
id="BSD-style-digest",
@@ -41,5 +78,4 @@
],
)
def test_parse_digest_lines(lines, expected):
- filename = "sample.txt"
- assert parse_digest_lines(filename, lines) == expected
+ assert parse_digest_lines(filename=FILENAME, lines=lines) == expected
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.4/test/units/playbook/test_task.py
new/ansible_core-2.19.5/test/units/playbook/test_task.py
--- old/ansible_core-2.19.4/test/units/playbook/test_task.py 2025-11-05
00:27:03.000000000 +0100
+++ new/ansible_core-2.19.5/test/units/playbook/test_task.py 2025-12-09
17:24:02.000000000 +0100
@@ -59,16 +59,16 @@
self.assertEqual(t.get_validated_value('delay',
t.fattributes.get('delay'), delay, None), expected)
bad_params = [
- ('E', AnsibleError),
- ('1.E', AnsibleError),
- ('E.1', AnsibleError),
+ '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(task_base)
t = Task().load_data(p)
- with self.assertRaises(expected):
+ with self.assertRaises(AnsibleError):
dummy = t.get_validated_value('delay',
t.fattributes.get('delay'), delay, None)
def test_task_auto_name_with_role(self):
++++++ ansible_core-2.19.4.tar.gz.sha256 -> ansible_core-2.19.5.tar.gz.sha256
++++++
---
/work/SRC/openSUSE:Factory/ansible-core-2.19/ansible_core-2.19.4.tar.gz.sha256
2025-11-21 16:55:53.496371122 +0100
+++
/work/SRC/openSUSE:Factory/.ansible-core-2.19.new.1939/ansible_core-2.19.5.tar.gz.sha256
2025-12-11 18:44:32.925558741 +0100
@@ -1 +1 @@
-888db6593f2fd42cd05bdbe546704d9c969dce99e3373a54498f6dbefcfa1917
ansible_core-2.19.4.tar.gz
+d03660ff32ba8a5ae40a82148cb24b38a35d26c0155621ddd9148b7562fd8be2
ansible_core-2.19.5.tar.gz