Index: tools/grit/grit/format/gzip_string.py |
diff --git a/tools/grit/grit/format/gzip_string.py b/tools/grit/grit/format/gzip_string.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4f54aac1da04c5803e28d74aa4e211f67048c8a7 |
--- /dev/null |
+++ b/tools/grit/grit/format/gzip_string.py |
@@ -0,0 +1,43 @@ |
+# Copyright (c) 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+"""Provides gzip utilities for strings. |
+""" |
+import cStringIO |
+import gzip |
+import subprocess |
+ |
+ |
+def GzipStringRsyncable(data): |
+ # Make call to host system's gzip to get access to --rsyncable option. This |
+ # option makes updates much smaller - if one line is changed in the resource, |
+ # it won't have to push the entire compressed resource with the update. |
+ # Instead, --rsyncable breaks the file into small chunks, so that one doesn't |
+ # affect the other in compression, and then only that chunk will have to be |
+ # updated. |
+ gzip_proc = subprocess.Popen(['gzip', '--stdout', '--rsyncable', |
+ '--best', '--no-name'], |
+ stdin=subprocess.PIPE, |
+ stdout=subprocess.PIPE, |
+ stderr=subprocess.PIPE) |
+ data, stderr = gzip_proc.communicate(data) |
+ if gzip_proc.returncode != 0: |
+ raise subprocess.CalledProcessError(gzip_proc.returncode, 'gzip', |
+ stderr) |
+ return data |
+ |
+ |
+def GzipString(data): |
+ # Gzipping using Python's built in gzip: Windows doesn't ship with gzip, and |
+ # OSX's gzip does not have an --rsyncable option built in. Although this is |
+ # not preferable to --rsyncable, it is an option for the systems that do |
+ # not have --rsyncable. If used over GzipStringRsyncable, the primary |
+ # difference of this function's compression will be larger updates every time |
+ # a compressed resource is changed. |
+ gzip_output = cStringIO.StringIO() |
+ with gzip.GzipFile(mode='wb', compresslevel=9, fileobj=gzip_output, |
+ mtime=0) as gzip_file: |
+ gzip_file.write(data) |
+ data = gzip_output.getvalue() |
+ gzip_output.close() |
+ return data |