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

Reply via email to