@@ -594,6 +594,8 @@ private static void MainUpdateTask(
594594 // Note: CheckTaskInputContainsPreprocessorInstructions is expensive, so only call if needed
595595 if ( versionUpdated || taskConfigExists || HasTaskInputContainsPreprocessorInstructions ( gitRootPath , taskTargetPath , config ) || config . isNode )
596596 {
597+ var existingLocalPackageVersion = ReadTaskJsonIfExists ( taskOutput , "task.json" ) ;
598+
597599 CopyConfig ( gitRootPath , taskTargetPath , taskOutput , skipPathName : buildConfigs , skipFileName : null , removeExtraFiles : true , throwIfNotUpdatingFileForApplyingOverridesAndPreProcessor : false , config : config , allowPreprocessorDirectives : true ) ;
598600
599601 if ( config . enableBuildConfigOverrides )
@@ -609,8 +611,8 @@ private static void MainUpdateTask(
609611
610612 WriteWIFInputTaskJson ( taskOutput , config , "task.json" , isLoc : false ) ;
611613 WriteWIFInputTaskJson ( taskOutput , config , "task.loc.json" , isLoc : true ) ;
612- WriteTaskJson ( taskOutput , taskVersionState . configTaskVersionMapping , config , "task.json" ) ;
613- WriteTaskJson ( taskOutput , taskVersionState . configTaskVersionMapping , config , "task.loc.json" ) ;
614+ WriteTaskJson ( taskOutput , taskVersionState , config , "task.json" , existingLocalPackageVersion ) ;
615+ WriteTaskJson ( taskOutput , taskVersionState , config , "task.loc.json" , existingLocalPackageVersion ) ;
614616 }
615617
616618 WriteInputTaskJson ( taskTargetPath , taskVersionState . configTaskVersionMapping , "task.json" ) ;
@@ -907,21 +909,54 @@ private static void PreprocessIfExtensionEnabledInConfig(string file, Config.Con
907909 }
908910 }
909911
912+ private static string ? ReadTaskJsonIfExists ( string taskPath , string fileName )
913+ {
914+ string outputTaskPath = Path . Combine ( taskPath , fileName ) ;
915+ if ( ! File . Exists ( outputTaskPath ) )
916+ {
917+ return null ;
918+ }
919+
920+ JsonNode outputTaskNode = JsonNode . Parse ( ensureUpdateModeVerifier ! . FileReadAllText ( outputTaskPath ) ) ! ;
921+ var outputTaskNodeObject = outputTaskNode . AsObject ( ) ;
922+
923+ // get LocalPackage version from _buildConfigMapping in outputTaskNodeObject (if one exists)
924+ return outputTaskNodeObject [ "_buildConfigMapping" ] ? . AsObject ( ) ? [ Config . LocalPackages . constMappingKey ] ? . GetValue < string > ( ) ;
925+ }
910926
911- private static void WriteTaskJson ( string taskPath , Dictionary < Config . ConfigRecord , TaskVersion > configTaskVersionMapping , Config . ConfigRecord config , string fileName )
927+ private static void WriteTaskJson ( string taskPath , TaskStateStruct taskState , Config . ConfigRecord config , string fileName , string ? existingLocalPackageVersion )
912928 {
913929 string outputTaskPath = Path . Combine ( taskPath , fileName ) ;
914930 JsonNode outputTaskNode = JsonNode . Parse ( ensureUpdateModeVerifier ! . FileReadAllText ( outputTaskPath ) ) ! ;
915- outputTaskNode [ "version" ] ! [ "Major" ] = configTaskVersionMapping [ config ] . Major ;
916- outputTaskNode [ "version" ] ! [ "Minor" ] = configTaskVersionMapping [ config ] . Minor ;
917- outputTaskNode [ "version" ] ! [ "Patch" ] = configTaskVersionMapping [ config ] . Patch ;
918- outputTaskNode . AsObject ( ) ? . Remove ( "_buildConfigMapping" ) ;
931+
932+ outputTaskNode [ "version" ] ! [ "Major" ] = taskState . configTaskVersionMapping [ config ] . Major ;
933+ outputTaskNode [ "version" ] ! [ "Minor" ] = taskState . configTaskVersionMapping [ config ] . Minor ;
934+ outputTaskNode [ "version" ] ! [ "Patch" ] = taskState . configTaskVersionMapping [ config ] . Patch ;
935+
936+ var outputTaskNodeObject = outputTaskNode . AsObject ( ) ;
937+ outputTaskNodeObject . Remove ( "_buildConfigMapping" ) ;
938+
939+ bool anyVersionsUpdatedExceptForGlobal = taskState . versionsUpdated . Where ( x => ! x . useGlobalVersion ) . Any ( ) ;
919940
920941 JsonObject configMapping = new JsonObject ( ) ;
921- var configTaskVersionMappingSortedByConfig = configTaskVersionMapping . OrderBy ( x => x . Key . name ) ;
942+ var configTaskVersionMappingSortedByConfig = taskState . configTaskVersionMapping . OrderBy ( x => x . Key . name ) ;
922943 foreach ( var cfg in configTaskVersionMappingSortedByConfig )
923944 {
924- configMapping . Add ( new ( cfg . Key . constMappingKey , cfg . Value . ToString ( ) ) ) ;
945+ if ( ! config . useGlobalVersion && cfg . Key . useGlobalVersion && ! anyVersionsUpdatedExceptForGlobal )
946+ {
947+ // To minimize noise in version control when adding the globalVersion,
948+ // unless the config being generated is the globalVersion (written to _generated_local),
949+ // if no other versions are updated other than the globalVersion,
950+ // don't change the global version in the existing generated file.
951+ if ( existingLocalPackageVersion != null )
952+ {
953+ configMapping . Add ( new ( cfg . Key . constMappingKey , existingLocalPackageVersion ) ) ;
954+ }
955+ }
956+ else
957+ {
958+ configMapping . Add ( new ( cfg . Key . constMappingKey , cfg . Value . ToString ( ) ) ) ;
959+ }
925960 }
926961
927962 outputTaskNode . AsObject ( ) . Add ( "_buildConfigMapping" , configMapping ) ;
0 commit comments