From cdd6ab000b2c85d5dd0dc86c2ae8580e6978b819 Mon Sep 17 00:00:00 2001 From: Toshio Kuratomi Date: Wed, 10 May 2017 17:11:11 -0700 Subject: [PATCH] Fix template not showing a diff with a directory Template can take a directory as the destination. When that's the case, we need to diff between the source and the file inside of the directory. That happened when the directory was specified with a trailing slash but not when it was specified on its own. This change fixes that. Fixes #24413 (cherry picked from commit 548cacdf6a28a708142c4a2e4ed1ecba8102b60a) --- lib/ansible/plugins/action/template.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/ansible/plugins/action/template.py b/lib/ansible/plugins/action/template.py index 6e24d2bf3a2..ee23c9d6641 100644 --- a/lib/ansible/plugins/action/template.py +++ b/lib/ansible/plugins/action/template.py @@ -82,9 +82,14 @@ class ActionModule(ActionBase): directory_prepended = False if dest.endswith(os.sep): + # Optimization. trailing slash means we know it's a directory directory_prepended = True - base = os.path.basename(source) - dest = os.path.join(dest, base) + dest = self._connection._shell.join_path(dest, os.path.basename(source)) + else: + # Find out if it's a directory + dest_stat = self._execute_remote_stat(dest, task_vars, True, tmp=tmp) + if dest_stat['exists'] and dest_stat['isdir']: + dest = self._connection._shell.join_path(dest, os.path.basename(source)) # template the source data locally & get ready to transfer b_source = to_bytes(source)