milis/talimatname/genel/c/chromium/gzip_string.py

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