Skip to content

Commit

Permalink
Caching the parsed NugetVersion and VersionRange objects.
Browse files Browse the repository at this point in the history
  • Loading branch information
jgonz120 committed Jan 11, 2024
1 parent 4602b44 commit a240062
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ private static LibraryDependency ReadLibraryDependency(ref Utf8JsonStreamReader
{
try
{
dependencyVersionRange = VersionRange.Parse(dependencyVersionValue);
dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue);
}
catch (Exception ex)
{
Expand Down Expand Up @@ -486,7 +486,7 @@ private static void ReadDependencies(
var versionPropValue = jsonReader.GetString();
try
{
versionOverride = VersionRange.Parse(versionPropValue);
versionOverride = JsonUtility.ParseVersionRange(versionPropValue);
}
catch (Exception ex)
{
Expand Down Expand Up @@ -515,7 +515,7 @@ private static void ReadDependencies(
{
try
{
dependencyVersionRange = VersionRange.Parse(dependencyVersionValue);
dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue);
}
catch (Exception ex)
{
Expand Down Expand Up @@ -625,7 +625,7 @@ private static void ReadCentralPackageVersions(
throw FileFormatException.Create("The version cannot be null or empty.", filePath);
}

centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, VersionRange.Parse(version));
centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, JsonUtility.ParseVersionRange(version));
}
}
}
Expand Down Expand Up @@ -732,7 +732,7 @@ private static void ReadDownloadDependencies(

try
{
VersionRange version = VersionRange.Parse(singleVersionValue);
VersionRange version = JsonUtility.ParseVersionRange(singleVersionValue);

downloadDependencies.Add(new DownloadDependency(name, version));
}
Expand Down Expand Up @@ -1489,7 +1489,7 @@ private static RuntimeDependencySet ReadRuntimeDependencySet(ref Utf8JsonStreamR
var propertyName = jsonReader.GetString();
dependencies ??= [];

var dependency = new RuntimePackageDependency(propertyName, VersionRange.Parse(jsonReader.ReadNextTokenAsString()));
var dependency = new RuntimePackageDependency(propertyName, JsonUtility.ParseVersionRange(jsonReader.ReadNextTokenAsString()));

dependencies.Add(dependency);
}
Expand Down
12 changes: 6 additions & 6 deletions src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ private static void ReadCentralPackageVersions(
filePath);
}

centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, VersionRange.Parse(version));
centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, JsonUtility.ParseVersionRange(version));
});
}

