From 6673a14a9ea4e0057f376db513d83e3f891c78ed Mon Sep 17 00:00:00 2001 From: sivel / Matt Martz Date: Mon, 6 Oct 2025 09:22:47 -0500 Subject: [PATCH] Update DataLoader.get_basedir to be an abspath (#85940) --- changelogs/fragments/data-loader-basedir-abspath.yml | 2 ++ lib/ansible/parsing/dataloader.py | 4 ++-- lib/ansible/vars/manager.py | 3 +-- test/units/parsing/test_dataloader.py | 9 +++++---- 4 files changed, 10 insertions(+), 8 deletions(-) create mode 100644 changelogs/fragments/data-loader-basedir-abspath.yml diff --git a/changelogs/fragments/data-loader-basedir-abspath.yml b/changelogs/fragments/data-loader-basedir-abspath.yml new file mode 100644 index 00000000000..38097c6ffdb --- /dev/null +++ b/changelogs/fragments/data-loader-basedir-abspath.yml @@ -0,0 +1,2 @@ +minor_changes: +- DataLoader - Update ``DataLoader.get_basedir`` to be an abspath diff --git a/lib/ansible/parsing/dataloader.py b/lib/ansible/parsing/dataloader.py index 2e365157b84..26ff5a77e94 100644 --- a/lib/ansible/parsing/dataloader.py +++ b/lib/ansible/parsing/dataloader.py @@ -54,7 +54,7 @@ class DataLoader: def __init__(self) -> None: - self._basedir: str = '.' + self._basedir: str = os.path.abspath('.') # NOTE: not effective with forks as the main copy does not get updated. # avoids rereading files @@ -227,7 +227,7 @@ class DataLoader: def set_basedir(self, basedir: str) -> None: """ sets the base directory, used to find files when a relative path is given """ - self._basedir = basedir + self._basedir = os.path.abspath(basedir) def path_dwim(self, given: str) -> str: """ diff --git a/lib/ansible/vars/manager.py b/lib/ansible/vars/manager.py index 205a079e2c0..fb4970cd749 100644 --- a/lib/ansible/vars/manager.py +++ b/lib/ansible/vars/manager.py @@ -17,7 +17,6 @@ from __future__ import annotations -import os import sys import typing as t @@ -447,7 +446,7 @@ class VariableManager: """ variables = {} - variables['playbook_dir'] = os.path.abspath(self._loader.get_basedir()) + variables['playbook_dir'] = self._loader.get_basedir() variables['ansible_playbook_python'] = sys.executable variables['ansible_config_file'] = C.CONFIG_FILE diff --git a/test/units/parsing/test_dataloader.py b/test/units/parsing/test_dataloader.py index 6e1f3c8ac19..b8692323269 100644 --- a/test/units/parsing/test_dataloader.py +++ b/test/units/parsing/test_dataloader.py @@ -17,6 +17,7 @@ from __future__ import annotations +import collections import os import pathlib import tempfile @@ -109,9 +110,9 @@ class TestDataLoader(unittest.TestCase): self.assertIn('/tmp/roles/testrole/tasks/included2.yml', called_args) self.assertIn('/tmp/roles/testrole/tasks/tasks/included2.yml', called_args) - # relative directories below are taken in account too: - self.assertIn('tasks/included2.yml', called_args) - self.assertIn('included2.yml', called_args) + c = collections.Counter(called_args) + assert c['/tmp/roles/testrole/tasks/included2.yml'] == 1 + assert c['/tmp/roles/testrole/tasks/tasks/included2.yml'] == 2 def test_path_dwim_root(self): self.assertEqual(self._loader.path_dwim('/'), '/') @@ -167,7 +168,7 @@ class TestPathDwimRelativeStackDataLoader(unittest.TestCase): self.assertRaisesRegex(AnsibleFileNotFound, 'on the Ansible Controller', self._loader.path_dwim_relative_stack, None, None, None) def test_empty_strings(self): - self.assertEqual(self._loader.path_dwim_relative_stack('', '', ''), './') + self.assertEqual(self._loader.path_dwim_relative_stack('', '', ''), os.path.abspath('./') + '/') def test_empty_lists(self): self.assertEqual(self._loader.path_dwim_relative_stack([], '', '~/'), os.path.expanduser('~'))