Skip to content

Commit b30fef8

Browse files
committed
[GR-29082] Add flag --quiet to ginstall.
PullRequest: graalpython/1581
2 parents 59e612c + 9a65e64 commit b30fef8

File tree

1 file changed

+27
-17
lines changed

1 file changed

+27
-17
lines changed

graalpython/lib-graalpython/modules/ginstall.py

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import subprocess
4747
import tempfile
4848
import importlib
49+
import time
4950

5051
import sys
5152

@@ -99,12 +100,12 @@ def wrapper(*args, **kwargs):
99100
return wrapper
100101
return decorator
101102

102-
def run_cmd(args, msg="", failOnError=True, cwd=None, env=None):
103-
cwd_log = "cd " + cwd if cwd else ""
103+
def run_cmd(args, msg="", failOnError=True, cwd=None, env=None, quiet=False, **kwargs):
104+
cwd_log = "cd " + cwd + " ;" if cwd else ""
104105
print("+", cwd_log, ' '.join(args))
105-
result = subprocess.run(args, cwd=cwd, env=env)
106+
result = subprocess.run(args, cwd=cwd, env=env, capture_output=quiet, **kwargs)
106107
if failOnError and result.returncode != 0:
107-
xit(msg, status=result.returncode)
108+
xit(os.linesep.join((msg, str(result.stdout))), status=result.returncode)
108109
return result.returncode
109110

110111
def known_packages():
@@ -398,13 +399,13 @@ def xit(msg, status=-1):
398399
exit(-1)
399400

400401

401-
def _download_with_curl_and_extract(dest_dir, url):
402+
def _download_with_curl_and_extract(dest_dir, url, quiet=False):
402403
name = url[url.rfind("/")+1:]
403404

404405
downloaded_path = os.path.join(dest_dir, name)
405406

406407
# first try direct connection
407-
if run_cmd(["curl", "-L", "-o", downloaded_path, url], failOnError=False) != 0:
408+
if run_cmd(["curl", "-L", "-o", downloaded_path, url], failOnError=False, quiet=quiet) != 0:
408409
# honor env var 'HTTP_PROXY', 'HTTPS_PROXY', and 'NO_PROXY'
409410
env = os.environ
410411
curl_opts = []
@@ -417,16 +418,16 @@ def _download_with_curl_and_extract(dest_dir, url):
417418
using_proxy = True
418419
if using_proxy and "NO_PROXY" in env:
419420
curl_opts += ["--noproxy", env["NO_PROXY"]]
420-
run_cmd(["curl", "-L"] + curl_opts + ["-o", downloaded_path, url], msg="Download error")
421+
run_cmd(["curl", "-L"] + curl_opts + ["-o", downloaded_path, url], msg="Download error", quiet=quiet)
421422

422423
if name.endswith(".tar.gz"):
423-
run_cmd(["tar", "xzf", downloaded_path, "-C", dest_dir], msg="Error extracting tar.gz")
424+
run_cmd(["tar", "xzf", downloaded_path, "-C", dest_dir], msg="Error extracting tar.gz", quiet=quiet)
424425
bare_name = name[:-len(".tar.gz")]
425426
elif name.endswith(".tar.bz2"):
426-
run_cmd(["tar", "xjf", downloaded_path, "-C", dest_dir], msg="Error extracting tar.bz2")
427+
run_cmd(["tar", "xjf", downloaded_path, "-C", dest_dir], msg="Error extracting tar.bz2", quiet=quiet)
427428
bare_name = name[:-len(".tar.bz2")]
428429
elif name.endswith(".zip"):
429-
run_cmd(["unzip", "-u", downloaded_path, "-d", dest_dir], msg="Error extracting zip")
430+
run_cmd(["unzip", "-u", downloaded_path, "-d", dest_dir], msg="Error extracting zip", quiet=quiet)
430431
bare_name = name[:-len(".zip")]
431432
else:
432433
xit("Unknown file type: %s" % name)
@@ -437,6 +438,8 @@ def _download_with_curl_and_extract(dest_dir, url):
437438
def _install_from_url(url, package, extra_opts=[], add_cflags="", ignore_errors=False, env={}, version=None, pre_install_hook=None, build_cmd=[]):
438439
tempdir = tempfile.mkdtemp()
439440

441+
quiet = "-q" in extra_opts
442+
440443
os_env = os.environ
441444

