Skip to content

Commit 045a895

Browse files
authored
Reduce unnecessary churn when generating LocalPackages config (#20574)
* reduce churn adding LocalPackage by not updating mapping in existing tasks w/o version bump * Only update package.json, package-lock.json, npm-shrinkwrap.json under _buildsConfigs if they already exist to avoid unnecessary source churn. (they only need to be synced if the config has different dependencies) * bump for testing * fix * format * clean up * Revert "bump for testing" This reverts commit 0e12ae4.
1 parent 836d99d commit 045a895

File tree

2 files changed

+56
-17
lines changed

2 files changed

+56
-17
lines changed

BuildConfigGen/Program.cs

+44-9
Original file line numberDiff line numberDiff line change
@@ -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);

make-util.js

+12-8
Original file line numberDiff line numberDiff line change
@@ -1947,19 +1947,23 @@ function syncGeneratedFilesWrapper(originalFunction, basicGenTaskPath, basicGenT
19471947
copyCandidates.forEach((candidatePath) => {
19481948
const relativePath = path.relative(genTaskPath, candidatePath);
19491949
let dest = path.join(__dirname, 'Tasks', baseTaskName, relativePath);
1950-
1950+
19511951
if (config) {
19521952
dest = path.join(__dirname, 'Tasks', baseTaskName, '_buildConfigs', config, relativePath);
19531953
}
19541954

1955-
const folderPath = path.dirname(dest);
1956-
if (!fs.existsSync(folderPath)) {
1957-
console.log(`Creating folder ${folderPath}`);
1958-
shell.mkdir('-p', folderPath);
1959-
}
1955+
// only update Tasks/[task]/_buildConfigs/[configs]/package.json, etc if it already exists
1956+
if(fs.existsSync(dest))
1957+
{
1958+
const folderPath = path.dirname(dest);
1959+
if (!fs.existsSync(folderPath)) {
1960+
console.log(`Creating folder ${folderPath}`);
1961+
shell.mkdir('-p', folderPath);
1962+
}
19601963

1961-
console.log(`Copying ${candidatePath} to ${dest}`);
1962-
fs.copyFileSync(candidatePath, dest);
1964+
console.log(`Copying ${candidatePath} to ${dest}`);
1965+
fs.copyFileSync(candidatePath, dest);
1966+
}
19631967
});
19641968
}
19651969
}

0 commit comments

Comments
 (0)