Skip to content

Commit

Permalink
Merge branch 'mholo65-feature/GH-787' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
devlead committed Sep 30, 2017
2 parents 4e160fa + c6cfe2f commit dc906eb
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 40 deletions.
39 changes: 39 additions & 0 deletions src/Cake.NuGet/Install/Extensions/PackageReferenceExtensions.cs
@@ -0,0 +1,39 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Linq;
using Cake.Core.Configuration;
using Cake.Core.Packaging;

namespace Cake.NuGet.Install.Extensions
{
internal static class PackageReferenceExtensions
{
private const string LoadDependenciesKey = "loaddependencies";

public static bool ShouldLoadDependencies(this PackageReference packageReference, ICakeConfiguration config)
{
bool loadDependencies;
if (packageReference.Parameters.ContainsKey(LoadDependenciesKey))
{
bool.TryParse(packageReference.Parameters[LoadDependenciesKey].FirstOrDefault() ?? bool.TrueString, out loadDependencies);
}
else
{
bool.TryParse(config.GetValue(Constants.NuGet.LoadDependencies) ?? bool.FalseString, out loadDependencies);
}
return loadDependencies;
}

public static bool IsPrerelease(this PackageReference packageReference)
{
var isPreRelease = false;
if (packageReference.Parameters.ContainsKey("prerelease"))
{
bool.TryParse(packageReference.Parameters["prerelease"].FirstOrDefault() ?? bool.TrueString, out isPreRelease);
}
return isPreRelease;
}
}
}
14 changes: 2 additions & 12 deletions src/Cake.NuGet/Install/NuGetFolderProject.cs
Expand Up @@ -10,6 +10,7 @@
using Cake.Core.Configuration;
using Cake.Core.Diagnostics;
using Cake.Core.IO;
using Cake.NuGet.Install.Extensions;
using NuGet.Frameworks;
using NuGet.PackageManagement;
using NuGet.Packaging;
Expand Down Expand Up @@ -38,8 +39,6 @@ internal sealed class NugetFolderProject : FolderNuGetProject

public NuGetFramework TargetFramework { get; }

public GatherCache GatherCache { get; }

public NugetFolderProject(
IFileSystem fileSystem,
INuGetContentResolver contentResolver,
Expand All @@ -57,7 +56,6 @@ internal sealed class NugetFolderProject : FolderNuGetProject
_installedPackages = new HashSet<PackageIdentity>();
TargetFramework = targetFramework ?? throw new ArgumentNullException(nameof(targetFramework));
InternalMetadata[NuGetProjectMetadataKeys.TargetFramework] = TargetFramework;
GatherCache = new GatherCache();
}

public override Task<bool> InstallPackageAsync(PackageIdentity packageIdentity, DownloadResourceResult downloadResourceResult,
Expand All @@ -75,15 +73,7 @@ internal sealed class NugetFolderProject : FolderNuGetProject

public IReadOnlyCollection<IFile> GetFiles(DirectoryPath directoryPath, PackageReference packageReference, PackageType type)
{
bool loadDependencies;
if (packageReference.Parameters.ContainsKey("LoadDependencies"))
{
bool.TryParse(packageReference.Parameters["LoadDependencies"].FirstOrDefault() ?? bool.TrueString, out loadDependencies);
}
else
{
bool.TryParse(_config.GetValue(Constants.NuGet.LoadDependencies) ?? bool.FalseString, out loadDependencies);
}
var loadDependencies = packageReference.ShouldLoadDependencies(_config);

var files = new List<IFile>();
var package = _installedPackages.First(p => p.Id.Equals(packageReference.Package, StringComparison.OrdinalIgnoreCase));
Expand Down
50 changes: 22 additions & 28 deletions src/Cake.NuGet/Install/NuGetPackageInstaller.cs
Expand Up @@ -10,6 +10,7 @@
using Cake.Core.Configuration;
using Cake.Core.Diagnostics;
using Cake.Core.IO;
using Cake.NuGet.Install.Extensions;
using NuGet.Common;
using NuGet.Configuration;
using NuGet.Frameworks;
Expand All @@ -32,9 +33,9 @@ internal sealed class NuGetPackageInstaller : INuGetPackageInstaller
private readonly ICakeLog _log;
private readonly ICakeConfiguration _config;
private readonly ISettings _nugetSettings;
private readonly NuGetFramework _currentFramework;
private readonly ILogger _nugetLogger;
private readonly IDictionary<PackageType, NugetFolderProject> _projects;
private readonly NuGetFramework _currentFramework;
private readonly GatherCache _gatherCache;

/// <summary>
/// Initializes a new instance of the <see cref="NuGetPackageInstaller"/> class.
Expand Down Expand Up @@ -62,7 +63,7 @@ internal sealed class NuGetPackageInstaller : INuGetPackageInstaller
GetToolPath(),
null,
new XPlatMachineWideSetting());
_projects = new Dictionary<PackageType, NugetFolderProject>();
_gatherCache = new GatherCache();
}

