Index: infra/bots/zip_utils.py |
diff --git a/infra/bots/zip_utils.py b/infra/bots/zip_utils.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7f269b9e9b5ab4d825eedbb9da95e38f32b0c392 |
--- /dev/null |
+++ b/infra/bots/zip_utils.py |
@@ -0,0 +1,61 @@ |
+#!/usr/bin/env python |
+# |
+# Copyright 2016 Google Inc. |
+# |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+ |
+"""Utilities for zipping and unzipping files.""" |
+ |
+ |
+import fnmatch |
+import os |
+import zipfile |
+ |
+ |
+def filtered(names, blacklist): |
+ """Filter the list of file or directory names.""" |
+ rv = names[:] |
+ for pattern in blacklist: |
+ rv = [n for n in rv if not fnmatch.fnmatch(n, pattern)] |
+ return rv |
+ |
+ |
+def zip(target_dir, zip_file, blacklist=None): # pylint: disable=W0622 |
+ """Zip the given directory, write to the given zip file.""" |
+ if not os.path.isdir(target_dir): |
+ raise IOError('%s does not exist!' % target_dir) |
+ blacklist = blacklist or [] |
+ with zipfile.ZipFile(zip_file, 'w') as z: |
+ for r, d, f in os.walk(target_dir, topdown=True): |
+ d[:] = filtered(d, blacklist) |
+ for filename in filtered(f, blacklist): |
+ filepath = os.path.join(r, filename) |
+ zi = zipfile.ZipInfo(filepath) |
+ zi.filename = os.path.relpath(filepath, target_dir) |
+ perms = os.stat(filepath).st_mode |
+ zi.external_attr = perms << 16L |
+ zi.compress_type = zipfile.ZIP_STORED |
+ with open(filepath, 'rb') as f: |
+ content = f.read() |
+ z.writestr(zi, content) |
+ for dirname in d: |
+ dirpath = os.path.join(r, dirname) |
+ z.write(dirpath, os.path.relpath(dirpath, target_dir)) |
+ |
+ |
+def unzip(zip_file, target_dir): |
+ """Unzip the given zip file into the target dir.""" |
+ if not os.path.isdir(target_dir): |
+ os.makedirs(target_dir) |
+ with zipfile.ZipFile(zip_file, 'r') as z: |
+ for zi in z.infolist(): |
+ dst_path = os.path.join(target_dir, zi.filename) |
+ if zi.filename.endswith('/'): |
+ os.mkdir(dst_path) |
+ else: |
+ with open(dst_path, 'w') as f: |
+ f.write(z.read(zi)) |
+ perms = zi.external_attr >> 16L |
+ os.chmod(dst_path, perms) |