diff --git a/docs/en/get-started/index.rst b/docs/en/get-started/index.rst index feff0a1d23..7e8bbfa140 100644 --- a/docs/en/get-started/index.rst +++ b/docs/en/get-started/index.rst @@ -185,6 +185,33 @@ Linux and macOS cd ~/esp/esp-idf ./install.sh +Alternative File Downloads +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The tools installer downloads a number of files attached to GitHub Releases. If accessing GitHub is slow then it is possible to set an environment variable to prefer Espressif's download server for GitHub asset downloads. + +.. note:: This setting only controls individual tools downloaded from GitHub releases, it doesn't change the URLs used to access any Git repositories. + +Windows +------- + +To prefer the Espressif download server when running the ESP-IDF Tools Installer or installing tools from the command line, open the System control panel, then click on Advanced Settings. Add a new Environment Variable (of type either User or System) with the name ``IDF_GITHUB_ASSETS`` and value ``dl.espressif.com/github_assets``. Click OK once done. + +If the command line window or ESP-IDF Tools Installer window was already open before you added the new environment variable, you will need to close and reopen it. + +While this environment variable is still set, the ESP-IDF Tools Installer and the command line installer will prefer the Espressif download server. + +Linux and macOS +--------------- + +To prefer the Espressif download server when installing tools, use the following sequence of commands when running ``install.sh``: + +.. code-block:: bash + + cd ~/esp/esp-idf + export IDF_GITHUB_ASSETS="dl.espressif.com/github_assets" + ./install.sh + Customizing the tools installation path ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/tools/idf_tools.py b/tools/idf_tools.py index 87f41d9594..a9933f2c4e 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -1056,6 +1056,11 @@ def action_export(args): raise SystemExit(1) +def apply_url_mirrors(args, tool_download_obj): + apply_mirror_prefix_map(args, tool_download_obj) + apply_github_assets_option(tool_download_obj) + + def apply_mirror_prefix_map(args, tool_download_obj): """Rewrite URL for given tool_obj, given tool_version, and current platform, if --mirror-prefix-map flag or IDF_MIRROR_PREFIX_MAP environment variable is given. @@ -1083,6 +1088,32 @@ def apply_mirror_prefix_map(args, tool_download_obj): break +def apply_github_assets_option(tool_download_obj): + """ Rewrite URL for given tool_obj if the download URL is an https://github.com/ URL and the variable + IDF_GITHUB_ASSETS is set. The github.com part of the URL will be replaced. + """ + try: + github_assets = os.environ["IDF_GITHUB_ASSETS"].strip() + except KeyError: + return # no IDF_GITHUB_ASSETS + if not github_assets: # variable exists but is empty + return + + # check no URL qualifier in the mirror URL + if '://' in github_assets: + fatal("IDF_GITHUB_ASSETS shouldn't include any URL qualifier, https:// is assumed") + raise SystemExit(1) + + # Strip any trailing / from the mirror URL + github_assets = github_assets.rstrip('/') + + old_url = tool_download_obj.url + new_url = re.sub(r'^https://github.com/', 'https://{}/'.format(github_assets), old_url) + if new_url != old_url: + info('Using GitHub assets mirror for URL: {} => {}'.format(old_url, new_url)) + tool_download_obj.url = new_url + + def action_download(args): tools_info = load_tools_info() tools_spec = args.tools @@ -1125,7 +1156,7 @@ def action_download(args): tool_spec = '{}@{}'.format(tool_name, tool_version) info('Downloading {}'.format(tool_spec)) - apply_mirror_prefix_map(args, tool_obj.versions[tool_version].get_download_for_platform(platform)) + apply_url_mirrors(args, tool_obj.versions[tool_version].get_download_for_platform(platform)) tool_obj.download(tool_version) @@ -1166,7 +1197,7 @@ def action_install(args): continue info('Installing {}'.format(tool_spec)) - apply_mirror_prefix_map(args, tool_obj.versions[tool_version].get_download_for_platform(PYTHON_PLATFORM)) + apply_url_mirrors(args, tool_obj.versions[tool_version].get_download_for_platform(PYTHON_PLATFORM)) tool_obj.download(tool_version) tool_obj.install(tool_version)