Skip to content

Commit

Permalink
Reuse package information for unique packages (#50)
Browse files Browse the repository at this point in the history
  • Loading branch information
dfederm authored Aug 8, 2024
1 parent 2b57d8e commit f0f9ba4
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,53 +2,37 @@
//
// Licensed under the MIT license.

using Microsoft.Build.Construction;
using NuGet.Frameworks;
using NuGet.Packaging;
using NuGet.Packaging.Core;
using NuGet.Versioning;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace PackagesConfigConverter
{
internal class PackageReference : NuGet.Packaging.PackageReference
internal sealed class PackageInfo
{
private IReadOnlyCollection<string> _installedPackageFolderNames;

public PackageReference(PackageIdentity identity, NuGetFramework targetFramework, bool userInstalled, bool developmentDependency, bool requireReinstallation, VersionRange allowedVersions, PackagePathResolver packagePathResolver, VersionFolderPathResolver versionFolderPathResolver)
: base(identity, targetFramework, userInstalled, developmentDependency, requireReinstallation, allowedVersions)
public PackageInfo(PackageIdentity identity, PackagePathResolver packagePathResolver, VersionFolderPathResolver versionFolderPathResolver)
{
InstalledPackageFilePath = PackagePathHelper.GetInstalledPackageFilePath(PackageIdentity, packagePathResolver ?? throw new ArgumentNullException(nameof(packagePathResolver)));
Identity = identity;

InstalledPackageFilePath = PackagePathHelper.GetInstalledPackageFilePath(Identity, packagePathResolver ?? throw new ArgumentNullException(nameof(packagePathResolver)));

RepositoryInstalledPath = Path.GetDirectoryName(InstalledPackageFilePath);

GlobalInstalledPath = Path.GetFullPath(versionFolderPathResolver.GetInstallPath(identity.Id, identity.Version));
}

public IEnumerable<ProjectElement> AllElements => AnalyzerItems.Cast<ProjectElement>().Concat(AssemblyReferences).Concat(Imports);

public List<ProjectItemElement> AnalyzerItems { get; } = new ();

public List<ProjectItemElement> AssemblyReferences { get; } = new ();

public bool GeneratePathProperty { get; set; }

public string GlobalInstalledPath { get; }

public List<ProjectImportElement> Imports { get; } = new ();

public string InstalledPackageFilePath { get; }

public IReadOnlyCollection<string> InstalledPackageFolderNames => _installedPackageFolderNames ??= GetPackageFolderNames();

public bool IsMissingTransitiveDependency { get; set; }

public string PackageId => PackageIdentity.Id;

public NuGetVersion PackageVersion => PackageIdentity.Version;
public PackageIdentity Identity { get; }

public string RepositoryInstalledPath { get; }

Expand Down Expand Up @@ -91,4 +75,4 @@ static bool HasAnyRealFiles(string dir)
}
}
}
}
}
25 changes: 25 additions & 0 deletions src/PackagesConfigConverter/PackageInfoFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Copyright (c) Jeff Kluge. All rights reserved.
//
// Licensed under the MIT license.

using NuGet.Packaging;
using NuGet.Packaging.Core;
using System.Collections.Concurrent;

namespace PackagesConfigConverter
{
internal sealed class PackageInfoFactory
{
private readonly PackagePathResolver _packagePathResolver;
private readonly VersionFolderPathResolver _versionFolderPathResolver;
private readonly ConcurrentDictionary<PackageIdentity, PackageInfo> _packages = new ();

public PackageInfoFactory(PackagePathResolver packagePathResolver, VersionFolderPathResolver versionFolderPathResolver)
{
_packagePathResolver = packagePathResolver;
_versionFolderPathResolver = versionFolderPathResolver;
}

public PackageInfo GetPackageInfo(PackageIdentity identity) => _packages.GetOrAdd(identity, id => new PackageInfo(id, _packagePathResolver, _versionFolderPathResolver));
}
}
42 changes: 42 additions & 0 deletions src/PackagesConfigConverter/PackageUsage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// Copyright (c) Jeff Kluge. All rights reserved.
//
// Licensed under the MIT license.

using CommandLine;
using Microsoft.Build.Construction;
using NuGet.Packaging.Core;
using NuGet.Versioning;
using System.Collections.Generic;
using System.Linq;

namespace PackagesConfigConverter
{
internal sealed class PackageUsage
{
public PackageUsage(PackageIdentity identity, PackageInfo packageInfo, bool isDevelopmentDependency)
{
PackageInfo = packageInfo;
IsDevelopmentDependency = isDevelopmentDependency;
}

public PackageInfo PackageInfo { get; }

public bool IsDevelopmentDependency { get; }

public IEnumerable<ProjectElement> AllElements => AnalyzerItems.Cast<ProjectElement>().Concat(AssemblyReferences).Concat(Imports);

public List<ProjectItemElement> AnalyzerItems { get; } = new ();

public List<ProjectItemElement> AssemblyReferences { get; } = new ();

public List<ProjectImportElement> Imports { get; } = new ();

public bool GeneratePathProperty { get; set; }

public bool IsMissingTransitiveDependency { get; set; }

public string PackageId => PackageInfo.Identity.Id;

public NuGetVersion PackageVersion => PackageInfo.Identity.Version;
}
}
Loading

0 comments on commit f0f9ba4

Please sign in to comment.