Expand Down Expand Up @@ -449,7 +449,7 @@ private static void ReadDependencies(
{
try
{
versionOverride = VersionRange.Parse((string)jsonReader.Value);
versionOverride = JsonUtility.ParseVersionRange((string)jsonReader.Value);
}
catch (Exception ex)
{
Expand Down Expand Up @@ -478,7 +478,7 @@ private static void ReadDependencies(
{
try
{
dependencyVersionRange = VersionRange.Parse(dependencyVersionValue);
dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue);
}
catch (Exception ex)
{
Expand Down Expand Up @@ -620,7 +620,7 @@ internal static void ReadCentralTransitiveDependencyGroup(
{
try
{
dependencyVersionRange = VersionRange.Parse(dependencyVersionValue);
dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue);
}
catch (Exception ex)
{
Expand Down Expand Up @@ -737,7 +737,7 @@ private static void ReadDownloadDependencies(
{
try
{
VersionRange version = VersionRange.Parse(singleVersionValue);
VersionRange version = JsonUtility.ParseVersionRange(singleVersionValue);

downloadDependencies.Add(new DownloadDependency(name, version));
}
Expand Down Expand Up @@ -1502,7 +1502,7 @@ static RuntimeDependencySet ReadRuntimeDependencySet(JsonTextReader jsonReader,
{
dependencies ??= new List<RuntimePackageDependency>();

var dependency = new RuntimePackageDependency(propertyName, VersionRange.Parse(jsonReader.ReadNextTokenAsString()));
var dependency = new RuntimePackageDependency(propertyName, JsonUtility.ParseVersionRange(jsonReader.ReadNextTokenAsString()));

dependencies.Add(dependency);
});
Expand Down
36 changes: 35 additions & 1 deletion src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ namespace NuGet.ProjectModel
{
internal static class JsonUtility
{
private static readonly Dictionary<string, NuGetVersion> NuGetVersionCache = new();
private static readonly Dictionary<string, VersionRange> VersionRangeCache = new();

internal const string NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING = nameof(NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING);
internal static bool? UseNewtonsoftJson = null;
internal static readonly char[] PathSplitChars = new[] { LockFile.DirectorySeparatorChar };
Expand Down Expand Up @@ -57,7 +60,7 @@ internal static PackageDependency ReadPackageDependency(string property, JToken
var versionStr = json.Value<string>();
return new PackageDependency(
property,
versionStr == null ? null : VersionRange.Parse(versionStr));
versionStr == null ? null : JsonUtility.ParseVersionRange(versionStr));
}

internal static bool UseNewstonSoftJsonForParsing(IEnvironmentVariableReader environmentVariableReader, bool bypassCache)
Expand Down Expand Up @@ -167,5 +170,36 @@ internal static JToken WriteString(string item)
{
return item != null ? new JValue(item) : JValue.CreateNull();
}

internal static NuGetVersion ParseNugetVersion(string value)
{
if (!NuGetVersionCache.ContainsKey(value))
{
var result = NuGetVersion.Parse(value);
NuGetVersionCache[value] = result;
}
return NuGetVersionCache[value];
}

internal static bool TryParseNugetVersion(string value, out NuGetVersion version)
{
if (!NuGetVersionCache.ContainsKey(value))
{
_ = NuGetVersion.TryParse(value, out version);
NuGetVersionCache[value] = version;
}
version = NuGetVersionCache[value];
return version is not null;
}

internal static VersionRange ParseVersionRange(string value)
{
if (!VersionRangeCache.ContainsKey(value))
{
var result = VersionRange.Parse(value);
VersionRangeCache[value] = result;
}
return VersionRangeCache[value];
}
}
}
6 changes: 3 additions & 3 deletions src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public LockFile Read(Stream stream, ILogger log, string path)

internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader, bool bypassCache = false)
{
if (JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache))
if (!JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache))
{
return Utf8JsonRead(stream, log, path);
}
Expand Down Expand Up @@ -284,7 +284,7 @@ private static LockFileLibrary ReadLibrary(string property, JToken json)
library.Name = parts[0];
if (parts.Length == 2)
{
library.Version = NuGetVersion.Parse(parts[1]);
library.Version = JsonUtility.ParseNugetVersion(parts[1]);
}

library.Type = ReadString(json[TypeProperty]);
Expand Down Expand Up @@ -560,7 +560,7 @@ private static LockFileTargetLibrary ReadTargetLibrary(string property, JToken j
else
{
library.Name = property.Substring(0, slashIndex);
library.Version = NuGetVersion.Parse(property.Substring(slashIndex + 1));
library.Version = JsonUtility.ParseNugetVersion(property.Substring(slashIndex + 1));
}

var jObject = json as JObject;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public LockFileLibrary Read(ref Utf8JsonStreamReader reader)
lockFileLibrary.Name = name;
if (!string.IsNullOrWhiteSpace(version))
{
lockFileLibrary.Version = NuGetVersion.Parse(version);
lockFileLibrary.Version = JsonUtility.ParseNugetVersion(version);
}

reader.Read();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader)
var propertyName = reader.GetString();
var (targetLibraryName, version) = propertyName.SplitInTwo('/');
lockFileTargetLibrary.Name = targetLibraryName;
lockFileTargetLibrary.Version = version is null ? null : NuGetVersion.Parse(version);
lockFileTargetLibrary.Version = version is null ? null : JsonUtility.ParseNugetVersion(version);

reader.Read();
if (reader.TokenType != JsonTokenType.StartObject)
Expand Down Expand Up @@ -151,7 +151,7 @@ private IList<PackageDependency> ReadPackageDependencyList(ref Utf8JsonStreamRea

packageDependencies.Add(new PackageDependency(
propertyName,
versionString == null ? null : VersionRange.Parse(versionString)));
versionString == null ? null : JsonUtility.ParseVersionRange(versionString)));
}
return packageDependencies;
}
Expand Down
4 changes: 2 additions & 2 deletions src/NuGet.Core/NuGet.ProjectModel/PackageSpecUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static NuGetVersion SpecifySnapshot(string version, string snapshotValue)
}
}

return NuGetVersion.Parse(version);
return JsonUtility.ParseNugetVersion(version);
}

/// <summary>
Expand All @@ -44,7 +44,7 @@ public static bool IsSnapshotVersion(string version)
{
// Verify the version is valid
NuGetVersion parsed = null;
return NuGetVersion.TryParse(version.Substring(0, version.Length - 2), out parsed);
return JsonUtility.TryParseNugetVersion(version.Substring(0, version.Length - 2), out parsed);
}

return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2384,7 +2384,7 @@ public void LockFileFormat_WritesCentralTransitiveDependencyGroups()
Assert.Equal(expected.ToString(), output.ToString());
}

private LockFile Read(string filePath, IEnvironmentVariableReader environmentVariableReader)
public static LockFile Read(string filePath, IEnvironmentVariableReader environmentVariableReader)
{
var reader = new LockFileFormat();
using (var stream = File.OpenRead(filePath))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,25 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Collections.Generic;
using NuGet.Common;
using Test.Utility;

namespace NuGet.ProjectModel
namespace NuGet.ProjectModel.Test
{
public class LockFileParsingEnvironmentVariable
{
public static readonly IEnvironmentVariableReader UseNjForProcessingEnvironmentVariable = new TestEnvironmentVariableReader(
new Dictionary<string, string>()
{
["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString
}, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true");

public static readonly IEnvironmentVariableReader UseStjForProcessingEnvironmentVariable = new TestEnvironmentVariableReader(
new Dictionary<string, string>()
{
["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString
}, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false");

public static IEnumerable<object[]> TestEnvironmentVariableReader()
{
return GetTestEnvironmentVariableReader();
Expand All @@ -30,20 +43,8 @@ public static IEnumerable<object[]> TestEnvironmentVariableReader(object value1,

private static IEnumerable<object[]> GetTestEnvironmentVariableReader(params object[] objects)
{
var UseNjForFileTrue = new List<object> {
new TestEnvironmentVariableReader(
new Dictionary<string, string>()
{
["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString
}, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true")
};
var UseNjForFileFalse = new List<object> {
new TestEnvironmentVariableReader(
new Dictionary<string, string>()
{
["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString
}, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false")
};
var UseNjForFileTrue = new List<object> { UseNjForProcessingEnvironmentVariable };
var UseNjForFileFalse = new List<object> { UseStjForProcessingEnvironmentVariable };

if (objects != null)
{
Expand Down

0 comments on commit a240062

Please sign in to comment.