find - set proper default based on use_regex (#73961)
When using "use_regex: yes" and setting an excludes: without specifying a pattern: the existing code passes the file-glob '*' to the regex matcher. This results in an internal invalid-regex exception being thrown. This maintains the old semantics of a default match-all for pattern: but switches the default to '.*' when use_regex is specified. The code made sense as-is before excludes: was added (2.5). In that case, it made no sense to set use_regex but *not* set a pattern. However, with excludes: it now makes sense to only want to exclude a given regex but not specify a specific matching pattern. Closes: #50067 * moved change to new location added changelog * Update lib/ansible/modules/find.py Co-authored-by: Ian Wienand <iwienand@redhat.com>
This commit is contained in:
parent
48c0fbd1cb
commit
089d0a0508
3 changed files with 36 additions and 2 deletions
2
changelogs/fragments/fix_find_default.yml
Normal file
2
changelogs/fragments/fix_find_default.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- find module, fix default pattern when use_regex is true.
|
|
@ -29,7 +29,7 @@ options:
|
||||||
first letter of any of those words (e.g., "1w").
|
first letter of any of those words (e.g., "1w").
|
||||||
type: str
|
type: str
|
||||||
patterns:
|
patterns:
|
||||||
default: '*'
|
default: []
|
||||||
description:
|
description:
|
||||||
- One or more (shell or regex) patterns, which type is controlled by C(use_regex) option.
|
- One or more (shell or regex) patterns, which type is controlled by C(use_regex) option.
|
||||||
- The patterns restrict the list of files to be returned to those whose basenames match at
|
- The patterns restrict the list of files to be returned to those whose basenames match at
|
||||||
|
@ -41,6 +41,7 @@ options:
|
||||||
- This parameter expects a list, which can be either comma separated or YAML. If any of the
|
- This parameter expects a list, which can be either comma separated or YAML. If any of the
|
||||||
patterns contain a comma, make sure to put them in a list to avoid splitting the patterns
|
patterns contain a comma, make sure to put them in a list to avoid splitting the patterns
|
||||||
in undesirable ways.
|
in undesirable ways.
|
||||||
|
- Defaults to '*' when C(use_regex=False), or '.*' when C(use_regex=True).
|
||||||
type: list
|
type: list
|
||||||
aliases: [ pattern ]
|
aliases: [ pattern ]
|
||||||
elements: str
|
elements: str
|
||||||
|
@ -375,7 +376,7 @@ def main():
|
||||||
module = AnsibleModule(
|
module = AnsibleModule(
|
||||||
argument_spec=dict(
|
argument_spec=dict(
|
||||||
paths=dict(type='list', required=True, aliases=['name', 'path'], elements='str'),
|
paths=dict(type='list', required=True, aliases=['name', 'path'], elements='str'),
|
||||||
patterns=dict(type='list', default=['*'], aliases=['pattern'], elements='str'),
|
patterns=dict(type='list', default=[], aliases=['pattern'], elements='str'),
|
||||||
excludes=dict(type='list', aliases=['exclude'], elements='str'),
|
excludes=dict(type='list', aliases=['exclude'], elements='str'),
|
||||||
contains=dict(type='str'),
|
contains=dict(type='str'),
|
||||||
read_whole_file=dict(type='bool', default=False),
|
read_whole_file=dict(type='bool', default=False),
|
||||||
|
@ -395,6 +396,16 @@ def main():
|
||||||
|
|
||||||
params = module.params
|
params = module.params
|
||||||
|
|
||||||
|
# Set the default match pattern to either a match-all glob or
|
||||||
|
# regex depending on use_regex being set. This makes sure if you
|
||||||
|
# set excludes: without a pattern pfilter gets something it can
|
||||||
|
# handle.
|
||||||
|
if not params['patterns']:
|
||||||
|
if params['use_regex']:
|
||||||
|
params['patterns'] = ['.*']
|
||||||
|
else:
|
||||||
|
params['patterns'] = ['*']
|
||||||
|
|
||||||
filelist = []
|
filelist = []
|
||||||
|
|
||||||
if params['age'] is None:
|
if params['age'] is None:
|
||||||
|
|
|
@ -251,3 +251,24 @@
|
||||||
# dir contents are considered until the depth exceeds the requested depth
|
# dir contents are considered until the depth exceeds the requested depth
|
||||||
# there are 8 files/directories in the requested depth and 4 that exceed it by 1
|
# there are 8 files/directories in the requested depth and 4 that exceed it by 1
|
||||||
- files_with_depth.examined == 12
|
- files_with_depth.examined == 12
|
||||||
|
- name: exclude with regex
|
||||||
|
find:
|
||||||
|
paths: "{{ output_dir_test }}"
|
||||||
|
recurse: yes
|
||||||
|
use_regex: true
|
||||||
|
exclude: .*\.ogg
|
||||||
|
register: find_test3
|
||||||
|
# Note that currently sane ways of doing this with map() or
|
||||||
|
# selectattr() aren't available in centos6 era jinja2 ...
|
||||||
|
- set_fact:
|
||||||
|
find_test3_list: >-
|
||||||
|
[ {% for f in find_test3.files %}
|
||||||
|
{{ f.path }}
|
||||||
|
{% if not loop.last %},{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
]
|
||||||
|
- debug: var=find_test3_list
|
||||||
|
- name: assert we skipped the ogg file
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- '"{{ output_dir_test }}/e/f/g/h/8.ogg" not in find_test3_list'
|
||||||
|
|
Loading…
Reference in a new issue