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:
Brian Coca 2020-04-17 09:51:05 -04:00 committed by GitHub
parent acdc9eb76d
commit d3cab602a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 56 additions and 2 deletions

View 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.

View file

@ -58,8 +58,22 @@ class LookupModule(LookupBase):
ret = []
for term in terms:
term_file = os.path.basename(term)
dwimmed_path = self.find_file_in_search_path(variables, 'files', os.path.dirname(term))
if dwimmed_path:
found_paths = []
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'))
ret.extend(to_text(g, errors='surrogate_or_strict') for g in globbed if os.path.isfile(g))
if ret:
break
return ret

View file

@ -0,0 +1 @@
shippable/posix/group1

View file

@ -0,0 +1 @@
in files subdir adjacent to play

View file

@ -0,0 +1 @@
in play adjacent subdir of files/

View 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

View file

@ -0,0 +1 @@
ajectent to play

View file

@ -0,0 +1 @@
file in role

View file

@ -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]

View 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