outputsAreFresh function

bool outputsAreFresh({
  1. required FileSystem fs,
  2. required List<File> outputs,
  3. required List<Directory> inputDirs,
  4. List<File> extraFiles = const [],
})

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;
}