import argparse
import itertools
import os
import sys
import tarfile
DELIM_JAVA = '__DELIM_JAVA__'
DELIM_RES = '__DELIM_RES__'
DELIM_ASSETS = '__DELIM_ASSETS__'
DELIM_AIDL = '__DELIM_AIDL__'
DELIMS = (
DELIM_JAVA,
DELIM_RES,
DELIM_ASSETS,
DELIM_AIDL,
)
DESTS = {
DELIM_JAVA: 'src',
DELIM_RES: 'res',
DELIM_ASSETS: 'assets',
DELIM_AIDL: 'aidl',
}
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('--asrcs', nargs='*')
parser.add_argument('--input', nargs='*')
parser.add_argument('--jsrcs', nargs='*')
parser.add_argument('--output', required=True)
parser.add_argument('--work', required=True)
return parser.parse_args()
def main():
args = parse_args()
files = []
parts = []
if args.input and len(args.input) > 0:
for x in args.input:
if x in DELIMS:
assert len(parts) == 0 or len(parts[-1]) > 1
parts.append([x])
else:
assert len(parts) > 0
parts[-1].append(x)
assert len(parts[-1]) > 1
if args.jsrcs and len(args.jsrcs):
src_dir = os.path.join(args.work, DESTS[DELIM_JAVA])
os.makedirs(src_dir)
for jsrc in filter(lambda x: x.endswith('.jsrc'), args.jsrcs):
with tarfile.open(jsrc, 'r') as tar:
names = tar.getnames()
if names and len(names) > 0:
parts.append([DELIM_JAVA, src_dir])
parts[-1].extend(itertools.imap(lambda x: os.path.join(src_dir, x), names))
if sys.version_info >= (3, 12):
tar.extractall(path=src_dir, filter='data')
else:
tar.extractall(path=src_dir)
if args.asrcs and len(args.asrcs):
for asrc in filter(lambda x: x.endswith('.asrc') and os.path.exists(x), args.asrcs):
with tarfile.open(asrc, 'r') as tar:
files.extend(tar.getnames())
if sys.version_info >= (3, 12):
tar.extractall(path=args.work, filter='data')
else:
tar.extractall(path=args.work)
with tarfile.open(args.output, 'w') as out:
for part in parts:
dest = DESTS[part[0]]
prefix = part[1]
for f in part[2:]:
out.add(f, arcname=os.path.join(dest, os.path.relpath(f, prefix)))
for f in files:
out.add(os.path.join(args.work, f), arcname=f)
if __name__ == '__main__':
main()