Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
tapika committed Dec 27, 2022
2 parents f72e11b + 3d9cdf7 commit 2c25987
Show file tree
Hide file tree
Showing 24 changed files with 1,029 additions and 230 deletions.
39 changes: 39 additions & 0 deletions lib/NuGet-Chocolatey/src/Core/IPackageManager.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,38 @@
using System;
using System.Runtime.Versioning;

namespace NuGet
{
public enum WalkerType
{
install,
update,
uninstall
}

/// <summary>
/// Parameters for specific walker initialization.
/// </summary>
public class WalkerInfo
{
public WalkerType type;

// for install
public bool ignoreDependencies;
public bool ignoreWalkInfo = false;
public FrameworkName targetFramework = null;

// for update
public bool updateDependencies;

// for install & update
public bool allowPrereleaseVersions;

// for uninstall
public bool forceRemove;
public bool removeDependencies;
}

public interface IPackageManager
{
/// <summary>
Expand Down Expand Up @@ -35,6 +66,7 @@ public interface IPackageManager
event EventHandler<PackageOperationEventArgs> PackageUninstalled;
event EventHandler<PackageOperationEventArgs> PackageUninstalling;

IPackage FindLocalPackage(string packageId, SemanticVersion version);
void InstallPackage(IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions);
void InstallPackage(IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions, bool ignoreWalkInfo);
void InstallPackage(string packageId, SemanticVersion version, bool ignoreDependencies, bool allowPrereleaseVersions);
Expand All @@ -43,5 +75,12 @@ public interface IPackageManager
void UpdatePackage(string packageId, IVersionSpec versionSpec, bool updateDependencies, bool allowPrereleaseVersions);
void UninstallPackage(IPackage package, bool forceRemove, bool removeDependencies);
void UninstallPackage(string packageId, SemanticVersion version, bool forceRemove, bool removeDependencies);

/// <summary>
/// Creates package dependency walker
/// </summary>
/// <param name="walkerInfo">walker parameters</param>
/// <returns>walker</returns>
IPackageOperationResolver GetWalker( WalkerInfo walkerInfo );
}
}
124 changes: 88 additions & 36 deletions lib/NuGet-Chocolatey/src/Core/PackageManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -140,22 +140,14 @@ protected void InstallPackage(
bool allowPrereleaseVersions,
bool ignoreWalkInfo = false)
{
if (WhatIf)
{
// This prevents InstallWalker from downloading the packages
ignoreWalkInfo = true;
}
var installerWalker = GetWalker( new WalkerInfo {
type = WalkerType.install,
ignoreDependencies = ignoreDependencies,
allowPrereleaseVersions = allowPrereleaseVersions,
ignoreWalkInfo = ignoreWalkInfo,
targetFramework = targetFramework
} );

var installerWalker = new InstallWalker(
LocalRepository, SourceRepository,
targetFramework, Logger,
ignoreDependencies, allowPrereleaseVersions,
DependencyVersion)
{
DisableWalkInfo = ignoreWalkInfo,
CheckDowngrade = CheckDowngrade,
SkipPackageTargetCheck = SkipPackageTargetCheck
};
Execute(package, installerWalker);
}

Expand All @@ -176,7 +168,7 @@ private void Execute(IPackage package, IPackageOperationResolver resolver)
}
}

protected void Execute(PackageOperation operation)
public void Execute(PackageOperation operation)
{
bool packageExists = LocalRepository.Exists(operation.Package);

Expand Down Expand Up @@ -293,7 +285,7 @@ public void UninstallPackage(string packageId, SemanticVersion version, bool for
UninstallPackage(packageId, version: version, forceRemove: forceRemove, removeDependencies: false);
}

public virtual void UninstallPackage(string packageId, SemanticVersion version, bool forceRemove, bool removeDependencies)
public IPackage FindLocalPackage(string packageId, SemanticVersion version)
{
if (String.IsNullOrEmpty(packageId))
{
Expand All @@ -309,7 +301,13 @@ public virtual void UninstallPackage(string packageId, SemanticVersion version,
NuGetResources.UnknownPackage, packageId));
}

UninstallPackage(package, forceRemove, removeDependencies);
return package;
}

public virtual void UninstallPackage(string packageId, SemanticVersion version, bool forceRemove, bool removeDependencies)
{

UninstallPackage(FindLocalPackage(packageId, version), forceRemove, removeDependencies);
}

public void UninstallPackage(IPackage package)
Expand All @@ -324,15 +322,11 @@ public void UninstallPackage(IPackage package, bool forceRemove)

