Update GetTargetFilesZipForCustomImagesUpdates zip2zip call
This changes the generation of the target files with oem images to operate in two passes. 1/ zip2zip is called without any filespec. 2/ oem images are replaced. This allows to generate the target-files faster (as entries do not need to be iterated one by one) and removes the need to escape special file names. Bug: 269397842 Change-Id: Ic1cf398b90344e01b2f1658079903d45bcc00b46
This commit is contained in:
@@ -727,30 +727,34 @@ def GetTargetFilesZipForCustomImagesUpdates(input_file, custom_images):
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The filename of a target-files.zip which has renamed the custom images in
|
The filename of a target-files.zip which has renamed the custom images in
|
||||||
the IMAGS/ to their partition names.
|
the IMAGES/ to their partition names.
|
||||||
"""
|
"""
|
||||||
# Use zip2zip to avoid extracting the zipfile.
|
|
||||||
|
# First pass: use zip2zip to copy the target files contents, excluding
|
||||||
|
# the "custom" images that will be replaced.
|
||||||
target_file = common.MakeTempFile(prefix="targetfiles-", suffix=".zip")
|
target_file = common.MakeTempFile(prefix="targetfiles-", suffix=".zip")
|
||||||
cmd = ['zip2zip', '-i', input_file, '-o', target_file]
|
cmd = ['zip2zip', '-i', input_file, '-o', target_file]
|
||||||
|
|
||||||
with zipfile.ZipFile(input_file, allowZip64=True) as input_zip:
|
images = {}
|
||||||
namelist = input_zip.namelist()
|
|
||||||
|
|
||||||
# Write {custom_image}.img as {custom_partition}.img.
|
|
||||||
for custom_partition, custom_image in custom_images.items():
|
for custom_partition, custom_image in custom_images.items():
|
||||||
default_custom_image = '{}.img'.format(custom_partition)
|
default_custom_image = '{}.img'.format(custom_partition)
|
||||||
if default_custom_image != custom_image:
|
if default_custom_image != custom_image:
|
||||||
logger.info("Update custom partition '%s' with '%s'",
|
src = 'IMAGES/' + custom_image
|
||||||
custom_partition, custom_image)
|
dst = 'IMAGES/' + default_custom_image
|
||||||
# Default custom image need to be deleted first.
|
cmd.extend(['-x', dst])
|
||||||
namelist.remove('IMAGES/{}'.format(default_custom_image))
|
images[dst] = src
|
||||||
# IMAGES/{custom_image}.img:IMAGES/{custom_partition}.img.
|
|
||||||
cmd.extend(['IMAGES/{}:IMAGES/{}'.format(custom_image,
|
|
||||||
default_custom_image)])
|
|
||||||
|
|
||||||
cmd.extend(['{}:{}'.format(name, name) for name in namelist])
|
|
||||||
common.RunAndCheckOutput(cmd)
|
common.RunAndCheckOutput(cmd)
|
||||||
|
|
||||||
|
# Second pass: write {custom_image}.img as {custom_partition}.img.
|
||||||
|
with zipfile.ZipFile(input_file, allowZip64=True) as input_zip:
|
||||||
|
with zipfile.ZipFile(target_file, 'a', allowZip64=True) as output_zip:
|
||||||
|
for dst, src in images.items():
|
||||||
|
data = input_zip.read(src)
|
||||||
|
logger.info("Update custom partition '%s'", dst)
|
||||||
|
common.ZipWriteStr(output_zip, dst, data)
|
||||||
|
output_zip.close()
|
||||||
|
|
||||||
return target_file
|
return target_file
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user