Unverified Commit 3c8c630f authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

Allow disabling all fingerprint caches via environment variable (#31171)

parent 20d8ea78
......@@ -12,9 +12,17 @@ import '../convert.dart' show json;
import '../globals.dart';
import '../version.dart';
import 'file_system.dart';
import 'platform.dart';
typedef FingerprintPathFilter = bool Function(String path);
/// Whether to completely disable build caching.
///
/// This is done by always returning false from fingerprinter invocations. This
/// is safe to do generally, because fingerprinting is only a performance
/// improvement.
bool get _disableBuildCache => platform.environment['DISABLE_FLUTTER_BUILD_CACHE']?.toLowerCase() == 'true';
/// A tool that can be used to compute, compare, and write [Fingerprint]s for a
/// set of input files and associated build settings.
///
......@@ -50,6 +58,9 @@ class Fingerprinter {
}
Future<bool> doesFingerprintMatch() async {
if (_disableBuildCache) {
return false;
}
try {
final File fingerprintFile = fs.file(fingerprintPath);
if (!fingerprintFile.existsSync())
......
......@@ -5,6 +5,7 @@
import 'dart:convert' show json;
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/fingerprint.dart';
......@@ -192,6 +193,46 @@ void main() {
expect(await fingerprinter.doesFingerprintMatch(), isTrue);
}, overrides: contextOverrides);
final Platform mockPlatformDisabledCache = MockPlatform();
mockPlatformDisabledCache.environment['DISABLE_FLUTTER_BUILD_CACHE'] = 'true';
testUsingContext('can be disabled with an environment variable', () async {
await fs.file('a.dart').create();
await fs.file('b.dart').create();
final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint',
paths: <String>['a.dart', 'b.dart'],
properties: <String, String>{
'bar': 'baz',
'wobble': 'womble',
},
);
await fingerprinter.writeFingerprint();
expect(await fingerprinter.doesFingerprintMatch(), isFalse);
}, overrides: <Type, Generator>{
Platform: () => mockPlatformDisabledCache,
}..addAll(contextOverrides));
final Platform mockPlatformEnabledCache = MockPlatform();
mockPlatformEnabledCache.environment['DISABLE_FLUTTER_BUILD_CACHE'] = 'false';
testUsingContext('can be not-disabled with an environment variable', () async {
await fs.file('a.dart').create();
await fs.file('b.dart').create();
final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint',
paths: <String>['a.dart', 'b.dart'],
properties: <String, String>{
'bar': 'baz',
'wobble': 'womble',
},
);
await fingerprinter.writeFingerprint();
expect(await fingerprinter.doesFingerprintMatch(), isTrue);
}, overrides: <Type, Generator>{
Platform: () => mockPlatformEnabledCache,
}..addAll(contextOverrides));
testUsingContext('fails to write fingerprint if inputs are missing', () async {
final Fingerprinter fingerprinter = Fingerprinter(
fingerprintPath: 'out.fingerprint',
......@@ -471,3 +512,8 @@ void main() {
}, overrides: contextOverrides);
});
}
class MockPlatform extends Mock implements Platform {
@override
Map<String, String> environment = <String, String>{};
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment