blob: 8e96a3e6598a56f176f9f4b82910b0146240d5ed [file] [log] [blame]
#!/usr/bin/env python
"""Downloads the clang-format binary appropriate for the host platform."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import argparse
import os
import platform
import sys
import urllib.request
import urllib.error
def report_download_progress(chunk_number, chunk_size, file_size):
"""Pretty printer for file download progress."""
if file_size != -1:
percent = min(1, (chunk_number * chunk_size) / file_size)
bar = "#" * int(64 * percent)
sys.stdout.write("\r0% |{:<64}| {}%".format(bar, int(percent * 100)))
def download_clang_format(path):
"""Downloads a clang-format binary appropriate for the host platform and stores it at the given location."""
# This dictionary maps each platform to the S3 object URL for its clang-format binary.
PLATFORM_TO_URL = {
"Darwin": "https://oss-clang-format.s3.us-east-2.amazonaws.com/mac/clang-format-mojave",
"Linux": "https://oss-clang-format.s3.us-east-2.amazonaws.com/linux64/clang-format-linux64",
}
plat = platform.system()
if plat not in PLATFORM_TO_URL:
print("Unsupported platform: {}".format(plat))
return False
cf_url = PLATFORM_TO_URL[plat]
filename = "{}{}clang-format".format(path, os.sep)
# Try to download clang-format.
try:
urllib.request.urlretrieve(
cf_url, filename, reporthook=report_download_progress
)
except urllib.error.URLError as e:
print("Error downloading {}: {}".format(filename, str(e)))
return False
finally:
print()
return True
def parse_args(args):
"""Parse and return command-line arguments."""
parser = argparse.ArgumentParser(
description="Install a platform-appropriate clang-format binary for use during PyTorch development."
)
parser.add_argument(
"--path", required=True, help="Path where clang-format should be stored"
)
return parser.parse_args(args)
def sanitize_path(path):
"""Sanitize a given path by expanding ~ and converting a relative path to an absolute path."""
expand_user = os.path.expanduser(path)
abs_path = os.path.abspath(expand_user)
return abs_path
def main(args):
# Parse arguments.
options = parse_args(args)
# Make sure the path is absolute.
path = sanitize_path(options.path)
# Try downloading clang-format.
ok = download_clang_format(path)
if ok:
print("Successfully downloaded clang-format to {}".format(path))
print("Remember to add {} to your PATH".format(path))
return not ok
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))