Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Unified Diff: tools/grit/grit/node/include.py

Issue 1968993002: Compressing .pak resources with new option: "type=GZIPPABLE_BINDATA" (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reformatted based on review suggestions Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/grit/grit/node/include.py
diff --git a/tools/grit/grit/node/include.py b/tools/grit/grit/node/include.py
index ebcd53108f503005dadae9ae67b192245fb0a66d..99763bdb5cfd6d3019c28cddf81a31f07e43f918 100755
--- a/tools/grit/grit/node/include.py
+++ b/tools/grit/grit/node/include.py
@@ -6,14 +6,17 @@
"""Handling of the <include> element.
"""
+import gzip
import os
+import StringIO
+import subprocess
+import sys
+from grit import util
import grit.format.html_inline
-import grit.format.rc_header
import grit.format.rc
-
+import grit.format.rc_header
from grit.node import base
-from grit import util
class IncludeNode(base.Node):
"""An <include> element."""
@@ -38,6 +41,34 @@ class IncludeNode(base.Node):
allow_external_script=allow_external_script))
return self._flattened_data
+ def _GzipString(self, data):
flackr 2016/05/13 23:02:17 This helper function (or functions if you follow m
smaier 2016/05/19 14:17:56 Done.
+ if sys.platform == 'linux2':
flackr 2016/05/13 23:02:16 nit: I'd prefer to see either two gzip functions (
smaier 2016/05/19 14:17:56 Done.
+ # Make call to linux'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)
+ else:
+ # Only expecting linux gzip calls to work: windows doesn't ship with
flackr 2016/05/13 23:02:17 This comment needs updating, or to be removed.
smaier 2016/05/19 14:17:56 Done.
+ # gzip, and OSX's gzip does not have an --rsyncable option built in.
+ # Therefore, fall back into the built in python function.
+ gzip_output = StringIO.StringIO()
+ with gzip.GzipFile('', 'wb', 9, gzip_output, 0) as gzip_file:
+ gzip_file.write(data)
+ data = gzip_output.getvalue()
+ gzip_output.close()
+ return data
+
def MandatoryAttributes(self):
return ['name', 'type', 'file']
@@ -90,6 +121,9 @@ class IncludeNode(base.Node):
filename = self.ToRealPath(self.GetInputPath())
data = util.ReadFile(filename, util.BINARY)
+ if self.attrs['type'] == 'GZIPPABLE_BINDATA':
flackr 2016/05/13 23:02:17 I don't think this should be a new type. The type
smaier 2016/05/19 14:17:56 Done.
+ data = self._GzipString(data)
flackr 2016/05/13 23:02:17 This new behavior should have a test. There's some
smaier 2016/05/19 14:17:56 Let me know if the unit tests written are sufficie
+
# Include does not care about the encoding, because it only returns binary
# data.
return id, data

Powered by Google App Engine
This is Rietveld 408576698