outputsAreFresh function
Returns true when each output exists and is at least as new as every file
under inputDirs (dart sources) and extraFiles.
Implementation
bool outputsAreFresh({
required FileSystem fs,
required List<File> outputs,
required List<Directory> inputDirs,
List<File> extraFiles = const [],
}) {
DateTime? oldestOutput;
for (final output in outputs) {
if (!output.existsSync()) {
return false;
}
final modified = output.lastModifiedSync();
if (oldestOutput == null || modified.isBefore(oldestOutput)) {
oldestOutput = modified;
}
}
if (oldestOutput == null) {
return false;
}
bool newerThanOutput(File file) {
try {
return file.lastModifiedSync().isAfter(oldestOutput!);
} catch (_) {
return false;
}
}
for (final file in extraFiles) {
if (file.existsSync() && newerThanOutput(file)) {
return false;
}
}
for (final dir in inputDirs) {
if (!dir.existsSync()) continue;
for (final entity in dir.listSync(recursive: true, followLinks: false)) {
if (entity is! File) continue;
if (!entity.path.endsWith('.dart')) continue;
if (newerThanOutput(entity)) {
return false;
}
}
}
return true;
}