blob: 91adcd0f18605ce560b287def8027b6cc712c5ee [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import '../../base/file_system.dart';
import '../depfile.dart';
/// Unpack the engine artifact list [artifacts] from [engineSourcePath], ICU
/// data (if provided), and [clientSourcePaths] (if provided) into a directory
/// [outputDirectory].
///
/// Returns a [Depfile] including all copied files.
///
/// Throws an [Exception] if [artifacts] includes missing files, directories,
/// or links.
Depfile unpackDesktopArtifacts({
required FileSystem fileSystem,
required List<String> artifacts,
required Directory outputDirectory,
required String engineSourcePath,
List<String>? clientSourcePaths,
String? icuDataPath,
}) {
final List<File> inputs = <File>[];
final List<File> outputs = <File>[];
for (final String artifact in artifacts) {
final String entityPath = fileSystem.path.join(engineSourcePath, artifact);
final FileSystemEntityType entityType = fileSystem.typeSync(entityPath);
if (entityType == FileSystemEntityType.notFound
|| entityType == FileSystemEntityType.directory
|| entityType == FileSystemEntityType.link) {
throw Exception('Unsupported file type "$entityType" for $entityPath');
}
assert(entityType == FileSystemEntityType.file);
final String outputPath = fileSystem.path.join(
outputDirectory.path,
fileSystem.path.relative(entityPath, from: engineSourcePath),
);
final File destinationFile = fileSystem.file(outputPath);
if (!destinationFile.parent.existsSync()) {
destinationFile.parent.createSync(recursive: true);
}
final File inputFile = fileSystem.file(entityPath);
inputFile.copySync(destinationFile.path);
inputs.add(inputFile);
outputs.add(destinationFile);
}
if (icuDataPath != null) {
final File inputFile = fileSystem.file(icuDataPath);
final File outputFile = fileSystem.file(fileSystem.path.join(outputDirectory.path, inputFile.basename));
inputFile.copySync(outputFile.path);
inputs.add(inputFile);
outputs.add(outputFile);
}
if (clientSourcePaths == null) {
return Depfile(inputs, outputs);
}
for (final String clientSourcePath in clientSourcePaths) {
final Directory clientSourceDirectory = fileSystem.directory(clientSourcePath);
if (!clientSourceDirectory.existsSync()) {
throw Exception('Missing clientSourceDirectory: $clientSourcePath');
}
for (final File input in clientSourceDirectory
.listSync(recursive: true)
.whereType<File>()) {
final String outputPath = fileSystem.path.join(
outputDirectory.path,
fileSystem.path.relative(input.path, from: clientSourceDirectory.parent.path),
);
final File destinationFile = fileSystem.file(outputPath);
if (!destinationFile.parent.existsSync()) {
destinationFile.parent.createSync(recursive: true);
}
final File inputFile = fileSystem.file(input);
inputFile.copySync(destinationFile.path);
inputs.add(inputFile);
outputs.add(destinationFile);
}
}
return Depfile(inputs, outputs);
}