public bool CanInstall(PackageReference package, PackageType type)
Expand Down Expand Up @@ -95,38 +96,36 @@ public IReadOnlyCollection<IFile> Install(PackageReference package, PackageType
return Array.Empty<IFile>();
}

if (!_projects.TryGetValue(type, out var project))
{
var pathResolver = new PackagePathResolver(packageRoot);
project = new NugetFolderProject(_fileSystem, _contentResolver, _config, _log, pathResolver, packageRoot, targetFramework);
_projects.Add(type, project);

if (!project.Root.Equals(packageRoot))
{
// This should not happen since all addins/tools are installed to same directory.
throw new ArgumentException($"Path is not same as previous package of type: {type}", nameof(path));
}
}
var pathResolver = new PackagePathResolver(packageRoot);
var project = new NugetFolderProject(_fileSystem, _contentResolver, _config, _log, pathResolver, packageRoot, targetFramework);
var packageManager = new NuGetPackageManager(sourceRepositoryProvider, _nugetSettings, project.Root)
{
PackagesFolderNuGetProject = project
};

var sourceRepositories = sourceRepositoryProvider.GetRepositories();
var includePrerelease = false;
if (package.Parameters.ContainsKey("prerelease"))
{
bool.TryParse(package.Parameters["prerelease"].FirstOrDefault() ?? bool.TrueString, out includePrerelease);
}
var resolutionContext = new ResolutionContext(DependencyBehavior.Lowest, includePrerelease, false, VersionConstraints.None, project.GatherCache);
var includePrerelease = package.IsPrerelease();
var dependencyBehavior = GetDependencyBehavior(type, package);
var resolutionContext = new ResolutionContext(dependencyBehavior, includePrerelease, false, VersionConstraints.None, _gatherCache);
var projectContext = new NuGetProjectContext(_log);

packageManager.InstallPackageAsync(project, packageIdentity, resolutionContext, projectContext,
sourceRepositories, Array.Empty<SourceRepository>(),
CancellationToken.None).Wait();

return project.GetFiles(path, package, type);
}

private DependencyBehavior GetDependencyBehavior(PackageType type, PackageReference package)
{
if (type == PackageType.Addin)
{
return package.ShouldLoadDependencies(_config) ?
DependencyBehavior.Lowest :
DependencyBehavior.Ignore;
}
return DependencyBehavior.Ignore;
}

private string GetToolPath()
{
var toolPath = _config.GetValue(Constants.Paths.Tools);
Expand All @@ -148,12 +147,7 @@ private static NuGetVersion GetNuGetVersion(PackageReference package, NuGetSourc
return new NuGetVersion(package.Parameters["version"].First());
}

var includePrerelease = false;
if (package.Parameters.ContainsKey("prerelease"))
{
bool.TryParse(package.Parameters["prerelease"].FirstOrDefault() ?? bool.TrueString, out includePrerelease);
}

var includePrerelease = package.IsPrerelease();
foreach (var sourceRepository in sourceRepositoryProvider.GetRepositories())
{
var dependencyInfoResource = sourceRepository.GetResourceAsync<DependencyInfoResource>().Result;
Expand Down

0 comments on commit dc906eb

Please sign in to comment.