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 #27439
pull/27449/merge
Toshio Kuratomi 7 years ago
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…
Cancel
Save