|  | #!/usr/bin/env python3 | 
|  | # Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file | 
|  | # for details. All rights reserved. Use of this source code is governed by a | 
|  | # BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | import os | 
|  | import shutil | 
|  | import subprocess | 
|  | import zipfile | 
|  |  | 
|  | import utils | 
|  |  | 
|  |  | 
|  | def add_file_to_zip(file, destination, zip_file): | 
|  | with zipfile.ZipFile(zip_file, 'a') as zip: | 
|  | zip.write(file, destination) | 
|  |  | 
|  |  | 
|  | def extract_all_that_matches(zip_file, destination, predicate): | 
|  | with zipfile.ZipFile(zip_file) as zip: | 
|  | names_to_extract = [name for name in zip.namelist() if predicate(name)] | 
|  | zip.extractall(path=destination, members=names_to_extract) | 
|  | return names_to_extract | 
|  |  | 
|  |  | 
|  | def extract_member(zip_file, member, destination): | 
|  | with zipfile.ZipFile(zip_file) as zip: | 
|  | with utils.TempDir() as temp: | 
|  | zip.extract(member, path=temp) | 
|  | shutil.move(os.path.join(temp, member), destination) | 
|  |  | 
|  |  | 
|  | def get_names_that_matches(zip_file, predicate): | 
|  | with zipfile.ZipFile(zip_file) as zip: | 
|  | return [name for name in zip.namelist() if predicate(name)] | 
|  |  | 
|  |  | 
|  | def remove_files_from_zip(files, zip_file): | 
|  | assert os.path.exists(zip_file) | 
|  | cmd = ['zip', '-d', zip_file] + files | 
|  | subprocess.run(cmd) |