@@ -434,7 +434,6 @@ public async Task<GitFileContentContainer> UpdateDependencyFiles(
434434 string branch ,
435435 IEnumerable < DependencyDetail > oldDependencies ,
436436 SemanticVersion incomingDotNetSdkVersion ,
437- bool forceGlobalJsonUpdate = false ,
438437 bool ? repoHasVersionDetailsProps = null )
439438 {
440439 // When updating version files, we always want to look in the base folder, even when we're updating it in the VMR
@@ -509,7 +508,7 @@ public async Task<GitFileContentContainer> UpdateDependencyFiles(
509508 Dictionary < GitFileMetadataName , string > globalJsonMetadata = null ;
510509 if ( incomingDotNetSdkVersion != null )
511510 {
512- globalJsonMetadata = UpdateDotnetVersionGlobalJson ( incomingDotNetSdkVersion , globalJson , forceGlobalJsonUpdate ) ;
511+ globalJsonMetadata = UpdateDotnetVersionGlobalJson ( incomingDotNetSdkVersion , globalJson ) ;
513512 }
514513
515514 var fileContainer = new GitFileContentContainer
@@ -559,60 +558,53 @@ public void UpdateVersionDetailsXmlSourceTag(XmlDocument versionDetails, SourceD
559558 }
560559
561560 /// <summary>
562- /// Updates the global.json entries for tools.dotnet and sdk.version if they are older than an incoming version
561+ /// Updates the global.json entries for tools.dotnet and sdk.version in the repo if incoming version is newer
563562 /// </summary>
564- /// <param name="incomingDotnetVersion">version to compare against</param>
565- /// <param name="globalJson">Global.Json file to update</param>
566- /// <param name="forceUpdate">Ignores version check and forces globalJson update</param>
563+ /// <param name="incomingDotnetVersion">incoming version to compare against</param>
564+ /// <param name="targetGlobalJson">Global.Json file to update in target repo</param>
567565 /// <returns>Updated global.json file if was able to update, or the unchanged global.json if unable to</returns>
568566 private Dictionary < GitFileMetadataName , string > UpdateDotnetVersionGlobalJson (
569567 SemanticVersion incomingDotnetVersion ,
570- JObject globalJson ,
571- bool forceUpdate = false )
568+ JObject targetGlobalJson )
572569 {
573- try
570+ JToken pinnedToken = targetGlobalJson . SelectToken ( "tools.pinned" ) ;
571+ if ( pinnedToken != null && pinnedToken . Type == JTokenType . Boolean && pinnedToken . Value < bool > ( ) )
574572 {
575- // Check if tools.pinned is set to true, if so skip update
576- JToken pinnedToken = globalJson . SelectToken ( "tools.pinned" ) ;
577- if ( pinnedToken != null && pinnedToken . Type == JTokenType . Boolean && pinnedToken . Value < bool > ( ) )
578- {
579- _logger . LogInformation ( "Skipping dotnet SDK update because tools.pinned is set to true in global.json" ) ;
580- return null ;
581- }
573+ _logger . LogInformation ( "Skipping dotnet SDK update because tools.pinned is set to true in the target." +
574+ $ "repo's { VersionFiles . GlobalJson } ") ;
575+ return null ;
576+ }
582577
583- if ( SemanticVersion . TryParse ( globalJson . SelectToken ( "tools.dotnet" ) ? . ToString ( ) , out SemanticVersion repoDotnetVersion ) )
584- {
585- if ( repoDotnetVersion . CompareTo ( incomingDotnetVersion ) < 0 || forceUpdate )
586- {
587- Dictionary < GitFileMetadataName , string > metadata = [ ] ;
578+ string dotnetVersion = targetGlobalJson . SelectToken ( "tools.dotnet" ) ? . ToString ( ) ;
579+ if ( dotnetVersion == null )
580+ {
581+ _logger . LogInformation ( $ "Could not find token `tools.dotnet` in target repo's `{ VersionFiles . GlobalJson } `." +
582+ "Skipping dotnet SDK update." ) ;
583+ return null ;
584+ }
588585
589- globalJson [ "tools" ] [ "dotnet" ] = incomingDotnetVersion . ToNormalizedString ( ) ;
590- metadata . Add ( GitFileMetadataName . ToolsDotNetUpdate , incomingDotnetVersion . ToNormalizedString ( ) ) ;
586+ var targetRepoVersion = SemanticVersion . Parse ( dotnetVersion ) ;
587+ if ( targetRepoVersion . CompareTo ( incomingDotnetVersion ) > 0 )
588+ {
589+ _logger . LogInformation ( $ "The dotnet SDK version in the target repo's `{ VersionFiles . GlobalJson } ` is higher than the " +
590+ "incoming change. Skipping dotnet SDK update." ) ;
591+ return null ;
592+ }
591593
592- // Also update and keep sdk.version in sync.
593- JToken sdkVersion = globalJson . SelectToken ( "sdk.version" ) ;
594- if ( sdkVersion != null )
595- {
596- globalJson [ "sdk" ] [ "version" ] = incomingDotnetVersion . ToNormalizedString ( ) ;
597- metadata . Add ( GitFileMetadataName . SdkVersionUpdate , incomingDotnetVersion . ToNormalizedString ( ) ) ;
598- }
594+ Dictionary < GitFileMetadataName , string > metadata = [ ] ;
599595
600- return metadata ;
601- }
602- }
603- else
604- {
605- _logger . LogError ( "Could not parse the repo's dotnet version from the global.json. Skipping update to dotnet version sections" ) ;
606- return null ;
607- }
608- }
609- catch ( Exception ex )
596+ targetGlobalJson [ "tools" ] [ "dotnet" ] = incomingDotnetVersion . ToNormalizedString ( ) ;
597+ metadata . Add ( GitFileMetadataName . ToolsDotNetUpdate , incomingDotnetVersion . ToNormalizedString ( ) ) ;
598+
599+ // Also keep sdk.version in sync with tools.dotnet
600+ JToken sdkVersion = targetGlobalJson . SelectToken ( "sdk.version" ) ;
601+ if ( sdkVersion != null )
610602 {
611- _logger . LogError ( ex , "Failed to update Dotnet version for global.json. Skipping update to version sections." ) ;
603+ targetGlobalJson [ "sdk" ] [ "version" ] = incomingDotnetVersion . ToNormalizedString ( ) ;
604+ metadata . Add ( GitFileMetadataName . SdkVersionUpdate , incomingDotnetVersion . ToNormalizedString ( ) ) ;
612605 }
613606
614- // No updates
615- return null ;
607+ return metadata ;
616608 }
617609
618610 private static bool IsOnlyPresentInMaestroManagedFeed ( HashSet < string > locations )
0 commit comments