| # Copyright 2023 The Bazel Authors. All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| |
| def split_url(url): |
| protocol = url[:url.find("://")] |
| url_without_protocol = url[url.find("://") + 3:] |
| url_parts = url_without_protocol.split("/") |
| return protocol, url_parts |
| |
| _REMOTE_SCHEMES = [ |
| "ftp", |
| "http", |
| "https", |
| ] |
| |
| def scheme_and_host(url): |
| if not url: |
| return None |
| |
| new_url = remove_auth_from_url(url) |
| (protocol, url_parts) = split_url(new_url) |
| return protocol + "://" + url_parts[0] |
| |
| def remove_auth_from_url(url): |
| """Returns url without `user:pass@` or `user@`.""" |
| if "@" not in url: |
| return url |
| protocol, url_parts = split_url(url) |
| host = url_parts[0] |
| if "@" not in host: |
| return url |
| last_index = host.rfind("@", 0, None) |
| userless_host = host[last_index + 1:] |
| new_url = "{}://{}".format(protocol, "/".join([userless_host] + url_parts[1:])) |
| return new_url |
| |
| def extract_netrc_from_auth_url(url): |
| """Return a dict showing the netrc machine, login, and password extracted from a url. |
| |
| Returns: |
| A dict that is empty if there were no credentials in the url. |
| A dict that has three keys -- machine, login, password -- with their respective values. These values should be |
| what is needed for the netrc entry of the same name except for password whose value may be empty meaning that |
| there is no password for that login. |
| """ |
| if "@" not in url: |
| return {} |
| protocol, url_parts = split_url(url) |
| login_password_host = url_parts[0] |
| if "@" not in login_password_host: |
| return {} |
| login_password, host = login_password_host.rsplit("@", 1) |
| login_password_split = login_password.split(":", 1) |
| login = login_password_split[0] |
| |
| # If password is not provided, then this will be a 1-length split |
| if len(login_password_split) < 2: |
| password = None |
| else: |
| password = login_password_split[1] |
| if not host: |
| fail("Got a blank host from: {}".format(url)) |
| if not login: |
| fail("Got a blank login from: {}".format(url)) |
| |
| # Do not fail for blank password since that is sometimes a thing |
| return { |
| "machine": host, |
| "login": login, |
| "password": password, |
| } |
| |
| def _is_windows(repository_os): |
| return repository_os.name.find("windows") != -1 |
| |
| def get_m2local_url(repo_os, path_func, artifact): |
| if _is_windows(repo_os): |
| user_home = repo_os.environ.get("USERPROFILE").replace("\\", "/") |
| else: |
| user_home = repo_os.environ.get("HOME") |
| |
| local_path = artifact["file"] |
| |
| if not local_path: |
| # In theory, we could calculate a path, but I'm not entirely sure how we would even get here with a recent |
| # version of the lock file |
| return None |
| |
| if not local_path.startswith("/"): |
| local_path = "%s/.m2/repository/%s" % (user_home, local_path) |
| |
| path = path_func(local_path) |
| if path.exists: |
| return "file://%s" % local_path |
| return None |