Fix fileglob when using 'file*' vs 'stuff/file*' (#68945)
* Fix fileglob when using 'file*' vs 'stuff/file*' when not having dir in glob, files/ subdir was being ignored. * tests for fileglob
This commit is contained in:
parent
acdc9eb76d
commit
d3cab602a5
11 changed files with 56 additions and 2 deletions
2
changelogs/fragments/fileglob_fixes.yml
Normal file
2
changelogs/fragments/fileglob_fixes.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- deal with cases in which just a file is pased and not a path with directories, now fileglob correctly searches in 'files/' subdirs.
|
|
@ -58,8 +58,22 @@ class LookupModule(LookupBase):
|
||||||
ret = []
|
ret = []
|
||||||
for term in terms:
|
for term in terms:
|
||||||
term_file = os.path.basename(term)
|
term_file = os.path.basename(term)
|
||||||
dwimmed_path = self.find_file_in_search_path(variables, 'files', os.path.dirname(term))
|
found_paths = []
|
||||||
if dwimmed_path:
|
if term_file != term:
|
||||||
|
found_paths.append(self.find_file_in_search_path(variables, 'files', os.path.dirname(term)))
|
||||||
|
else:
|
||||||
|
# no dir, just file, so use paths and 'files' paths instead
|
||||||
|
if 'ansible_search_path' in variables:
|
||||||
|
paths = variables['ansible_search_path']
|
||||||
|
else:
|
||||||
|
paths = [self.get_basedir(variables)]
|
||||||
|
for p in paths:
|
||||||
|
found_paths.append(os.path.join(p, 'files'))
|
||||||
|
found_paths.append(p)
|
||||||
|
|
||||||
|
for dwimmed_path in found_paths:
|
||||||
globbed = glob.glob(to_bytes(os.path.join(dwimmed_path, term_file), errors='surrogate_or_strict'))
|
globbed = glob.glob(to_bytes(os.path.join(dwimmed_path, term_file), errors='surrogate_or_strict'))
|
||||||
ret.extend(to_text(g, errors='surrogate_or_strict') for g in globbed if os.path.isfile(g))
|
ret.extend(to_text(g, errors='surrogate_or_strict') for g in globbed if os.path.isfile(g))
|
||||||
|
if ret:
|
||||||
|
break
|
||||||
return ret
|
return ret
|
||||||
|
|
1
test/integration/targets/fileglob/aliases
Normal file
1
test/integration/targets/fileglob/aliases
Normal file
|
@ -0,0 +1 @@
|
||||||
|
shippable/posix/group1
|
|
@ -0,0 +1 @@
|
||||||
|
in files subdir adjacent to play
|
|
@ -0,0 +1 @@
|
||||||
|
in play adjacent subdir of files/
|
13
test/integration/targets/fileglob/find_levels/play.yml
Normal file
13
test/integration/targets/fileglob/find_levels/play.yml
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
- hosts: localhost
|
||||||
|
gather_facts: false
|
||||||
|
vars:
|
||||||
|
expected:
|
||||||
|
play_adj: ajectent to play
|
||||||
|
play_adj_subdir: in files subdir adjacent to play
|
||||||
|
somepath/play_adj_subsubdir: in play adjacent subdir of files/
|
||||||
|
in_role: file in role
|
||||||
|
otherpath/in_role_subdir: file in role subdir
|
||||||
|
tasks:
|
||||||
|
- name: Import role lookup
|
||||||
|
import_role:
|
||||||
|
name: get_file
|
|
@ -0,0 +1 @@
|
||||||
|
ajectent to play
|
|
@ -0,0 +1 @@
|
||||||
|
file in role
|
|
@ -0,0 +1 @@
|
||||||
|
file in role subdir
|
|
@ -0,0 +1,10 @@
|
||||||
|
- name: show file contents
|
||||||
|
debug:
|
||||||
|
msg: '{{ q("fileglob", seed + ".*") }}'
|
||||||
|
register: found
|
||||||
|
|
||||||
|
- name: did we get right one?
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- found['msg'][0].endswith(seed + '.txt')
|
||||||
|
- q('file', found['msg'][0])[0] == expected[seed]
|
9
test/integration/targets/fileglob/runme.sh
Executable file
9
test/integration/targets/fileglob/runme.sh
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eux
|
||||||
|
|
||||||
|
# fun multilevel finds
|
||||||
|
for seed in play_adj play_adj_subdir somepath/play_adj_subsubdir in_role otherpath/in_role_subdir
|
||||||
|
do
|
||||||
|
ansible-playbook find_levels/play.yml -e "seed='${seed}'" "$@"
|
||||||
|
done
|
Loading…
Reference in a new issue