public virtual void UninstallPackage(IPackage package, bool forceRemove, bool removeDependencies)
{
Execute(package, new UninstallWalker(LocalRepository,
new DependentsWalker(LocalRepository, targetFramework: null),
targetFramework: null,
logger: Logger,
removeDependencies: removeDependencies,
forceRemove: forceRemove)
{
DisableWalkInfo = WhatIf
});
Execute(package, GetWalker( new WalkerInfo() {
type = WalkerType.uninstall,
forceRemove = forceRemove,
removeDependencies = removeDependencies
}) );
}

protected virtual void ExecuteUninstall(IPackage package)
Expand Down Expand Up @@ -473,16 +467,74 @@ internal void UpdatePackage(string packageId, Func<IPackage> resolvePackage, boo

public void UpdatePackage(IPackage newPackage, bool updateDependencies, bool allowPrereleaseVersions)
{
Execute(newPackage, new UpdateWalker(LocalRepository,
SourceRepository,
new DependentsWalker(LocalRepository, targetFramework: null),
NullConstraintProvider.Instance,
targetFramework: null,
logger: Logger,
updateDependencies: updateDependencies,
allowPrereleaseVersions: allowPrereleaseVersions));
var upgradeWalker = GetWalker( new WalkerInfo() {
type = WalkerType.update,
updateDependencies = updateDependencies,
allowPrereleaseVersions = allowPrereleaseVersions
});

Execute(newPackage, upgradeWalker);
}

public IPackageOperationResolver GetWalker( WalkerInfo walkinfo )
{
switch (walkinfo.type)
{
case WalkerType.install:
{
if (WhatIf)
{
// This prevents InstallWalker from downloading the packages
walkinfo.ignoreWalkInfo = true;
}

var installerWalker = new InstallWalker(
LocalRepository, SourceRepository,
walkinfo.targetFramework, Logger,
walkinfo.ignoreDependencies, walkinfo.allowPrereleaseVersions,
DependencyVersion)
{
DisableWalkInfo = walkinfo.ignoreWalkInfo,
CheckDowngrade = CheckDowngrade,
SkipPackageTargetCheck = SkipPackageTargetCheck
};

return installerWalker;
}

case WalkerType.update:
{
return new UpdateWalker(LocalRepository,
SourceRepository,
new DependentsWalker(LocalRepository, targetFramework: null),
NullConstraintProvider.Instance,
targetFramework: null,
logger: Logger,
updateDependencies: walkinfo.updateDependencies,
allowPrereleaseVersions: walkinfo.allowPrereleaseVersions);
}

case WalkerType.uninstall:
{
var uninstallWalker = new UninstallWalker(LocalRepository,
new DependentsWalker(LocalRepository, targetFramework: null),
targetFramework: null,
logger: Logger,
removeDependencies: walkinfo.removeDependencies,
forceRemove: walkinfo.forceRemove)
{
DisableWalkInfo = WhatIf
};

return uninstallWalker;
}
}

return null;
}

public bool CheckDowngrade { get; set; }
}
}

}

43 changes: 43 additions & 0 deletions lib/NuGet-Chocolatey/src/Core/Packages/PackageTags.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

Expand Down Expand Up @@ -40,6 +41,48 @@ public static string GetKey(this IPackage pack, string key)
return value;
}

/// <summary>
/// Gets all key value pairs from package
/// </summary>
/// <param name="pack">package to query</param>
/// <returns>Dictionary of items</returns>
public static Dictionary<string, string> GetKeyValuePairs(this IPackage pack, Func<string, bool> matcher = null)
{
Dictionary<string, string> d = new Dictionary<string, string>();

if (matcher == null)
{
matcher = (key) => { return true; };
}

if (pack.TagsExtra != null)
{
foreach (var tag in pack.TagsExtra)
{
if (matcher(tag.Key))
{
d[tag.Key] = tag.Value;
}
}
}
else
{
var lines = pack.Tags.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

var keyValuePairs = lines.
Select(x => reSplitEqual.Match(x)).
Where(m => m.Success && matcher(m.Groups[1].Value)).
Select(m => (m.Groups[1].Value, Uri.UnescapeDataString(m.Groups[2].Value)));

foreach (var kvPair in keyValuePairs)
{
d[kvPair.Item1] = kvPair.Item2;
}
}

return d;
}

public static string GetInstallLocation(this IPackage pack)
{
return GetKey(pack, "InstallLocation");
Expand Down
Loading

0 comments on commit 2c25987

Please sign in to comment.