mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 13:21:05 +00:00
3befa9e65b
This is a simple command line utility for doing zstd compression/decompression of stdin to stdout. It depends on python's zstandard module being available. Differential Revision: https://phabricator.services.mozilla.com/D75358
80 lines
2.2 KiB
Python
Executable File
80 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# 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/.
|
|
|
|
"""This script compresses and decompresses data using the zstandard compression
|
|
format, as provided by the python-zstandard module.
|
|
|
|
Data is provided on stdin and output on stdout."""
|
|
|
|
import sys
|
|
import zstandard
|
|
from argparse import ArgumentParser
|
|
|
|
|
|
def main(argv=None):
|
|
parser = ArgumentParser(description=__doc__)
|
|
parser.set_defaults(mode="compress")
|
|
parser.add_argument(
|
|
"-z",
|
|
"--compress",
|
|
dest="mode",
|
|
action="store_const",
|
|
const="compress",
|
|
help="compress the data (this is the default)",
|
|
)
|
|
parser.add_argument(
|
|
"-d",
|
|
"--decompress",
|
|
dest="mode",
|
|
action="store_const",
|
|
const="decompress",
|
|
help="decompress the data",
|
|
)
|
|
parser.add_argument(
|
|
"-T",
|
|
"--threads",
|
|
dest="threads",
|
|
default=1,
|
|
type=int,
|
|
help="Compress using # working threads. If 0, use number of CPUs on the system. (default 1)",
|
|
)
|
|
parser.add_argument(
|
|
"-l",
|
|
"--level",
|
|
dest="level",
|
|
default=3,
|
|
type=int,
|
|
help="Compression level from 1-22 (default 3)",
|
|
)
|
|
parser.add_argument(
|
|
"file",
|
|
nargs="?",
|
|
help="File to compress/decompress. Default is stdin.",
|
|
)
|
|
|
|
args = parser.parse_args(argv)
|
|
|
|
# The zstd commandline tool uses 0 to specify number of threads equal to
|
|
# the number of CPUs whereas the python module uses negative numbers to
|
|
# flag this behavior. Emulate the zstd commandline utility's behavior here
|
|
if args.threads == 0:
|
|
args.threads = -1
|
|
|
|
if args.file:
|
|
in_file = open(args.file, "rb")
|
|
else:
|
|
in_file = sys.stdin.buffer
|
|
|
|
if args.mode == "compress":
|
|
ctx = zstandard.ZstdCompressor(level=args.level, threads=args.threads)
|
|
elif args.mode == "decompress":
|
|
ctx = zstandard.ZstdDecompressor()
|
|
|
|
ctx.copy_stream(in_file, sys.stdout.buffer)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|