Don't rewrite pubspec.lock and workspace_ref if not modified (#4589)
diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart index f508969..43e3713 100644 --- a/lib/src/entrypoint.dart +++ b/lib/src/entrypoint.dart
@@ -405,7 +405,7 @@ Future<void> writePackageConfigFiles() async { ensureDir(p.dirname(packageConfigPath)); - _writeIfDifferent( + writeTextFileIfDifferent( packageConfigPath, await _packageConfigFile( cache, @@ -416,7 +416,7 @@ ?.effectiveConstraint, ), ); - _writeIfDifferent(packageGraphPath, await _packageGraphFile(cache)); + writeTextFileIfDifferent(packageGraphPath, await _packageGraphFile(cache)); if (workspaceRoot.workspaceChildren.isNotEmpty) { for (final package in workspaceRoot.transitiveWorkspace) { @@ -430,7 +430,7 @@ final workspaceRef = const JsonEncoder.withIndent( ' ', ).convert({'workspaceRoot': relativeRootPath}); - writeTextFile(workspaceRefPath, '$workspaceRef\n'); + writeTextFileIfDifferent(workspaceRefPath, '$workspaceRef\n'); } } } @@ -526,17 +526,6 @@ return '$jsonText\n'; } - void _writeIfDifferent(String path, String newContent) { - // Compare to the present package_config.json - // For purposes of equality we don't care about the `generated` timestamp. - final originalText = tryReadTextFile(path); - if (originalText != newContent) { - writeTextFile(path, newContent); - } else { - log.fine('`$path` is unchanged. Not rewriting.'); - } - } - /// Gets all dependencies of the [workspaceRoot] package. /// /// Performs version resolution according to [SolveType].
diff --git a/lib/src/io.dart b/lib/src/io.dart index 608bf87..b7d02ae 100644 --- a/lib/src/io.dart +++ b/lib/src/io.dart
@@ -257,6 +257,17 @@ File(file).writeAsStringSync(contents, encoding: encoding); } +void writeTextFileIfDifferent(String path, String newContent) { + // Compare to the present package_config.json + // For purposes of equality we don't care about the `generated` timestamp. + final originalText = tryReadTextFile(path); + if (originalText != newContent) { + writeTextFile(path, newContent); + } else { + log.fine('`$path` is unchanged. Not rewriting.'); + } +} + /// Reads the contents of the binary file [file]. void writeBinaryFile(String file, Uint8List data) { log.io('Writing ${data.length} bytes to file $file.');
diff --git a/lib/src/lock_file.dart b/lib/src/lock_file.dart index 4d5f14b..dc688e9 100644 --- a/lib/src/lock_file.dart +++ b/lib/src/lock_file.dart
@@ -406,7 +406,7 @@ detectWindowsLineEndings(readTextFile(lockFilePath)); final serialized = serialize(p.dirname(lockFilePath), cache); - writeTextFile( + writeTextFileIfDifferent( lockFilePath, windowsLineEndings ? serialized.replaceAll('\n', '\r\n') : serialized, );
diff --git a/test/package_config_file_test.dart b/test/package_config_file_test.dart index b924c22..f7a58c2 100644 --- a/test/package_config_file_test.dart +++ b/test/package_config_file_test.dart
@@ -313,42 +313,67 @@ }); }); - test( - 'package_config and package_graph are not rewritten if unchanged', - () async { - final server = await servePackages(); - server.serve('foo', '1.0.0'); + test('pubspec.lock, package_config, package_graph and workspace_ref ' + 'are not rewritten if unchanged', () async { + final server = await servePackages(); + server.serve('foo', '1.0.0'); - await d.appDir(dependencies: {'foo': 'any'}).create(); + await d.dir(appPath, [ + d.appPubspec( + dependencies: {'foo': 'any'}, + extras: { + 'workspace': ['foo'], + 'environment': {'sdk': '^3.5.0'}, + }, + ), + d.dir('foo', [d.libPubspec('foo', '1.0.0', resolutionWorkspace: true)]), + ]).create(); - await pubGet(); - final packageConfigFile = File( - p.join(sandbox, appPath, '.dart_tool', 'package_config.json'), - ); - final packageConfig = jsonDecode(packageConfigFile.readAsStringSync()); - final packageConfigTimestamp = packageConfigFile.lastModifiedSync(); - final packageGraphFile = File( - p.join(sandbox, appPath, '.dart_tool', 'package_graph.json'), - ); - final packageGraph = jsonDecode(packageGraphFile.readAsStringSync()); - final packageGraphTimestamp = packageGraphFile.lastModifiedSync(); - final s = p.separator; - await pubGet( - silent: allOf( - contains( - '`.dart_tool${s}package_config.json` is unchanged. Not rewriting.', - ), - contains( - '`.dart_tool${s}package_graph.json` is unchanged. Not rewriting.', - ), + await pubGet(environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}); + final packageConfigFile = File( + p.join(sandbox, appPath, '.dart_tool', 'package_config.json'), + ); + final packageConfig = jsonDecode(packageConfigFile.readAsStringSync()); + final packageConfigTimestamp = packageConfigFile.lastModifiedSync(); + final lockFile = File(p.join(sandbox, appPath, 'pubspec.lock')); + final lockfileTimestamp = lockFile.lastModifiedSync(); + final packageGraphFile = File( + p.join(sandbox, appPath, '.dart_tool', 'package_graph.json'), + ); + final packageGraph = jsonDecode(packageGraphFile.readAsStringSync()); + final packageGraphTimestamp = packageGraphFile.lastModifiedSync(); + final workspaceRefFile = File( + p.join( + sandbox, + appPath, + 'foo', + '.dart_tool', + 'pub', + 'workspace_ref.json', + ), + ); + final workspaceRefTimestamp = workspaceRefFile.lastModifiedSync(); + final s = p.separator; + await pubGet( + silent: allOf( + contains( + '`.dart_tool${s}package_config.json` is unchanged. Not rewriting.', ), - ); + contains( + '`.dart_tool${s}package_graph.json` is unchanged. Not rewriting.', + ), + ), + environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}, + ); + // The resolution of timestamps is not that good. + await Future<Null>.delayed(const Duration(seconds: 1)); + expect(packageConfig, jsonDecode(packageConfigFile.readAsStringSync())); + expect(packageConfigFile.lastModifiedSync(), packageConfigTimestamp); - expect(packageConfig, jsonDecode(packageConfigFile.readAsStringSync())); - expect(packageConfigFile.lastModifiedSync(), packageConfigTimestamp); + expect(packageGraph, jsonDecode(packageGraphFile.readAsStringSync())); + expect(packageGraphFile.lastModifiedSync(), packageGraphTimestamp); - expect(packageGraph, jsonDecode(packageGraphFile.readAsStringSync())); - expect(packageGraphFile.lastModifiedSync(), packageGraphTimestamp); - }, - ); + expect(lockFile.lastModifiedSync(), lockfileTimestamp); + expect(workspaceRefFile.lastModifiedSync(), workspaceRefTimestamp); + }); }