Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/Weikio.NugetDownloader.sln
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ VisualStudioVersion = 16.0.30413.136
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.NugetDownloader", "Weikio.NugetDownloader\Weikio.NugetDownloader.csproj", "{4BCDAB59-F231-4241-B6BE-93BDC047C86F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D712A662-C87A-433F-B3BC-2E5DB5EAB0A5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.NugetDownloader.Tests", "..\tests\integration\Weikio.NugetDownloader.Tests\Weikio.NugetDownloader.Tests.csproj", "{09606C73-4CAE-4069-9B74-A623F7957E4F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -15,10 +19,17 @@ Global
{4BCDAB59-F231-4241-B6BE-93BDC047C86F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4BCDAB59-F231-4241-B6BE-93BDC047C86F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4BCDAB59-F231-4241-B6BE-93BDC047C86F}.Release|Any CPU.Build.0 = Release|Any CPU
{09606C73-4CAE-4069-9B74-A623F7957E4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{09606C73-4CAE-4069-9B74-A623F7957E4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{09606C73-4CAE-4069-9B74-A623F7957E4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{09606C73-4CAE-4069-9B74-A623F7957E4F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{09606C73-4CAE-4069-9B74-A623F7957E4F} = {D712A662-C87A-433F-B3BC-2E5DB5EAB0A5}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {69466E23-050E-41B5-945E-367A476EF6CB}
EndGlobalSection
Expand Down
118 changes: 38 additions & 80 deletions src/Weikio.NugetDownloader/NugetDownloader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,30 +33,14 @@ public NuGetDownloader(ILogger logger = null)
public async Task<string[]> DownloadAsync(string packageFolder, string packageName, string packageVersion = null, bool includePrerelease = false,
NuGetFeed packageFeed = null, bool onlyDownload = false)
{
if (!Directory.Exists(packageFolder))
{
Directory.CreateDirectory(packageFolder);
}
IPackageSearchMetadata package = null;
SourceRepository sourceRepo = null;

var providers = GetNugetResourceProviders();
var settings = Settings.LoadDefaultSettings(packageFolder, null, new MachineWideSettings());
var packageSourceProvider = new PackageSourceProvider(settings);
var sourceRepositoryProvider = new SourceRepositoryProvider(packageSourceProvider, providers);

var dotNetFramework = Assembly
.GetEntryAssembly()
.GetCustomAttribute<TargetFrameworkAttribute>()?
.FrameworkName;

var frameworkNameProvider = new FrameworkNameProvider(
new[] { DefaultFrameworkMappings.Instance },
new[] { DefaultPortableFrameworkMappings.Instance });

var nuGetFramework = NuGetFramework.ParseFrameworkName(dotNetFramework, frameworkNameProvider);

IPackageSearchMetadata package = null;
SourceRepository sourceRepo = null;

if (!string.IsNullOrWhiteSpace(packageFeed?.Feed))
{
sourceRepo = GetSourceRepo(packageFeed, providers);
Expand Down Expand Up @@ -88,50 +72,7 @@ public async Task<string[]> DownloadAsync(string packageFolder, string packageNa
throw new PackageNotFoundException($"Couldn't find package '{packageVersion}'.{packageVersion}.");
}

var project = new PluginFolderNugetProject(packageFolder, package, nuGetFramework, onlyDownload);
var packageManager = new NuGetPackageManager(sourceRepositoryProvider, settings, packageFolder) { PackagesFolderNuGetProject = project };

var clientPolicyContext = ClientPolicyContext.GetClientPolicy(settings, _logger);

var projectContext = new FolderProjectContext(_logger)
{
PackageExtractionContext = new PackageExtractionContext(
PackageSaveMode.Defaultv2,
PackageExtractionBehavior.XmlDocFileSaveMode,
clientPolicyContext,
_logger)
};

var resolutionContext = new ResolutionContext(
DependencyBehavior.Lowest,
includePrerelease,
includeUnlisted: false,
VersionConstraints.None);

var downloadContext = new PackageDownloadContext(
resolutionContext.SourceCacheContext,
packageFolder,
resolutionContext.SourceCacheContext.DirectDownload);

// We are waiting here instead of await as await actually doesn't seem to work correctly.
packageManager.InstallPackageAsync(
project,
package.Identity,
resolutionContext,
projectContext,
downloadContext,
sourceRepo,
new List<SourceRepository>(),
CancellationToken.None).Wait();

if (onlyDownload)
{
var versionFolder = Path.Combine(packageFolder, package.Identity.ToString());

return Directory.GetFiles(versionFolder, "*.*", SearchOption.AllDirectories);
}

return await project.GetPluginAssemblyFilesAsync();
return await DownloadAsync(package, sourceRepo, packageFolder, onlyDownload);
}

public async Task<string[]> DownloadAsync(IPackageSearchMetadata packageIdentity, SourceRepository repository,
Expand Down Expand Up @@ -194,9 +135,14 @@ await packageManager.InstallPackageAsync(
new List<SourceRepository>(),
CancellationToken.None);

var versionFolder = Path.Combine(downloadFolder, packageIdentity.Identity.ToString());
if (onlyDownload)
{
var versionFolder = Path.Combine(downloadFolder, packageIdentity.Identity.ToString());

return Directory.GetFiles(versionFolder, "*.*", SearchOption.AllDirectories);
return Directory.GetFiles(versionFolder, "*.*", SearchOption.AllDirectories);
}

return await project.GetPluginAssemblyFilesAsync();
}

private static List<Lazy<INuGetResourceProvider>> GetNugetResourceProviders()
Expand Down Expand Up @@ -252,19 +198,40 @@ private static SourceRepository GetSourceRepo(NuGetFeed packageFeed, List<Lazy<I

var repositories = sourceRepositoryProvider.GetRepositories();

var packages = GetPackages(searchTerm, maxResults, includePrerelease, repositories);

await foreach (var package in packages)
{
yield return package;
}
}

private async IAsyncEnumerable<(SourceRepository Repository, IPackageSearchMetadata Package)> GetPackages(string searchTerm,
int maxResults, bool includePrerelease, IEnumerable<SourceRepository> repositories)
{
foreach (var repository in repositories)
{
var packageSearchResource = await repository.GetResourceAsync<PackageSearchResource>();
PackageSearchResource packageSearchResource;

try
{
packageSearchResource = await repository.GetResourceAsync<PackageSearchResource>();
}
catch (FatalProtocolException ex)
{
_logger.LogError($"Failed to download package search resource: {ex}");
continue;
}

SearchFilter searchFilter;

if (includePrerelease)
{
searchFilter = new SearchFilter(includePrerelease, SearchFilterType.IsAbsoluteLatestVersion);
searchFilter = new SearchFilter(true, SearchFilterType.IsAbsoluteLatestVersion);
}
else
{
searchFilter = new SearchFilter(includePrerelease);
searchFilter = new SearchFilter(false);
}

var items = await packageSearchResource.SearchAsync(searchTerm, searchFilter, 0, maxResults, _logger, CancellationToken.None);
Expand All @@ -276,28 +243,19 @@ private static SourceRepository GetSourceRepo(NuGetFeed packageFeed, List<Lazy<I
}
}

public async Task<IEnumerable<(SourceRepository Repository, IPackageSearchMetadata Package)>> SearchPackagesAsync(NuGetFeed packageFeed,
public async IAsyncEnumerable<(SourceRepository Repository, IPackageSearchMetadata Package)> SearchPackagesAsync(NuGetFeed packageFeed,
string searchTerm, int maxResults = 128,
bool includePrerelease = false)
{
var providers = GetNugetResourceProviders();
var sourceRepo = GetSourceRepo(packageFeed, providers);
var packageSearchResource = await sourceRepo.GetResourceAsync<PackageSearchResource>();

SearchFilter searchFilter;
var packages = GetPackages(searchTerm, maxResults, includePrerelease, new List<SourceRepository> { sourceRepo });

if (includePrerelease)
await foreach (var package in packages)
{
searchFilter = new SearchFilter(includePrerelease, SearchFilterType.IsAbsoluteLatestVersion);
yield return package;
}
else
{
searchFilter = new SearchFilter(includePrerelease);
}

var packages = await packageSearchResource.SearchAsync(searchTerm, searchFilter, 0, maxResults, _logger, CancellationToken.None);

return packages.Select(x => (sourceRepo, x));
}

private async Task<IPackageSearchMetadata> SearchPackageAsync(string packageName, string version, bool includePrerelease,
Expand Down
Loading