diff options
author | Joffrey F <joffrey@docker.com> | 2015-05-07 16:59:20 -0700 |
---|---|---|
committer | Joffrey F <joffrey@docker.com> | 2015-05-07 16:59:20 -0700 |
commit | 68e3ca16f1a804f3ea939f6a376eaa32809d2e02 (patch) | |
tree | a96e7b6e41d3c6de8a0788ba692c0f5a61983f3f | |
parent | f28e90bfabb0f671743133210cb16a5cdd3c2a9c (diff) | |
download | docker-py-dockerignore-folders-exclude.tar.gz |
Added proper support for .dockerignore 'folder/' syntaxdockerignore-folders-exclude
-rw-r--r-- | docker/utils/utils.py | 46 |
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 |