44 lines
1.8 KiB
Python
44 lines
1.8 KiB
Python
# 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',
|
|
'--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
|