442445
# honor env var 'CFLAGS' and the explicitly passed env
@@ -445,7 +448,7 @@ def _install_from_url(url, package, extra_opts=[], add_cflags="", ignore_errors=
445448
cflags = os_env.get("CFLAGS", "") + ((" " + add_cflags) if add_cflags else "")
446449
setup_env['CFLAGS'] = cflags if cflags else ""
447450

448-
bare_name = _download_with_curl_and_extract(tempdir, url)
451+
bare_name = _download_with_curl_and_extract(tempdir, url, quiet=quiet)
449452

450453
file_realpath = os.path.dirname(os.path.realpath(__file__))
451454
patches_dir = os.path.join(Path(file_realpath).parent, 'patches', package)
@@ -455,15 +458,15 @@ def _install_from_url(url, package, extra_opts=[], add_cflags="", ignore_errors=
455458

456459
patch_file_path = first_existing(package, versions, os.path.join(patches_dir, "sdist"), ".patch")
457460
if patch_file_path:
458-
run_cmd(["patch", "-d", os.path.join(tempdir, bare_name, ""), "-p1", "-i", patch_file_path])
461+
run_cmd(["patch", "-d", os.path.join(tempdir, bare_name, ""), "-p1", "-i", patch_file_path], quiet=quiet)
459462

460463
whl_patches_dir = os.path.join(patches_dir, "whl")
461464
patch_file_path = first_existing(package, versions, whl_patches_dir, ".patch")
462465
subdir = read_first_existing(package, versions, whl_patches_dir, ".dir")
463466
subdir = "" if subdir is None else subdir
464467
if patch_file_path:
465468
os.path.join(tempdir, bare_name, subdir)
466-
run_cmd(["patch", "-d", os.path.join(tempdir, bare_name, subdir), "-p1", "-i", patch_file_path])
469+
run_cmd(["patch", "-d", os.path.join(tempdir, bare_name, subdir), "-p1", "-i", patch_file_path], quiet=quiet)
467470

468471
if pre_install_hook:
469472
pre_install_hook(os.path.join(tempdir, bare_name))
@@ -472,10 +475,14 @@ def _install_from_url(url, package, extra_opts=[], add_cflags="", ignore_errors=
472475
user_arg = ["--user"]
473476
else:
474477
user_arg = []
478+
start = time.time()
475479
status = run_cmd([sys.executable, "setup.py"] + build_cmd + ["install"] + user_arg + extra_opts, env=setup_env,
476-
cwd=os.path.join(tempdir, bare_name))
480+
cwd=os.path.join(tempdir, bare_name), quiet=quiet)
481+
end = time.time()
477482
if status != 0 and not ignore_errors:
478483
xit("An error occurred trying to run `setup.py install %s %s'" % (user_arg, " ".join(extra_opts)))
484+
elif quiet:
485+
info("{} successfully installed (took {:.2f} s)", package, (end - start))
479486

480487
# NOTE: Following 3 functions are duplicated in pip_hook.py:
481488
# creates a search list of a versioned file:
@@ -522,7 +529,7 @@ def install_from_pypi(package, extra_opts=[], add_cflags="", ignore_errors=True,
522529
# this is already the url to the actual package
523530
pass
524531
else:
525-
r = subprocess.check_output("curl -L %s" % url, shell=True).decode("utf8")
532+
r = subprocess.check_output("curl -L %s" % url, stderr=subprocess.DEVNULL, shell=True).decode("utf8")
526533
url = None
527534
try:
528535
urls = json.loads(r)["urls"]
@@ -568,6 +575,7 @@ def get_site_packages_path():
568575

569576
def main(argv):
570577
parser = argparse.ArgumentParser(description="The simple Python package installer for GraalVM")
578+
parser.add_argument("--quiet", "-q", action="store_true", help="Do not show build output")
571579

572580
subparsers = parser.add_subparsers(title="Commands", dest="command", metavar="Use COMMAND --help for further help.")
573581

@@ -614,6 +622,8 @@ def main(argv):
614622
)
615623

616624
args = parser.parse_args(argv)
625+
626+
quiet_flag = ["-q"] if args.quiet else []
617627

618628
if args.command == "list":
619629
user_site = get_site_packages_path()
@@ -646,15 +656,15 @@ def main(argv):
646656
if pkg not in KNOWN_PACKAGES:
647657
xit("Unknown package: '%s'" % pkg)
648658
else:
649-
extra_opts = []
659+
extra_opts = [] + quiet_flag
650660
if args.prefix:
651661
extra_opts += ["--prefix", args.prefix]
652662
if args.user:
653663
extra_opts += ["--user"]
654664
KNOWN_PACKAGES[pkg](extra_opts=extra_opts)
655665
elif args.command == "pypi":
656666
for pkg in args.package.split(","):
657-
install_from_pypi(pkg, ignore_errors=False)
667+
install_from_pypi(pkg, extra_opts=quiet_flag, ignore_errors=False)
658668

659669

660670
if __name__ == "__main__":

0 commit comments

Comments
 (0)