Skip to content

Commit

Permalink
[stable-2.9] find - set proper default based on use_regex (#73961) (#…
Browse files Browse the repository at this point in the history
…73966)

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>.
(cherry picked from commit 089d0a0)

Co-authored-by: Brian Coca <bcoca@users.noreply.github.com>

* Update fix_find_default.yml

Co-authored-by: Rick Elrod <rick@elrod.me>
  • Loading branch information
samdoran and relrod committed Apr 5, 2021
1 parent f8caa43 commit 0d668b6
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 4 deletions.
2 changes: 2 additions & 0 deletions changelogs/fragments/fix_find_default.yml
@@ -0,0 +1,2 @@
bugfixes:
- find - fix default pattern when use_regex is true (https://github.com/ansible/ansible/issues/50067).
19 changes: 15 additions & 4 deletions lib/ansible/modules/files/find.py
Expand Up @@ -32,7 +32,7 @@
first letter of any of those words (e.g., "1w").
type: str
patterns:
default: '*'
default: []
description:
- 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
Expand All @@ -44,6 +44,7 @@
- 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
in undesirable ways.
- Defaults to '*' when C(use_regex=False), or '.*' when C(use_regex=True).
type: list
aliases: [ pattern ]
excludes:
Expand Down Expand Up @@ -359,9 +360,9 @@ def statinfo(st):
def main():
module = AnsibleModule(
argument_spec=dict(
paths=dict(type='list', required=True, aliases=['name', 'path']),
patterns=dict(type='list', default=['*'], aliases=['pattern']),
excludes=dict(type='list', aliases=['exclude']),
paths=dict(type='list', required=True, aliases=['name', 'path'], elements='str'),
patterns=dict(type='list', default=[], aliases=['pattern'], elements='str'),
excludes=dict(type='list', aliases=['exclude'], elements='str'),
contains=dict(type='str'),
file_type=dict(type='str', default="file", choices=['any', 'directory', 'file', 'link']),
age=dict(type='str'),
Expand All @@ -379,6 +380,16 @@ def main():

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 = []

if params['age'] is None:
Expand Down
22 changes: 22 additions & 0 deletions test/integration/targets/find/tasks/main.yml
Expand Up @@ -95,3 +95,25 @@
- 'find_test2.matched == 1'
- 'find_test2.files[0].pw_name is defined'
- 'find_test2.files[0].gr_name is defined'

- 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'

0 comments on commit 0d668b6

Please sign in to comment.