in build/get_syzygy_binaries.py [0:0]
def _InstallBinaries(options, deleted={}):
"""Installs Syzygy binaries. This assumes that the output directory has
already been cleaned, as it will refuse to overwrite existing files."""
contents = {}
state = { 'revision': options.revision, 'contents': contents }
archive_path = _SYZYGY_ARCHIVE_PATH % { 'revision': options.revision }
if options.resources:
resources = [(resource, resource, '', None)
for resource in options.resources]
else:
resources = _RESOURCES
for (base, name, subdir, filt) in resources:
# Create the output directory if it doesn't exist.
fulldir = os.path.join(options.output_dir, subdir)
if os.path.isfile(fulldir):
raise Exception('File exists where a directory needs to be created: %s' %
fulldir)
if not os.path.exists(fulldir):
_LOGGER.debug('Creating directory: %s', fulldir)
if not options.dry_run:
os.makedirs(fulldir)
# Download and read the archive.
resource = archive_path + '/' + base
_LOGGER.debug('Retrieving %s archive at "%s".', name, resource)
path = _Download(resource)
_LOGGER.debug('Unzipping %s archive.', name)
with open(path, 'rb') as data:
archive = zipfile.ZipFile(data)
for entry in archive.infolist():
if not filt or filt(entry):
fullpath = os.path.normpath(os.path.join(fulldir, entry.filename))
relpath = os.path.relpath(fullpath, options.output_dir)
if os.path.exists(fullpath):
# If in a dry-run take into account the fact that the file *would*
# have been deleted.
if options.dry_run and relpath in deleted:
pass
else:
raise Exception('Path already exists: %s' % fullpath)
# Extract the file and update the state dictionary.
_LOGGER.debug('Extracting "%s".', fullpath)
if not options.dry_run:
archive.extract(entry.filename, fulldir)
md5 = _Md5(fullpath)
contents[relpath] = md5
if sys.platform == 'cygwin':
os.chmod(fullpath, os.stat(fullpath).st_mode | stat.S_IXUSR)
_LOGGER.debug('Removing temporary file "%s".', path)
os.remove(path)
return state