summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2015-05-07 16:59:20 -0700
committerJoffrey F <joffrey@docker.com>2015-05-07 16:59:20 -0700
commit68e3ca16f1a804f3ea939f6a376eaa32809d2e02 (patch)
treea96e7b6e41d3c6de8a0788ba692c0f5a61983f3f
parentf28e90bfabb0f671743133210cb16a5cdd3c2a9c (diff)
downloaddocker-py-dockerignore-folders-exclude.tar.gz
Added proper support for .dockerignore 'folder/' syntaxdockerignore-folders-exclude
-rw-r--r--docker/utils/utils.py46
1 files changed, 36 insertions, 10 deletions
diff --git a/docker/utils/utils.py b/docker/utils/utils.py
index a18939d..ac7ce97 100644
--- a/docker/utils/utils.py
+++ b/docker/utils/utils.py
@@ -68,6 +68,35 @@ def fnmatch_any(relpath, patterns):
return any([fnmatch(relpath, pattern) for pattern in patterns])
+def _advanced_exclude(exclude):
+ result = {
+ 'folders': [],
+ 'files': []
+ }
+ for ex in exclude:
+ if ex[-1] == '/':
+ result['folders'].append(ex[:-1])
+ else:
+ result['files'].append(ex)
+ return result
+
+
+def _build_tar_list(dirnames, filenames, relpath, exclude):
+ exclude = _advanced_exclude(exclude)
+ dirnames[:] = [
+ d for d in dirnames if not fnmatch_any(
+ os.path.join(relpath, d),
+ exclude['folders'] + exclude['files']
+ )
+ ]
+ fnames = [
+ name for name in filenames if not fnmatch_any(
+ os.path.join(relpath, name), exclude['files']
+ )
+ ]
+ return sorted(dirnames), sorted(fnames)
+
+
def tar(path, exclude=None):
f = tempfile.NamedTemporaryFile()
t = tarfile.open(mode='w', fileobj=f)
@@ -78,20 +107,17 @@ def tar(path, exclude=None):
if exclude is None:
fnames = filenames
else:
- dirnames[:] = [d for d in dirnames
- if not fnmatch_any(os.path.join(relpath, d),
- exclude)]
- fnames = [name for name in filenames
- if not fnmatch_any(os.path.join(relpath, name),
- exclude)]
- dirnames.sort()
- for name in sorted(fnames):
+ dirnames, fnames = _build_tar_list(
+ dirnames, filenames, relpath, exclude
+ )
+ for name in fnames:
arcname = os.path.join(relpath, name)
t.add(os.path.join(path, arcname), arcname=arcname)
for name in dirnames:
arcname = os.path.join(relpath, name)
- t.add(os.path.join(path, arcname),
- arcname=arcname, recursive=False)
+ t.add(
+ os.path.join(path, arcname), arcname=arcname, recursive=False
+ )
t.close()
f.seek(0)
return f