0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-11-22 04:59:34 +01:00
mongodb/evergreen/functions/binaries_extract.py
Juan Gu 855dfadef0 SERVER-94077 Use isort in Ruff configs (#27865)
GitOrigin-RevId: e793d662774ccd3ab6c3f356c2287cf1f7ff9805
2024-10-10 19:33:49 +00:00

103 lines
3.4 KiB
Python

#!/usr/bin/env python3
#
# Copyright 2020 MongoDB Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
import argparse
import glob
import os
import pathlib
import shutil
import subprocess
import sys
parser = argparse.ArgumentParser()
parser.add_argument(
"--change-dir",
type=str,
action="store",
help="The directory to change into to perform the extraction.",
)
parser.add_argument(
"--extraction-command", type=str, action="store", help="The command to use for the extraction."
)
parser.add_argument(
"--tarball", type=str, action="store", help="The tarball to perform the extraction on."
)
parser.add_argument(
"--move-output",
type=str,
action="append",
help="Move an extracted entry to a new location after extraction. Format is colon separated, e.g. '--move-output=file/to/move:path/to/destination'. Can accept glob like wildcards.",
)
parser.add_argument(
"--optional",
action="store_true",
help="Should this fail if extraction fails. Useful for optional success.",
)
args = parser.parse_args()
if args.change_dir:
working_dir = pathlib.Path(args.change_dir).as_posix()
tarball = pathlib.Path(args.tarball).resolve().as_posix()
print(f"Switching to {working_dir} to perform the extraction in.")
os.makedirs(working_dir, exist_ok=True)
else:
working_dir = None
tarball = pathlib.Path(args.tarball).as_posix()
shell = os.environ.get("SHELL", "/bin/bash")
if sys.platform == "win32":
proc = subprocess.run(
["C:/cygwin/bin/cygpath.exe", "-w", shell], text=True, capture_output=True
)
bash = pathlib.Path(proc.stdout.strip())
cmd = [bash.as_posix(), "-c", f"{args.extraction_command} {tarball}"]
else:
cmd = [shell, "-c", f"{args.extraction_command} {tarball}"]
print(f"Extracting: {' '.join(cmd)}")
proc = subprocess.run(
cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=working_dir
)
print(proc.stdout)
if args.move_output:
for arg in args.move_output:
try:
src, dst = arg.split(":")
print(f"Moving {src} to {dst}...")
files_to_move = glob.glob(src, recursive=True)
for file in files_to_move:
result_dst = shutil.move(file, dst)
print(f"Moved {file} to {result_dst}")
except ValueError as exc:
print(f"Bad format, needs to be glob like paths in the from 'src:dst', got: {arg}")
raise exc
if args.optional:
sys.exit(0)
sys.exit(proc.returncode)