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 2026-03-26 21:09:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ansible-core-2.19 (Old)
and /work/SRC/openSUSE:Factory/.ansible-core-2.19.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ansible-core-2.19"
Thu Mar 26 21:09:31 2026 rev:5 rq:1342702 version:2.19.8
Changes:
--------
--- /work/SRC/openSUSE:Factory/ansible-core-2.19/ansible-core-2.19.changes
2026-02-27 17:13:07.380107546 +0100
+++
/work/SRC/openSUSE:Factory/.ansible-core-2.19.new.8177/ansible-core-2.19.changes
2026-03-27 06:36:06.684852122 +0100
@@ -1,0 +2,18 @@
+Wed Mar 25 13:10:18 UTC 2026 - Johannes Kastl
<[email protected]>
+
+- update to 2.19.8:
+ * Minor Changes
+ - ansible-test - Add container/remote aliases for more loosely
+ specifying managed test environments.
+ - ansible-test - Add support for using the Ansible Core CI
+ service from GitHub Actions.
+ * Bugfixes
+ - ansible-connection - Prevent unpickling failures in module
+ contexts by ensuring that AnsibleTaggedObjects in pickled
+ responses are converted to plain types in JsonRpcServer.
+ - config lookup now uses preexisting constants for templating
+ when needed.
+ - yaml loading - Fix traceback when parsing YAML strings (not
+ files) when using the pure Python implementation of PyYAML.
+
+-------------------------------------------------------------------
Old:
----
ansible_core-2.19.7.tar.gz
ansible_core-2.19.7.tar.gz.sha256
New:
----
ansible_core-2.19.8.tar.gz
ansible_core-2.19.8.tar.gz.sha256
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ansible-core-2.19.spec ++++++
--- /var/tmp/diff_new_pack.d6WqfQ/_old 2026-03-27 06:36:07.284876852 +0100
+++ /var/tmp/diff_new_pack.d6WqfQ/_new 2026-03-27 06:36:07.288877018 +0100
@@ -43,7 +43,7 @@
%endif
Name: ansible-core-2.19
-Version: 2.19.7
+Version: 2.19.8
Release: 0
Summary: Radically simple IT automation
License: GPL-3.0-or-later
++++++ ansible_core-2.19.7.tar.gz -> ansible_core-2.19.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.7/PKG-INFO
new/ansible_core-2.19.8/PKG-INFO
--- old/ansible_core-2.19.7/PKG-INFO 2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/PKG-INFO 2026-03-23 18:38:39.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: ansible-core
-Version: 2.19.7
+Version: 2.19.8
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.7/ansible_core.egg-info/PKG-INFO
new/ansible_core-2.19.8/ansible_core.egg-info/PKG-INFO
--- old/ansible_core-2.19.7/ansible_core.egg-info/PKG-INFO 2026-02-24
00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/ansible_core.egg-info/PKG-INFO 2026-03-23
18:38:39.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: ansible-core
-Version: 2.19.7
+Version: 2.19.8
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.7/ansible_core.egg-info/SOURCES.txt
new/ansible_core-2.19.8/ansible_core.egg-info/SOURCES.txt
--- old/ansible_core-2.19.7/ansible_core.egg-info/SOURCES.txt 2026-02-24
00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/ansible_core.egg-info/SOURCES.txt 2026-03-23
18:38:39.000000000 +0100
@@ -3483,6 +3483,7 @@
test/integration/targets/python_module_rlimit_nofile/tasks/main.yml
test/integration/targets/pyyaml/aliases
test/integration/targets/pyyaml/runme.sh
+test/integration/targets/pyyaml/runme.yml
test/integration/targets/raw/aliases
test/integration/targets/raw/runme.sh
test/integration/targets/raw/runme.yml
@@ -4480,6 +4481,7 @@
test/lib/ansible_test/_internal/venv.py
test/lib/ansible_test/_internal/ci/__init__.py
test/lib/ansible_test/_internal/ci/azp.py
+test/lib/ansible_test/_internal/ci/gha.py
test/lib/ansible_test/_internal/ci/local.py
test/lib/ansible_test/_internal/classification/__init__.py
test/lib/ansible_test/_internal/classification/common.py
@@ -5389,6 +5391,7 @@
test/units/utils/test_helpers.py
test/units/utils/test_isidentifier.py
test/units/utils/test_json.py
+test/units/utils/test_jsonrpc.py
test/units/utils/test_listify.py
test/units/utils/test_plugin_docs.py
test/units/utils/test_serialization.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.7/changelogs/CHANGELOG-v2.19.rst
new/ansible_core-2.19.8/changelogs/CHANGELOG-v2.19.rst
--- old/ansible_core-2.19.7/changelogs/CHANGELOG-v2.19.rst 2026-02-24
00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/changelogs/CHANGELOG-v2.19.rst 2026-03-23
18:38:39.000000000 +0100
@@ -4,6 +4,28 @@
.. contents:: Topics
+v2.19.8
+=======
+
+Release Summary
+---------------
+
+| Release Date: 2026-03-23
+| `Porting Guide
<https://docs.ansible.com/ansible-core/2.19/porting_guides/porting_guide_core_2.19.html>`__
+
+Minor Changes
+-------------
+
+- ansible-test - Add container/remote aliases for more loosely specifying
managed test environments.
+- ansible-test - Add support for using the Ansible Core CI service from GitHub
Actions.
+
+Bugfixes
+--------
+
+- ansible-connection - Prevent unpickling failures in module contexts by
ensuring that AnsibleTaggedObjects in pickled responses are converted to plain
types in ``JsonRpcServer``.
+- config lookup now uses preexisting constants for templating when needed.
+- yaml loading - Fix traceback when parsing YAML strings (not files) when
using the pure Python implementation of PyYAML.
+
v2.19.7
=======
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.7/changelogs/changelog.yaml
new/ansible_core-2.19.8/changelogs/changelog.yaml
--- old/ansible_core-2.19.7/changelogs/changelog.yaml 2026-02-24
00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/changelogs/changelog.yaml 2026-03-23
18:38:39.000000000 +0100
@@ -1520,3 +1520,42 @@
- ansible-test-spare-tire.yml
- make-tmp-path-msg.yml
release_date: '2026-02-17'
+ 2.19.8:
+ changes:
+ release_summary: '| Release Date: 2026-03-23
+
+ | `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.8_summary.yaml
+ release_date: '2026-03-23'
+ 2.19.8rc1:
+ changes:
+ bugfixes:
+ - ansible-connection - Prevent unpickling failures in module contexts by
ensuring
+ that AnsibleTaggedObjects in pickled responses are converted to plain
types
+ in ``JsonRpcServer``.
+ - config lookup now uses preexisting constants for templating when
needed.
+ - yaml loading - Fix traceback when parsing YAML strings (not files)
when using
+ the pure Python implementation of PyYAML.
+ minor_changes:
+ - ansible-test - Add container/remote aliases for more loosely
specifying managed
+ test environments.
+ - ansible-test - Add support for using the Ansible Core CI service from
GitHub
+ Actions.
+ release_summary: '| Release Date: 2026-03-16
+
+ | `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.8rc1_summary.yaml
+ - 86601-untag-jsonrpc-responses.yml
+ - ansible-test-completion-aliases.yml
+ - ansible-test-github-actions.yml
+ - configlookupfix.yml
+ - pyyaml-name.yml
+ release_date: '2026-03-16'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/lib/ansible/_internal/_yaml/_loader.py
new/ansible_core-2.19.8/lib/ansible/_internal/_yaml/_loader.py
--- old/ansible_core-2.19.7/lib/ansible/_internal/_yaml/_loader.py
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/lib/ansible/_internal/_yaml/_loader.py
2026-03-23 18:38:39.000000000 +0100
@@ -13,22 +13,20 @@
if HAS_LIBYAML:
from yaml.cyaml import CParser
- class _YamlParser(CParser):
+ class _Parser(CParser):
def __init__(self, stream: str | bytes | _io.IOBase) -> None:
if isinstance(stream, (str, bytes)):
stream = AnsibleTagHelper.untag(stream) # PyYAML + libyaml
barfs on str/bytes subclasses
CParser.__init__(self, stream)
- self.name = getattr(stream, 'name', None) # provide feature
parity with the Python implementation (yaml.reader.Reader provides name)
-
else:
from yaml.composer import Composer
from yaml.reader import Reader
from yaml.scanner import Scanner
from yaml.parser import Parser
- class _YamlParser(Reader, Scanner, Parser, Composer): # type:
ignore[no-redef]
+ class _Parser(Reader, Scanner, Parser, Composer): # type: ignore[no-redef]
def __init__(self, stream: str | bytes | _io.IOBase) -> None:
Reader.__init__(self, stream)
Scanner.__init__(self)
@@ -36,6 +34,17 @@
Composer.__init__(self)
+class _YamlParser(_Parser):
+ def __init__(self, stream: str | bytes | _io.IOBase) -> None:
+ super().__init__(stream)
+
+ # The Python implementation of PyYAML (yaml.reader.Reader) provides
self.name.
+ # However, it will fall back to "<...>" in various cases.
+ # The C implementation of PyYAML does not provide self.name.
+ # To provide consistency, name retrieval is re-implemented here.
+ self.name = getattr(stream, 'name', None)
+
+
class AnsibleInstrumentedLoader(_YamlParser, AnsibleInstrumentedConstructor,
Resolver):
"""Ansible YAML loader which supports Ansible custom behavior such as
`Origin` tagging, but no Ansible-specific YAML tags."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.7/lib/ansible/config/base.yml
new/ansible_core-2.19.8/lib/ansible/config/base.yml
--- old/ansible_core-2.19.7/lib/ansible/config/base.yml 2026-02-24
00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/lib/ansible/config/base.yml 2026-03-23
18:38:39.000000000 +0100
@@ -2272,3 +2272,14 @@
ini:
- section: testing
key: valid2
+_Z_TEST_ENTRY_3:
+ version_added: '2.21'
+ name: testentry
+ description: for tests
+ type: path
+ default: '{{ANSIBLE_HOME}}'
+ env:
+ - name: ANSIBLE_TEST_ENTRY3
+ ini:
+ - section: testing
+ key: valid3
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/lib/ansible/module_utils/ansible_release.py
new/ansible_core-2.19.8/lib/ansible/module_utils/ansible_release.py
--- old/ansible_core-2.19.7/lib/ansible/module_utils/ansible_release.py
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/lib/ansible/module_utils/ansible_release.py
2026-03-23 18:38:39.000000000 +0100
@@ -17,6 +17,6 @@
from __future__ import annotations
-__version__ = '2.19.7'
+__version__ = '2.19.8'
__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.7/lib/ansible/plugins/lookup/config.py
new/ansible_core-2.19.8/lib/ansible/plugins/lookup/config.py
--- old/ansible_core-2.19.7/lib/ansible/plugins/lookup/config.py
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/lib/ansible/plugins/lookup/config.py
2026-03-23 18:38:39.000000000 +0100
@@ -80,6 +80,8 @@
type: raw
"""
+from collections import ChainMap
+
import ansible.plugins.loader as plugin_loader
from ansible import constants as C
@@ -104,6 +106,9 @@
ret = []
+ # primarily use task vars, but fallback to existing constants when
needed
+ var_context = ChainMap(variables, vars(C))
+
for term in terms:
if not isinstance(term, str):
raise AnsibleError(f'Invalid setting identifier, {term!r} is
not a {str}, its a {type(term)}.')
@@ -119,7 +124,7 @@
if p is None:
raise AnsibleError(f"Unable to load {ptype} plugin
{pname!r}.")
try:
- result, origin = C.config.get_config_value_and_origin(term,
plugin_type=ptype, plugin_name=pname, variables=variables)
+ result, origin = C.config.get_config_value_and_origin(term,
plugin_type=ptype, plugin_name=pname, variables=var_context)
except AnsibleUndefinedConfigEntry as e:
match missing:
case 'error':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.7/lib/ansible/release.py
new/ansible_core-2.19.8/lib/ansible/release.py
--- old/ansible_core-2.19.7/lib/ansible/release.py 2026-02-24
00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/lib/ansible/release.py 2026-03-23
18:38:39.000000000 +0100
@@ -17,6 +17,6 @@
from __future__ import annotations
-__version__ = '2.19.7'
+__version__ = '2.19.8'
__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.7/lib/ansible/utils/jsonrpc.py
new/ansible_core-2.19.8/lib/ansible/utils/jsonrpc.py
--- old/ansible_core-2.19.7/lib/ansible/utils/jsonrpc.py 2026-02-24
00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/lib/ansible/utils/jsonrpc.py 2026-03-23
18:38:39.000000000 +0100
@@ -11,6 +11,7 @@
from ansible.module_utils.connection import ConnectionError
from ansible.module_utils.six import binary_type, text_type
from ansible.utils.display import Display
+from ansible.utils.vars import transform_to_native_types
display = Display()
@@ -83,7 +84,8 @@
result = to_text(result)
if not isinstance(result, text_type):
response["result_type"] = "pickle"
- result = to_text(pickle.dumps(result), errors='surrogateescape')
+ # typically consumed in a module context; transform custom types
(e.g. tagged/vaulted values) to native to prevent unpickling failures
+ result = to_text(pickle.dumps(transform_to_native_types(result,
redact=False)))
response['result'] = result
return response
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.7/pyproject.toml
new/ansible_core-2.19.8/pyproject.toml
--- old/ansible_core-2.19.7/pyproject.toml 2026-02-24 00:02:39.000000000
+0100
+++ new/ansible_core-2.19.8/pyproject.toml 2026-03-23 18:38:39.000000000
+0100
@@ -1,5 +1,5 @@
[build-system]
-requires = ["setuptools >= 66.1.0, <= 82.0.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, <= 82.0.1", "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.19.7/test/integration/targets/lookup_config/tasks/main.yml
new/ansible_core-2.19.8/test/integration/targets/lookup_config/tasks/main.yml
---
old/ansible_core-2.19.7/test/integration/targets/lookup_config/tasks/main.yml
2026-02-24 00:02:39.000000000 +0100
+++
new/ansible_core-2.19.8/test/integration/targets/lookup_config/tasks/main.yml
2026-03-23 18:38:39.000000000 +0100
@@ -129,3 +129,8 @@
- config_origin1[1] == "default"
- config_origin2[0] == 'yolo'
- 'config_origin2[1] == "var: _z_test_entry"'
+
+- name: verify interdependent templating
+ assert:
+ that:
+ - lookup('config', 'ANSIBLE_HOME') == lookup('config', '_Z_TEST_ENTRY_3')
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/test/integration/targets/pyyaml/runme.sh
new/ansible_core-2.19.8/test/integration/targets/pyyaml/runme.sh
--- old/ansible_core-2.19.7/test/integration/targets/pyyaml/runme.sh
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/test/integration/targets/pyyaml/runme.sh
2026-03-23 18:38:39.000000000 +0100
@@ -4,8 +4,18 @@
source virtualenv.sh
set +x
+# Verify libyaml is in use.
+ansible --version | tee /dev/stderr | grep 'with libyaml'
+
+# Run tests with libyaml.
+ansible-playbook runme.yml "${@}"
+
# deps are already installed, using --no-deps to avoid re-installing them
# Install PyYAML without libyaml to validate ansible can run
PYYAML_FORCE_LIBYAML=0 pip install --no-binary PyYAML --ignore-installed
--no-cache-dir --no-deps PyYAML
+# Verify libyaml is not in use.
ansible --version | tee /dev/stderr | grep 'without libyaml'
+
+# Run tests without libyaml.
+ansible-playbook runme.yml "${@}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/test/integration/targets/pyyaml/runme.yml
new/ansible_core-2.19.8/test/integration/targets/pyyaml/runme.yml
--- old/ansible_core-2.19.7/test/integration/targets/pyyaml/runme.yml
1970-01-01 01:00:00.000000000 +0100
+++ new/ansible_core-2.19.8/test/integration/targets/pyyaml/runme.yml
2026-03-23 18:38:39.000000000 +0100
@@ -0,0 +1,9 @@
+- hosts: localhost
+ gather_facts: no
+ tasks:
+ - name: Read YAML from a string
+ assert:
+ that:
+ - "'1' | from_yaml == 1"
+ - "'[1]' | from_yaml == [1]"
+ - "'key: value' | from_yaml == {'key': 'value'}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/test/lib/ansible_test/_data/completion/docker.txt
new/ansible_core-2.19.8/test/lib/ansible_test/_data/completion/docker.txt
--- old/ansible_core-2.19.7/test/lib/ansible_test/_data/completion/docker.txt
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/test/lib/ansible_test/_data/completion/docker.txt
2026-03-23 18:38:39.000000000 +0100
@@ -1,7 +1,7 @@
base image=quay.io/ansible/base-test-container:8.2.0
python=3.13,3.8,3.9,3.10,3.11,3.12
default image=quay.io/ansible/default-test-container:11.6.0
python=3.13,3.8,3.9,3.10,3.11,3.12 context=collection
default image=quay.io/ansible/ansible-core-test-container:11.6.0
python=3.13,3.8,3.9,3.10,3.11,3.12 context=ansible-core
-alpine321 image=quay.io/ansible/alpine321-test-container:9.1.0 python=3.12
cgroup=none audit=none
-fedora41 image=quay.io/ansible/fedora41-test-container:9.0.0 python=3.13
cgroup=v2-only
+alpine321 image=quay.io/ansible/alpine321-test-container:9.1.0 python=3.12
cgroup=none audit=none alias=alpine
+fedora41 image=quay.io/ansible/fedora41-test-container:9.0.0 python=3.13
cgroup=v2-only alias=fedora
ubuntu2204 image=quay.io/ansible/ubuntu2204-test-container:9.0.0 python=3.10
-ubuntu2404 image=quay.io/ansible/ubuntu2404-test-container:9.0.0 python=3.12
+ubuntu2404 image=quay.io/ansible/ubuntu2404-test-container:9.0.0 python=3.12
alias=ubuntu
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/test/lib/ansible_test/_data/completion/remote.txt
new/ansible_core-2.19.8/test/lib/ansible_test/_data/completion/remote.txt
--- old/ansible_core-2.19.7/test/lib/ansible_test/_data/completion/remote.txt
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/test/lib/ansible_test/_data/completion/remote.txt
2026-03-23 18:38:39.000000000 +0100
@@ -1,15 +1,15 @@
-alpine/3.21 python=3.12 become=doas_sudo provider=aws arch=x86_64
+alpine/3.21 python=3.12 become=doas_sudo provider=aws arch=x86_64
alias=alpine/3,alpine/latest
alpine become=doas_sudo provider=aws arch=x86_64
-fedora/41 python=3.13 become=sudo provider=aws arch=x86_64
+fedora/41 python=3.13 become=sudo provider=aws arch=x86_64 alias=fedora/latest
fedora become=sudo provider=aws arch=x86_64
-freebsd/13.5 python=3.11 python_dir=/usr/local/bin become=su_sudo provider=aws
arch=x86_64
-freebsd/14.2 python=3.11 python_dir=/usr/local/bin become=su_sudo provider=aws
arch=x86_64
+freebsd/13.5 python=3.11 python_dir=/usr/local/bin become=su_sudo provider=aws
arch=x86_64 alias=freebsd/13
+freebsd/14.2 python=3.11 python_dir=/usr/local/bin become=su_sudo provider=aws
arch=x86_64 alias=freebsd/14,freebsd/latest
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/15.3 python=3.13 python_dir=/usr/local/bin become=sudo
provider=parallels arch=x86_64 alias=macos/15,macos/latest
macos python_dir=/usr/local/bin become=sudo provider=parallels 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/9.7 python=3.9,3.12 become=sudo provider=aws arch=x86_64 alias=rhel/9
+rhel/10.1 python=3.12 become=sudo provider=aws arch=x86_64
alias=rhel/10,rhel/latest
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
+ubuntu/24.04 python=3.12 become=sudo provider=aws arch=x86_64
alias=ubuntu/latest
ubuntu become=sudo provider=aws arch=x86_64
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/test/lib/ansible_test/_data/completion/windows.txt
new/ansible_core-2.19.8/test/lib/ansible_test/_data/completion/windows.txt
--- old/ansible_core-2.19.7/test/lib/ansible_test/_data/completion/windows.txt
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/test/lib/ansible_test/_data/completion/windows.txt
2026-03-23 18:38:39.000000000 +0100
@@ -1,5 +1,5 @@
windows/2016 provider=aws arch=x86_64 connection=winrm+http
windows/2019 provider=aws arch=x86_64 connection=winrm+https
windows/2022 provider=aws arch=x86_64 connection=winrm+https
-windows/2025 provider=aws arch=x86_64 connection=psrp+http
+windows/2025 provider=aws arch=x86_64 connection=psrp+http alias=windows/latest
windows provider=aws arch=x86_64 connection=winrm+https
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/test/lib/ansible_test/_internal/ci/gha.py
new/ansible_core-2.19.8/test/lib/ansible_test/_internal/ci/gha.py
--- old/ansible_core-2.19.7/test/lib/ansible_test/_internal/ci/gha.py
1970-01-01 01:00:00.000000000 +0100
+++ new/ansible_core-2.19.8/test/lib/ansible_test/_internal/ci/gha.py
2026-03-23 18:38:39.000000000 +0100
@@ -0,0 +1,106 @@
+"""Support code for working with GitHub Actions."""
+
+from __future__ import annotations
+
+import os
+import typing as t
+
+from ..config import (
+ CommonConfig,
+ TestConfig,
+)
+
+from ..util import (
+ ApplicationError,
+ MissingEnvironmentVariable,
+)
+
+from . import (
+ AuthContext,
+ CIProvider,
+ GeneratingAuthHelper,
+)
+
+CODE = 'gha'
+JOB_ID_ENV_VAR = 'ANSIBLE_TEST_GHA_JOB_ID'
+ARTIFACT_ID_ENV_VAR = 'ANSIBLE_TEST_GHA_SSH_KEY_ARTIFACT_ID'
+
+
+class GitHubActions(CIProvider):
+ """CI provider implementation for GitHub Actions."""
+
+ def __init__(self) -> None:
+ self.auth = GitHubActionsAuthHelper()
+
+ @staticmethod
+ def is_supported() -> bool:
+ """Return True if this provider is supported in the current running
environment."""
+ return JOB_ID_ENV_VAR in os.environ and ARTIFACT_ID_ENV_VAR in
os.environ
+
+ @property
+ def code(self) -> str:
+ """Return a unique code representing this provider."""
+ return CODE
+
+ @property
+ def name(self) -> str:
+ """Return descriptive name for this provider."""
+ return 'GitHub Actions'
+
+ def generate_resource_prefix(self) -> str:
+ """Return a resource prefix specific to this CI provider."""
+ keys = [
+ 'GITHUB_REPOSITORY',
+ JOB_ID_ENV_VAR,
+ ]
+
+ try:
+ segments = [os.environ[key] for key in keys]
+ except KeyError as ex:
+ raise MissingEnvironmentVariable(name=ex.args[0]) from None
+
+ prefix = '-'.join(['gha'] + segments)
+
+ return prefix
+
+ def get_base_commit(self, args: CommonConfig) -> str:
+ """Return the base commit or an empty string."""
+ return ''
+
+ def detect_changes(self, args: TestConfig) -> t.Optional[list[str]]:
+ """Initialize change detection."""
+ return None
+
+ def supports_core_ci_auth(self) -> bool:
+ """Return True if Ansible Core CI is supported."""
+ return True
+
+ def prepare_core_ci_request(self, config: dict[str, object], context:
AuthContext) -> dict[str, object]:
+ try:
+ owner, name = os.environ['GITHUB_REPOSITORY'].split('/', 1)
+
+ request: dict[str, object] = dict(
+ type="gha:ssh",
+ config=config,
+ repository_owner=owner,
+ repository_name=name,
+ job_id=int(os.environ[JOB_ID_ENV_VAR]),
+ artifact_id=int(os.environ[ARTIFACT_ID_ENV_VAR]),
+ )
+ except KeyError as ex:
+ raise MissingEnvironmentVariable(name=ex.args[0]) from None
+
+ self.auth.sign_request(request, context)
+
+ return request
+
+ def get_git_details(self, args: CommonConfig) -> t.Optional[dict[str,
t.Any]]:
+ """Return details about git in the current environment."""
+ return None
+
+
+class GitHubActionsAuthHelper(GeneratingAuthHelper):
+ """Authentication helper for GitHub Actions."""
+
+ def generate_key_pair(self) -> None:
+ raise ApplicationError(f'Missing SSH private key:
{self.private_key_file}')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/test/lib/ansible_test/_internal/cli/compat.py
new/ansible_core-2.19.8/test/lib/ansible_test/_internal/cli/compat.py
--- old/ansible_core-2.19.7/test/lib/ansible_test/_internal/cli/compat.py
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/test/lib/ansible_test/_internal/cli/compat.py
2026-03-23 18:38:39.000000000 +0100
@@ -20,7 +20,6 @@
display,
filter_args,
sorted_versions,
- str_to_version,
)
from ..docker_util import (
@@ -31,6 +30,7 @@
docker_completion,
remote_completion,
filter_completion,
+ windows_completion,
)
from ..host_configs import (
@@ -69,9 +69,7 @@
def get_fallback_remote_controller() -> str:
"""Return the remote fallback platform for the controller."""
- platform = 'freebsd' # lower cost than RHEL and macOS
- candidates = [item for item in
filter_completion(remote_completion()).values() if item.controller_supported
and item.platform == platform]
- fallback = sorted(candidates, key=lambda value:
str_to_version(value.version), reverse=True)[0]
+ fallback = [item for name, item in
filter_completion(remote_completion()).items() if item.controller_supported and
name == "freebsd/latest"][0]
return fallback.name
@@ -351,17 +349,17 @@
if docker_config.controller_supported:
if controller_python(options.python) or not options.python:
- controller = DockerConfig(name=options.docker,
python=native_python(options),
+ controller = DockerConfig(name=docker_config.name,
python=native_python(options),
privileged=options.docker_privileged, seccomp=options.docker_seccomp,
memory=options.docker_memory)
targets = controller_targets(mode, options, controller)
else:
controller_fallback = f'docker:{options.docker}',
f'--docker {options.docker} --python {options.python}', FallbackReason.PYTHON
- controller = DockerConfig(name=options.docker)
+ controller = DockerConfig(name=docker_config.name)
targets = controller_targets(mode, options, controller)
else:
controller_fallback = f'docker:{docker_fallback}', f'--docker
{options.docker}', FallbackReason.ENVIRONMENT
controller = DockerConfig(name=docker_fallback)
- targets = [DockerConfig(name=options.docker,
python=native_python(options),
+ targets = [DockerConfig(name=docker_config.name,
python=native_python(options),
privileged=options.docker_privileged,
seccomp=options.docker_seccomp, memory=options.docker_memory)]
else:
if not options.python:
@@ -386,23 +384,25 @@
if remote_config.controller_supported:
if controller_python(options.python) or not options.python:
- controller = PosixRemoteConfig(name=options.remote,
python=native_python(options), provider=options.remote_provider,
+ controller = PosixRemoteConfig(name=remote_config.name,
python=native_python(options), provider=options.remote_provider,
arch=options.remote_arch)
targets = controller_targets(mode, options, controller)
else:
controller_fallback = f'remote:{options.remote}',
f'--remote {options.remote} --python {options.python}', FallbackReason.PYTHON
- controller = PosixRemoteConfig(name=options.remote,
provider=options.remote_provider, arch=options.remote_arch)
+ controller = PosixRemoteConfig(name=remote_config.name,
provider=options.remote_provider, arch=options.remote_arch)
targets = controller_targets(mode, options, controller)
else:
context, reason = f'--remote {options.remote}',
FallbackReason.ENVIRONMENT
controller = None
- targets = [PosixRemoteConfig(name=options.remote,
python=native_python(options), provider=options.remote_provider,
arch=options.remote_arch)]
+ targets = [PosixRemoteConfig(name=remote_config.name,
python=native_python(options), provider=options.remote_provider,
+ arch=options.remote_arch)]
elif mode == TargetMode.SHELL and
options.remote.startswith('windows/'):
if options.python and options.python not in
CONTROLLER_PYTHON_VERSIONS:
raise ControllerNotSupportedError(f'--python {options.python}')
+ name =
resolve_windows_names([options.remote.removeprefix("windows/")])[0]
controller = OriginConfig(python=native_python(options))
- targets = [WindowsRemoteConfig(name=options.remote,
provider=options.remote_provider, arch=options.remote_arch)]
+ targets = [WindowsRemoteConfig(name=name,
provider=options.remote_provider, arch=options.remote_arch)]
else:
if not options.python:
raise PythonVersionUnspecifiedError(f'--remote
{options.remote}')
@@ -471,8 +471,8 @@
"""Return a list of non-POSIX targets if the target mode is non-POSIX."""
if mode == TargetMode.WINDOWS_INTEGRATION:
if options.windows:
- targets = [WindowsRemoteConfig(name=f'windows/{version}',
provider=options.remote_provider, arch=options.remote_arch)
- for version in options.windows]
+ names = resolve_windows_names(options.windows)
+ targets = [WindowsRemoteConfig(name=name,
provider=options.remote_provider, arch=options.remote_arch) for name in names]
else:
targets = [WindowsInventoryConfig(path=options.inventory)]
elif mode == TargetMode.NETWORK_INTEGRATION:
@@ -496,6 +496,16 @@
return targets
+def resolve_windows_names(versions: list[str]) -> list[str]:
+ """Resolve a list of Windows versions into version names, resolving any
aliases."""
+ windows_completions = filter_completion(windows_completion())
+
+ names = [f'windows/{version}' for version in versions] # map versions to
names
+ names = [windows_completions[name].name if name in windows_completions
else name for name in names] # resolve aliases
+
+ return names
+
+
def default_targets(
mode: TargetMode,
controller: ControllerHostConfig,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/test/lib/ansible_test/_internal/cli/environments.py
new/ansible_core-2.19.8/test/lib/ansible_test/_internal/cli/environments.py
--- old/ansible_core-2.19.7/test/lib/ansible_test/_internal/cli/environments.py
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/test/lib/ansible_test/_internal/cli/environments.py
2026-03-23 18:38:39.000000000 +0100
@@ -640,10 +640,10 @@
def get_windows_platform_choices() -> list[str]:
- """Return a list of supported Windows versions matching the given
prefix."""
- return sorted(f'windows/{windows.version}' for windows in
filter_completion(windows_completion()).values())
+ """Return a list of supported Windows version names."""
+ return sorted(filter_completion(windows_completion()))
def get_windows_version_choices() -> list[str]:
"""Return a list of supported Windows versions."""
- return sorted(windows.version for windows in
filter_completion(windows_completion()).values())
+ return sorted(name.removeprefix("windows/") for name in
get_windows_platform_choices())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.19.7/test/lib/ansible_test/_internal/completion.py
new/ansible_core-2.19.8/test/lib/ansible_test/_internal/completion.py
--- old/ansible_core-2.19.7/test/lib/ansible_test/_internal/completion.py
2026-02-24 00:02:39.000000000 +0100
+++ new/ansible_core-2.19.8/test/lib/ansible_test/_internal/completion.py
2026-03-23 18:38:39.000000000 +0100
@@ -6,6 +6,8 @@
import dataclasses
import enum
import os
+import re
+import sys
import typing as t
from .constants import (
@@ -17,6 +19,8 @@
ANSIBLE_TEST_DATA_ROOT,
cache,
read_lines_without_comments,
+ str_to_version,
+ InternalError,
)
from .data import (
@@ -61,6 +65,11 @@
def is_default(self) -> bool:
"""True if the completion entry is only used for defaults, otherwise
False."""
+ @property
+ def sort_key(self) -> tuple[str, tuple[int, ...]]:
+ """Key used for sorting completion entries."""
+ return '', (0,)
+
@dataclasses.dataclass(frozen=True)
class PosixCompletionConfig(CompletionConfig, metaclass=abc.ABCMeta):
@@ -114,6 +123,16 @@
arch: t.Optional[str] = None
@property
+ def sort_key(self) -> tuple[str, tuple[int, ...]]:
+ """Key used for sorting completion entries."""
+ try:
+ version = str_to_version(self.version)
+ except ValueError:
+ version = (sys.maxsize,)
+
+ return self.platform, version
+
+ @property
def platform(self) -> str:
"""The name of the platform."""
return self.name.partition('/')[0]
@@ -176,6 +195,19 @@
placeholder: bool = False
@property
+ def sort_key(self) -> tuple[str, tuple[int, ...]]:
+ """Key used for sorting completion entries."""
+ match = re.match('^(?P<platform>[a-z]+)(?P<version>[0-9]*)$',
self.name)
+ platform = match.group('platform')
+
+ try:
+ version = str_to_version(match.group('version'))
+ except ValueError:
+ version = (sys.maxsize,)
+
+ return platform, version
+
+ @property
def is_default(self) -> bool:
"""True if the completion entry is only used for defaults, otherwise
False."""
return False
@@ -263,12 +295,24 @@
context = 'ansible-core'
items = {name: data for name, data in [parse_completion_entry(line) for
line in lines] if data.get('context', context) == context}
+ aliases: dict[tuple[str, str], dict[str, str]] = {}
+ aliases_seen: set[str] = set()
- for item in items.values():
+ for item_name, item in items.items():
item.pop('context', None)
item.pop('placeholder', None)
+ if alias := item.pop('alias', None):
+ for aliased_name in alias.split(','):
+ if aliased_name in aliases_seen:
+ raise InternalError(f"Duplicate alias {aliased_name!r}
found for {name!r} completion.")
+
+ aliases_seen.add(aliased_name)
+ aliases[(aliased_name, item_name)] = item
+
completion = {name: completion_type(name=name, **data) for name, data in
items.items()}
+ completion |= {an[0]: completion_type(name=an[1], **data) for an, data in
aliases.items()}
+ completion = dict(sorted(completion.items(), key=lambda entry:
entry[1].sort_key))
return completion
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.19.7/test/units/utils/test_jsonrpc.py
new/ansible_core-2.19.8/test/units/utils/test_jsonrpc.py
--- old/ansible_core-2.19.7/test/units/utils/test_jsonrpc.py 1970-01-01
01:00:00.000000000 +0100
+++ new/ansible_core-2.19.8/test/units/utils/test_jsonrpc.py 2026-03-23
18:38:39.000000000 +0100
@@ -0,0 +1,31 @@
+from __future__ import annotations
+
+import json
+import pickle
+
+from ansible._internal._datatag._tags import Origin
+from ansible.utils.jsonrpc import JsonRpcServer
+
+
+def test_response_type_cleansing() -> None:
+ """Avoid unpickling errors in module contexts by ensuring that non-scalar
JsonRpc responses are not pickled with tags."""
+
+ class RPCTest:
+ def returns_list_with_tagged_str(self) -> list:
+ return [Origin(description="blar").tag("taggedstr")]
+
+ s = JsonRpcServer()
+ s.register(RPCTest())
+ req = dict(method="returns_list_with_tagged_str", id=1, params=(tuple(),
{}))
+ jsonrpc_res = s.handle_request(json.dumps(req))
+
+ deserialized_res = json.loads(jsonrpc_res)
+
+ pickled_res = deserialized_res.get("result")
+
+ assert pickled_res is not None
+
+ res = pickle.loads(pickled_res.encode(errors="surrogateescape"))
+
+ assert res == ["taggedstr"]
+ assert not Origin.is_tagged_on(res[0])
++++++ ansible_core-2.19.7.tar.gz.sha256 -> ansible_core-2.19.8.tar.gz.sha256
++++++
---
/work/SRC/openSUSE:Factory/ansible-core-2.19/ansible_core-2.19.7.tar.gz.sha256
2026-02-27 17:13:07.708121122 +0100
+++
/work/SRC/openSUSE:Factory/.ansible-core-2.19.new.8177/ansible_core-2.19.8.tar.gz.sha256
2026-03-27 06:36:06.788856408 +0100
@@ -1 +1 @@
-7d6f53dc33fc3defbe437b88bfaf87b3f7abbc56c4f1691e59342166c70bbebd
ansible_core-2.19.7.tar.gz
+676e70925b775d2c8526b2bcea59c4b2195221bd6e4e3c0537e89387e08608bd
ansible_core-2.19.8.tar.gz