xref: /aosp_15_r20/art/test/merge_zips_to_tgz.py (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*795d594fSAndroid Build Coastguard Worker
3*795d594fSAndroid Build Coastguard Workerimport tarfile
4*795d594fSAndroid Build Coastguard Workerimport zipfile
5*795d594fSAndroid Build Coastguard Workerimport sys
6*795d594fSAndroid Build Coastguard Workerimport io
7*795d594fSAndroid Build Coastguard Workerfrom pathlib import Path
8*795d594fSAndroid Build Coastguard Worker
9*795d594fSAndroid Build Coastguard Workerdef merge_zips_to_tgz(tgz_filename, zip_filenames):
10*795d594fSAndroid Build Coastguard Worker  with open(tgz_filename, 'wb') as outfile:
11*795d594fSAndroid Build Coastguard Worker    with tarfile.open(fileobj=outfile, mode='w:gz') as tgz:
12*795d594fSAndroid Build Coastguard Worker      for zip_filename in zip_filenames:
13*795d594fSAndroid Build Coastguard Worker        with zipfile.ZipFile(zip_filename, 'r') as zip_file:
14*795d594fSAndroid Build Coastguard Worker          for zip_info in zip_file.infolist():
15*795d594fSAndroid Build Coastguard Worker            with zip_file.open(zip_info) as zip_member:
16*795d594fSAndroid Build Coastguard Worker              buffer = io.BytesIO(zip_member.read())
17*795d594fSAndroid Build Coastguard Worker              tar_info = tarfile.TarInfo(name=zip_info.filename)
18*795d594fSAndroid Build Coastguard Worker              tar_info.size = len(buffer.getbuffer())
19*795d594fSAndroid Build Coastguard Worker              tgz.addfile(tarinfo=tar_info, fileobj=buffer)
20*795d594fSAndroid Build Coastguard Worker
21*795d594fSAndroid Build Coastguard Worker
22*795d594fSAndroid Build Coastguard Workerif __name__ == "__main__":
23*795d594fSAndroid Build Coastguard Worker  if len(sys.argv) < 2:
24*795d594fSAndroid Build Coastguard Worker    print(f"Usage: {Path(__file__).name} output.tgz zip1.zip zip2.zip ...")
25*795d594fSAndroid Build Coastguard Worker    sys.exit(1)
26*795d594fSAndroid Build Coastguard Worker
27*795d594fSAndroid Build Coastguard Worker  tgz_filename = sys.argv[1]
28*795d594fSAndroid Build Coastguard Worker  zip_filenames = sys.argv[2:]
29*795d594fSAndroid Build Coastguard Worker  merge_zips_to_tgz(tgz_filename, zip_filenames)
30*795d594fSAndroid Build Coastguard Worker
31