# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import argparse
import os
import sys
import mozpack.path
as mozpath
from mozpack.files
import FileFinder
def make_archive(archive_name, base, exclude, include):
compress = [
"**/*.sym"]
finder = FileFinder(base, ignore=exclude)
if not include:
include = [
"*"]
archive_basename = os.path.basename(archive_name)
def fill_archive(add_file):
for pat
in include:
for p, f
in finder.find(pat):
print(
' Adding to "%s":\n\t"%s"' % (archive_basename, p))
add_file(p, f)
with open(archive_name,
"wb")
as fh:
if archive_basename.endswith(
".zip"):
from mozpack.mozjar
import JarWriter
with JarWriter(fileobj=fh, compress_level=5)
as writer:
def add_file(p, f):
should_compress = any(mozpath.match(p, pat)
for pat
in compress)
writer.add(
p.encode(
"utf-8"),
f,
mode=f.mode,
compress=should_compress,
skip_duplicates=
True,
)
fill_archive(add_file)
elif archive_basename.endswith(
".tar.zst"):
import tarfile
import zstandard
ctx = zstandard.ZstdCompressor(threads=-1)
with ctx.stream_writer(fh)
as zstdwriter:
with tarfile.open(
mode=
"w|", fileobj=zstdwriter, bufsize=1024 * 1024
)
as tar:
def add_file(p, f):
info = tar.gettarinfo(os.path.join(base, p), p)
tar.addfile(info, f.open())
fill_archive(add_file)
else:
raise Exception(
"Unsupported archive format for {}".format(archive_basename)
)
def main(argv):
parser = argparse.ArgumentParser(description=
"Produce a symbols archive")
parser.add_argument(
"archive", help=
"Which archive to generate")
parser.add_argument(
"base", help=
"Base directory to package")
parser.add_argument(
"--full-archive", action=
"store_true", help=
"Generate a full symbol archive"
)
args = parser.parse_args(argv)
excludes = []
includes = []
if args.full_archive:
# We allow symbols for tests to be included when building on try
if os.environ.get(
"MH_BRANCH",
"unknown") !=
"try":
excludes = [
"*test*",
"*Test*"]
else:
includes = [
"**/*.sym"]
make_archive(args.archive, args.base, excludes, includes)
if __name__ ==
"__main__":
main(sys.argv[1:])