New tests for copy recursive with absolute paths
Absolute path trailing slash handling in absolute directories find_needle() isn't passing a trailing slash through verbatim. Since copy uses that to determine if it should copy a directory or just the files inside of it, we have to detect that and restore it after calling find_needle() Fixes #27439pull/4420/head
parent
7cfd02097c
commit
0a2cdb2585
|
@ -442,8 +442,14 @@ class ActionModule(ActionBase):
|
||||||
elif remote_src:
|
elif remote_src:
|
||||||
result.update(self._execute_module(task_vars=task_vars))
|
result.update(self._execute_module(task_vars=task_vars))
|
||||||
return result
|
return result
|
||||||
else: # find in expected paths
|
else:
|
||||||
|
# find_needle returns a path that may not have a trailing slash on
|
||||||
|
# a directory so we need to determine that now (we use it just
|
||||||
|
# like rsync does to figure out whether to include the directory
|
||||||
|
# or only the files inside the directory
|
||||||
|
trailing_slash = source.endswith(os.path.sep)
|
||||||
try:
|
try:
|
||||||
|
# find in expected paths
|
||||||
source = self._find_needle('files', source)
|
source = self._find_needle('files', source)
|
||||||
except AnsibleError as e:
|
except AnsibleError as e:
|
||||||
result['failed'] = True
|
result['failed'] = True
|
||||||
|
@ -451,6 +457,12 @@ class ActionModule(ActionBase):
|
||||||
result['exception'] = traceback.format_exc()
|
result['exception'] = traceback.format_exc()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
if trailing_slash != source.endswith(os.path.sep):
|
||||||
|
if source[-1] == os.path.sep:
|
||||||
|
source = source[:-1]
|
||||||
|
else:
|
||||||
|
source = source + os.path.sep
|
||||||
|
|
||||||
# A list of source file tuples (full_path, relative_path) which will try to copy to the destination
|
# A list of source file tuples (full_path, relative_path) which will try to copy to the destination
|
||||||
source_files = {'files': [], 'directories': [], 'symlinks': []}
|
source_files = {'files': [], 'directories': [], 'symlinks': []}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
# GNU General Public License v3 or later (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt )
|
# GNU General Public License v3 or later (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt )
|
||||||
#
|
#
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
output_dir_expanded: '{{ output_dir | expanduser }}'
|
||||||
|
|
||||||
- name: record the output directory
|
- name: record the output directory
|
||||||
set_fact: output_file={{output_dir}}/foo.txt
|
set_fact: output_file={{output_dir}}/foo.txt
|
||||||
|
|
||||||
|
@ -650,6 +653,83 @@
|
||||||
that:
|
that:
|
||||||
- 'not copy_result.changed'
|
- 'not copy_result.changed'
|
||||||
|
|
||||||
|
#
|
||||||
|
# Recursive copy with absolute paths (#27439)
|
||||||
|
#
|
||||||
|
- name: Test that output_dir is appropriate for this test (absolute path)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- '{{ output_dir_expanded[0] == "/" }}'
|
||||||
|
|
||||||
|
- name: create a directory to copy
|
||||||
|
file:
|
||||||
|
path: '{{ output_dir_expanded }}/source_recursive'
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: create a file inside of the directory
|
||||||
|
copy:
|
||||||
|
content: "testing"
|
||||||
|
dest: '{{ output_dir_expanded }}/source_recursive/file'
|
||||||
|
|
||||||
|
- name: Create a directory to place the test output in
|
||||||
|
file:
|
||||||
|
path: '{{ output_dir_expanded }}/destination'
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: Copy the directory and files within (no trailing slash)
|
||||||
|
copy:
|
||||||
|
src: '{{ output_dir_expanded }}/source_recursive'
|
||||||
|
dest: '{{ output_dir_expanded }}/destination'
|
||||||
|
|
||||||
|
- name: stat the recursively copied directory
|
||||||
|
stat: path={{output_dir}}/destination/{{item}}
|
||||||
|
register: copied_stat
|
||||||
|
with_items:
|
||||||
|
- "source_recursive"
|
||||||
|
- "source_recursive/file"
|
||||||
|
- "file"
|
||||||
|
|
||||||
|
#- debug: var=copied_stat
|
||||||
|
- name: assert with no trailing slash, directory and file is copied
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "copied_stat.results[0].stat.exists"
|
||||||
|
- "copied_stat.results[1].stat.exists"
|
||||||
|
- "not copied_stat.results[2].stat.exists"
|
||||||
|
|
||||||
|
- name: Cleanup
|
||||||
|
file:
|
||||||
|
path: '{{ output_dir_expanded }}/destination'
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
# Try again with no trailing slash
|
||||||
|
|
||||||
|
- name: Create a directory to place the test output in
|
||||||
|
file:
|
||||||
|
path: '{{ output_dir_expanded }}/destination'
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: Copy just the files inside of the directory
|
||||||
|
copy:
|
||||||
|
src: '{{ output_dir_expanded }}/source_recursive/'
|
||||||
|
dest: '{{ output_dir_expanded }}/destination'
|
||||||
|
|
||||||
|
- name: stat the recursively copied directory
|
||||||
|
stat: path={{output_dir_expanded}}/destination/{{item}}
|
||||||
|
register: copied_stat
|
||||||
|
with_items:
|
||||||
|
- "source_recursive"
|
||||||
|
- "source_recursive/file"
|
||||||
|
- "file"
|
||||||
|
|
||||||
|
#- debug: var=copied_stat
|
||||||
|
- name: assert with trailing slash, only the file is copied
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "not copied_stat.results[0].stat.exists"
|
||||||
|
- "not copied_stat.results[1].stat.exists"
|
||||||
|
- "copied_stat.results[2].stat.exists"
|
||||||
|
|
||||||
#
|
#
|
||||||
# issue 8394
|
# issue 8394
|
||||||
#
|
#
|
||||||
|
@ -671,7 +751,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- "copy_result6.changed"
|
- "copy_result6.changed"
|
||||||
- "copy_result6.dest == '{{output_dir|expanduser}}/multiline.txt'"
|
- "copy_result6.dest == '{{output_dir_expanded}}/multiline.txt'"
|
||||||
- "copy_result6.checksum == '9cd0697c6a9ff6689f0afb9136fa62e0b3fee903'"
|
- "copy_result6.checksum == '9cd0697c6a9ff6689f0afb9136fa62e0b3fee903'"
|
||||||
|
|
||||||
# test overwriting a file as an unprivileged user (pull request #8624)
|
# test overwriting a file as an unprivileged user (pull request #8624)
|
||||||
|
|
Loading…
Reference in New Issue