summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/action/symbols_archive.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/action/symbols_archive.py')
-rw-r--r--python/mozbuild/mozbuild/action/symbols_archive.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/action/symbols_archive.py b/python/mozbuild/mozbuild/action/symbols_archive.py
new file mode 100644
index 0000000000..75ecb71d17
--- /dev/null
+++ b/python/mozbuild/mozbuild/action/symbols_archive.py
@@ -0,0 +1,89 @@
+# 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:])