def test_parse_subdirectory(): # Make sure the parsing works as intended. test_uri = "uri#subdirectory" parsed_uri, parsed_subdirectory = _parse_subdirectory(test_uri) assert parsed_uri == "uri" assert parsed_subdirectory == "subdirectory" # Make sure periods are restricted in Git repo subdirectory paths. period_fail_uri = GIT_PROJECT_URI + "#.." with pytest.raises(ExecutionException): _parse_subdirectory(period_fail_uri)
def _fetch_project(uri, force_tempdir, version=None): """ Fetch a project into a local directory, returning the path to the local project directory. :param force_tempdir: If True, will fetch the project into a temporary directory. Otherwise, will fetch ZIP or Git projects into a temporary directory but simply return the path of local projects (i.e. perform a no-op for local projects). """ parsed_uri, subdirectory = _parse_subdirectory(uri) use_temp_dst_dir = force_tempdir or _is_zip_uri(parsed_uri) or not _is_local_uri(parsed_uri) dst_dir = tempfile.mkdtemp() if use_temp_dst_dir else parsed_uri if use_temp_dst_dir: _logger.info("=== Fetching project from %s into %s ===", uri, dst_dir) if _is_zip_uri(parsed_uri): if _is_file_uri(parsed_uri): parsed_file_uri = urllib.parse.urlparse(urllib.parse.unquote(parsed_uri)) parsed_uri = os.path.join(parsed_file_uri.netloc, parsed_file_uri.path) _unzip_repo(zip_file=( parsed_uri if _is_local_uri(parsed_uri) else _fetch_zip_repo(parsed_uri)), dst_dir=dst_dir) elif _is_local_uri(uri): if version is not None: raise ExecutionException("Setting a version is only supported for Git project URIs") if use_temp_dst_dir: dir_util.copy_tree(src=parsed_uri, dst=dst_dir) else: assert _GIT_URI_REGEX.match(parsed_uri), "Non-local URI %s should be a Git URI" % parsed_uri _fetch_git_repo(parsed_uri, version, dst_dir) res = os.path.abspath(os.path.join(dst_dir, subdirectory)) if not os.path.exists(res): raise ExecutionException("Could not find subdirectory %s of %s" % (subdirectory, dst_dir)) return res