@@ -154,7 +154,7 @@ public RestoreCommand(RestoreRequest request)
154154 _lockFileBuilderCache = request . LockFileBuilderCache ;
155155
156156 // Validate the lock file version requested
157- if ( _request . LockFileVersion < 1 || _request . LockFileVersion > LockFileFormat . Version )
157+ if ( _request . LockFileVersion < 3 || _request . LockFileVersion > LockFileFormat . Version )
158158 {
159159 throw new ArgumentOutOfRangeException (
160160 paramName : nameof ( request ) ,
@@ -249,7 +249,7 @@ public async Task<RestoreResult> ExecuteAsync(CancellationToken token)
249249
250250 // if success == false, it generates an empty restore graph suitable to create an assets file with errors.
251251 // Since the graph is empty, any code that analyzes the graph (like audit) will have nothing to do.
252- ( successfulResult , var graphs ) = await GenerateRestoreGraphsAsync ( telemetry , contextForProject , success , token ) ;
252+ ( successfulResult , List < RestoreTargetGraph > graphs ) = await GenerateRestoreGraphsAsync ( telemetry , contextForProject , success , token ) ;
253253 success &= successfulResult ;
254254
255255 bool auditRan = false ;
@@ -571,9 +571,9 @@ private async Task<EvaluateLockFileResult>
571571 return new EvaluateLockFileResult ( success , isLockFileValid , regenerateLockFile , packagesLockFilePath , packagesLockFile ) ;
572572 }
573573
574- private async Task < ( bool , IEnumerable < RestoreTargetGraph > ) > GenerateRestoreGraphsAsync ( TelemetryActivity telemetry , RemoteWalkContext contextForProject , bool success , CancellationToken token )
574+ private async Task < ( bool , List < RestoreTargetGraph > ) > GenerateRestoreGraphsAsync ( TelemetryActivity telemetry , RemoteWalkContext contextForProject , bool success , CancellationToken token )
575575 {
576- IEnumerable < RestoreTargetGraph > graphs = null ;
576+ List < RestoreTargetGraph > graphs = null ;
577577 if ( success )
578578 {
579579 using ( telemetry . StartIndependentInterval ( GenerateRestoreGraphDuration ) )
@@ -608,23 +608,25 @@ private async Task<EvaluateLockFileResult>
608608 // caller of RestoreCommand to have provided at least one AdditionalMessage in RestoreArgs.
609609 // The other scenario is when the lock file is not up to date and we're running locked mode.
610610 // In that case we want to write a `target` for each target framework to avoid missing target errors from the SDK build tasks.
611- var frameworkRuntimePair = CreateFrameworkRuntimeDefinitions ( _request . Project , RequestRuntimeUtility . GetRestoreRuntimes ( _request ) ) ;
612- graphs = frameworkRuntimePair . Select ( e =>
611+ var frameworkRuntimePairs = CreateFrameworkRuntimeDefinitions ( _request . Project , RequestRuntimeUtility . GetRestoreRuntimes ( _request ) ) ;
612+ graphs = new ( frameworkRuntimePairs . Count ) ;
613+ for ( var i = 0 ; i < frameworkRuntimePairs . Count ; i ++ )
613614 {
614- return RestoreTargetGraph . Create ( _request . Project . RuntimeGraph , Enumerable . Empty < GraphNode < RemoteResolveResult > > ( ) , contextForProject , _logger , e . TargetAlias , e . Framework , e . RuntimeIdentifier ) ;
615- } ) ;
615+ var restoreTargetGraph = RestoreTargetGraph . Create ( _request . Project . RuntimeGraph , Enumerable . Empty < GraphNode < RemoteResolveResult > > ( ) , contextForProject , _logger , frameworkRuntimePairs [ i ] . TargetAlias , frameworkRuntimePairs [ i ] . Framework , frameworkRuntimePairs [ i ] . RuntimeIdentifier ) ;
616+ graphs . Add ( restoreTargetGraph ) ;
617+ }
616618 }
617619
618620 return ( success , graphs ) ;
619621 }
620622
621- private async Task < ( bool , IEnumerable < MSBuildOutputFile > , string , string , LockFile , IEnumerable < RestoreTargetGraph > , PackagesLockFile , string , CacheFile ) > ProcessRestoreResultAsync ( TelemetryActivity telemetry ,
623+ private async Task < ( bool , IEnumerable < MSBuildOutputFile > , string , string , LockFile , List < RestoreTargetGraph > , PackagesLockFile , string , CacheFile ) > ProcessRestoreResultAsync ( TelemetryActivity telemetry ,
622624 List < NuGetv3LocalRepository > localRepositories ,
623625 RemoteWalkContext contextForProject ,
624626 bool isLockFileValid ,
625627 bool regenerateLockFile ,
626628 LockFile assetsFile ,
627- IEnumerable < RestoreTargetGraph > graphs ,
629+ List < RestoreTargetGraph > graphs ,
628630 PackagesLockFile packagesLockFile ,
629631 string packagesLockFilePath ,
630632 CacheFile cacheFile ,
@@ -663,9 +665,6 @@ private async Task<EvaluateLockFileResult>
663665 _logger ) ;
664666 }
665667
666- // If the request is for a lower lock file version, downgrade it appropriately
667- DowngradeLockFileIfNeeded ( assetsFile ) ;
668-
669668 // Revert to the original case if needed
670669 await FixCaseForLegacyReaders ( graphs , assetsFile , token ) ;
671670
@@ -758,7 +757,7 @@ private async Task<EvaluateLockFileResult>
758757 /// <param name="telemetry">The <see cref="TelemetryActivity"/> to log NuGetAudit telemetry to.</param>
759758 /// <param name="token">A <see cref="CancellationToken"/> to cancel obtaining a vulnerability database. Once the database is downloaded, audit is quick to complete.</param>
760759 /// <returns>False if no vulnerability database could be found (so packages were not scanned for vulnerabilities), true otherwise.</returns>
761- private async Task < bool > PerformAuditAsync ( IEnumerable < RestoreTargetGraph > graphs , TelemetryActivity telemetry , CancellationToken token )
760+ private async Task < bool > PerformAuditAsync ( List < RestoreTargetGraph > graphs , TelemetryActivity telemetry , CancellationToken token )
762761 {
763762 var audit = new AuditUtility (
764763 _request . Project . RestoreMetadata . RestoreAuditProperties ,
@@ -1436,14 +1435,6 @@ private string GetAssetsFilePath(LockFile lockFile)
14361435 return Path . GetFullPath ( projectLockFilePath ) ;
14371436 }
14381437
1439- private void DowngradeLockFileIfNeeded ( LockFile lockFile )
1440- {
1441- if ( _request . LockFileVersion <= 1 )
1442- {
1443- DowngradeLockFileToV1 ( lockFile ) ;
1444- }
1445- }
1446-
14471438 private async Task FixCaseForLegacyReaders (
14481439 IEnumerable < RestoreTargetGraph > graphs ,
14491440 LockFile lockFile ,
@@ -1467,7 +1458,7 @@ private async Task FixCaseForLegacyReaders(
14671458 private LockFile BuildAssetsFile (
14681459 LockFile existingLockFile ,
14691460 PackageSpec project ,
1470- IEnumerable < RestoreTargetGraph > graphs ,
1461+ List < RestoreTargetGraph > graphs ,
14711462 IReadOnlyList < NuGetv3LocalRepository > localRepositories ,
14721463 RemoteWalkContext contextForProject )
14731464 {
@@ -1661,7 +1652,7 @@ private static async Task<IList<CompatibilityCheckResult>> VerifyCompatibilityAs
16611652 return checkResults ;
16621653 }
16631654
1664- private async Task < ( bool , IEnumerable < RestoreTargetGraph > ) > ExecuteLegacyRestoreAsync (
1655+ private async Task < ( bool , List < RestoreTargetGraph > ) > ExecuteLegacyRestoreAsync (
16651656 NuGetv3LocalRepository userPackageFolder ,
16661657 IReadOnlyList < NuGetv3LocalRepository > fallbackPackageFolders ,
16671658 RemoteWalkContext context ,
@@ -1675,7 +1666,7 @@ private static async Task<IList<CompatibilityCheckResult>> VerifyCompatibilityAs
16751666 await _logger . LogAsync ( RestoreLogMessage . CreateError ( NuGetLogCode . NU1001 , message ) ) ;
16761667
16771668 success = false ;
1678- return ( success , Enumerable . Empty < RestoreTargetGraph > ( ) ) ;
1669+ return ( success , [ ] ) ;
16791670 }
16801671 _logger . LogInformation ( string . Format ( CultureInfo . CurrentCulture , Strings . Log_RestoringPackages , _request . Project . FilePath ) ) ;
16811672
@@ -1838,7 +1829,7 @@ private static async Task<IList<CompatibilityCheckResult>> VerifyCompatibilityAs
18381829 return ( success , allGraphs ) ;
18391830 }
18401831
1841- private async Task < ( bool , IEnumerable < RestoreTargetGraph > ) > ExecuteRestoreAsync (
1832+ private async Task < ( bool , List < RestoreTargetGraph > ) > ExecuteRestoreAsync (
18421833 NuGetv3LocalRepository userPackageFolder ,
18431834 IReadOnlyList < NuGetv3LocalRepository > fallbackPackageFolders ,
18441835 RemoteWalkContext context ,
@@ -1853,7 +1844,7 @@ private static async Task<IList<CompatibilityCheckResult>> VerifyCompatibilityAs
18531844
18541845 success = false ;
18551846
1856- return ( success , Enumerable . Empty < RestoreTargetGraph > ( ) ) ;
1847+ return ( success , [ ] ) ;
18571848 }
18581849
18591850 var projectRestoreRequest = new ProjectRestoreRequest ( _request , _request . Project , _request . ExistingLockFile , _logger )
@@ -2057,37 +2048,6 @@ private static RemoteWalkContext CreateRemoteWalkContext(RestoreRequest request,
20572048 return context ;
20582049 }
20592050
2060- private static void DowngradeLockFileToV1 ( LockFile lockFile )
2061- {
2062- // Remove projects from the library section
2063- var libraryProjects = lockFile . Libraries . Where ( lib => lib . Type == LibraryType . Project ) . ToArray ( ) ;
2064-
2065- foreach ( var library in libraryProjects )
2066- {
2067- lockFile . Libraries . Remove ( library ) ;
2068- }
2069-
2070- // Remove projects from the targets section
2071- foreach ( var target in lockFile . Targets )
2072- {
2073- var targetProjects = target . Libraries . Where ( lib => lib . Type == LibraryType . Project ) . ToArray ( ) ;
2074-
2075- foreach ( var library in targetProjects )
2076- {
2077- target . Libraries . Remove ( library ) ;
2078- }
2079- }
2080-
2081- foreach ( var library in lockFile . Targets . SelectMany ( target => target . Libraries ) )
2082- {
2083- // Null out all target types, these did not exist in v1
2084- library . Type = null ;
2085- }
2086-
2087- // Remove the package spec
2088- lockFile . PackageSpec = null ;
2089- }
2090-
20912051 private static ExternalProjectReference ToExternalProjectReference ( PackageSpec project )
20922052 {
20932053 return new ExternalProjectReference (
0 commit comments