/// <summary> /// Download one Cocoapods package and extract it to the target directory. /// </summary> /// <param name="purl"> Package URL of the package to download. </param> /// <returns> n/a </returns> public override async Task <IEnumerable <string> > DownloadVersion(PackageURL purl, bool doExtract, bool cached = false) { Logger.Trace("DownloadVersion {0}", purl?.ToString()); var packageName = purl?.Name; var packageVersion = purl?.Version; var fileName = purl?.ToStringFilename(); var downloadedPaths = new List <string>(); if (string.IsNullOrWhiteSpace(packageName) || string.IsNullOrWhiteSpace(packageVersion) || string.IsNullOrWhiteSpace(fileName)) { Logger.Debug("Error with 'purl' argument. Unable to download [{0} {1}] @ {2}. Both must be defined.", packageName, packageVersion, fileName); return(downloadedPaths); } var prefix = GetCocoapodsPrefix(packageName); var podspec = await GetJsonCache($"{ENV_COCOAPODS_SPECS_RAW_ENDPOINT}/Specs/{prefix}/{packageName}/{packageVersion}/{packageName}.podspec.json"); if (podspec.RootElement.TryGetProperty("source", out var source)) { string?url = null; if (source.TryGetProperty("git", out var sourceGit) && source.TryGetProperty("tag", out var sourceTag)) { var sourceGitString = sourceGit.GetString(); var sourceTagString = sourceTag.GetString(); if (!string.IsNullOrWhiteSpace(sourceGitString) && sourceGitString.EndsWith(".git")) { sourceGitString = sourceGitString[0..^ 4];
/// <summary> /// Download one Cargo package and extract it to the target directory. /// </summary> /// <param name="purl"> Package URL of the package to download. </param> /// <returns> Path to the downloaded package </returns> public override async Task <IEnumerable <string> > DownloadVersion(PackageURL purl, bool doExtract, bool cached = false) { Logger.Trace("DownloadVersion {0}", purl?.ToString()); var packageName = purl?.Name; var packageVersion = purl?.Version; var fileName = purl?.ToStringFilename(); var downloadedPaths = new List <string>(); if (string.IsNullOrWhiteSpace(packageName) || string.IsNullOrWhiteSpace(packageVersion) || string.IsNullOrWhiteSpace(fileName)) { Logger.Debug("Error with 'purl' argument. Unable to download [{0} {1}] @ {2}. Both must be defined.", packageName, packageVersion, fileName); return(downloadedPaths); } var url = $"{ENV_CARGO_ENDPOINT}/api/v1/crates/{packageName}/{packageVersion}/download"; try { string targetName = $"cargo-{fileName}"; string extractionPath = Path.Combine(TopLevelExtractionDirectory, targetName); // if the cache is already present, no need to extract if (doExtract && cached && Directory.Exists(extractionPath)) { downloadedPaths.Add(extractionPath); return(downloadedPaths); } Logger.Debug("Downloading {0}", url); var result = await WebClient.GetAsync(url); result.EnsureSuccessStatusCode(); if (doExtract) { downloadedPaths.Add(await ExtractArchive(targetName, await result.Content.ReadAsByteArrayAsync(), cached)); } else { extractionPath += Path.GetExtension(url) ?? ""; await File.WriteAllBytesAsync(extractionPath, await result.Content.ReadAsByteArrayAsync()); downloadedPaths.Add(extractionPath); } } catch (Exception ex) { Logger.Debug(ex, "Error downloading Cargo package: {0}", ex.Message); } return(downloadedPaths); }