summaryrefslogtreecommitdiff
path: root/docker/utils
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2018-02-12 14:59:41 -0800
committerJoffrey F <joffrey@docker.com>2018-02-12 14:59:41 -0800
commit34d50483e20e86cb7ab22700e036a5c4d319268a (patch)
treeac4783a0fa25d3fdaa415baacf2e0255b44f0b0d /docker/utils
parent7c19772eb681b514b12e2e5764537605632608b1 (diff)
downloaddocker-py-34d50483e20e86cb7ab22700e036a5c4d319268a.tar.gz
Correctly support absolute paths in .dockerignorec5672-dockerignore-abspath
Signed-off-by: Joffrey F <joffrey@docker.com>
Diffstat (limited to 'docker/utils')
-rw-r--r--docker/utils/build.py20
1 files changed, 13 insertions, 7 deletions
diff --git a/docker/utils/build.py b/docker/utils/build.py
index d4223e7..a218873 100644
--- a/docker/utils/build.py
+++ b/docker/utils/build.py
@@ -46,7 +46,7 @@ def exclude_paths(root, patterns, dockerfile=None):
)
-def should_include(path, exclude_patterns, include_patterns):
+def should_include(path, exclude_patterns, include_patterns, root):
"""
Given a path, a list of exclude patterns, and a list of inclusion patterns:
@@ -61,11 +61,15 @@ def should_include(path, exclude_patterns, include_patterns):
for pattern in include_patterns:
if match_path(path, pattern):
return True
+ if os.path.isabs(pattern) and match_path(
+ os.path.join(root, path), pattern):
+ return True
return False
return True
-def should_check_directory(directory_path, exclude_patterns, include_patterns):
+def should_check_directory(directory_path, exclude_patterns, include_patterns,
+ root):
"""
Given a directory path, a list of exclude patterns, and a list of inclusion
patterns:
@@ -91,7 +95,7 @@ def should_check_directory(directory_path, exclude_patterns, include_patterns):
if (pattern + '/').startswith(path_with_slash)
]
directory_included = should_include(
- directory_path, exclude_patterns, include_patterns
+ directory_path, exclude_patterns, include_patterns, root
)
return directory_included or len(possible_child_patterns) > 0
@@ -110,26 +114,28 @@ def get_paths(root, exclude_patterns, include_patterns, has_exceptions=False):
# traversal. See https://docs.python.org/2/library/os.html#os.walk
dirs[:] = [
d for d in dirs if should_check_directory(
- os.path.join(parent, d), exclude_patterns, include_patterns
+ os.path.join(parent, d), exclude_patterns, include_patterns,
+ root
)
]
for path in dirs:
if should_include(os.path.join(parent, path),
- exclude_patterns, include_patterns):
+ exclude_patterns, include_patterns, root):
paths.append(os.path.join(parent, path))
for path in files:
if should_include(os.path.join(parent, path),
- exclude_patterns, include_patterns):
+ exclude_patterns, include_patterns, root):
paths.append(os.path.join(parent, path))
return paths
def match_path(path, pattern):
+
pattern = pattern.rstrip('/' + os.path.sep)
- if pattern:
+ if pattern and not os.path.isabs(pattern):
pattern = os.path.relpath(pattern)
pattern_components = pattern.split(os.path.sep)