blob: ae34a37d1bb904e53211f06b8d8b76018a0c9c1a [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:io';
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart' as internal;
import 'package:yaml/yaml.dart';
import 'package:yaml_edit/yaml_edit.dart';
const keepTempKey = 'KEEP_TEMPORARY_DIRECTORIES';
Future<void> inTempDir(
Future<void> Function(Uri tempUri) fun, {
String? prefix,
bool keepTemp = false,
}) async {
final tempDir = await Directory.systemTemp.createTemp(prefix);
// Deal with Windows temp folder aliases.
final tempUri =
Directory(await tempDir.resolveSymbolicLinks()).uri.normalizePath();
try {
await fun(tempUri);
} finally {
if ((!Platform.environment.containsKey(keepTempKey) ||
Platform.environment[keepTempKey]!.isEmpty) &&
!keepTemp) {
await tempDir.delete(recursive: true);
}
}
}
/// Test files are run in a variety of ways, find this package root in all.
///
/// Test files can be run from source from any working directory. The Dart SDK
/// `tools/test.py` runs them from the root of the SDK for example.
///
/// Test files can be run from dill from the root of package. `package:test`
/// does this.
///
/// https://github.com/dart-lang/test/issues/110
Uri findPackageRoot(String packageName) {
final script = Platform.script;
final fileName = script.name;
if (fileName.endsWith('_test.dart')) {
// We're likely running from source.
var directory = script.resolve('.');
while (true) {
final dirName = directory.name;
if (dirName == packageName) {
return directory;
}
final parent = directory.resolve('..');
if (parent == directory) break;
directory = parent;
}
} else if (fileName.endsWith('.dill')) {
final cwd = Directory.current.uri;
final dirName = cwd.name;
if (dirName == packageName) {
return cwd;
}
}
throw StateError("Could not find package root for package '$packageName'. "
'Tried finding the package root via Platform.script '
"'${Platform.script.toFilePath()}' and Directory.current "
"'${Directory.current.uri.toFilePath()}'.");
}
Uri packageUri = findPackageRoot('native_assets_cli');
extension on Uri {
String get name => pathSegments.where((e) => e != '').last;
}
String unparseKey(String key) => key.replaceAll('.', '__').toUpperCase();
/// Archiver provided by the environment.
///
/// Provided on Dart CI.
final Uri? ar = Platform
.environment[unparseKey(internal.CCompilerConfigImpl.arConfigKeyFull)]
?.asFileUri();
/// Compiler provided by the environment.
///
/// Provided on Dart CI.
final Uri? cc = Platform
.environment[unparseKey(internal.CCompilerConfigImpl.ccConfigKeyFull)]
?.asFileUri();
/// Linker provided by the environment.
///
/// Provided on Dart CI.
final Uri? ld = Platform
.environment[unparseKey(internal.CCompilerConfigImpl.ldConfigKeyFull)]
?.asFileUri();
/// Path to script that sets environment variables for [cc], [ld], and [ar].
///
/// Provided on Dart CI.
final Uri? envScript = Platform.environment[
unparseKey(internal.CCompilerConfigImpl.envScriptConfigKeyFull)]
?.asFileUri();
/// Arguments for [envScript] provided by environment.
///
/// Provided on Dart CI.
final List<String>? envScriptArgs = Platform.environment[
unparseKey(internal.CCompilerConfigImpl.envScriptArgsConfigKeyFull)]
?.split(' ');
extension on String {
Uri asFileUri() => Uri.file(this);
}
extension AssetIterable on Iterable<Asset> {
Future<bool> allExist() async {
final allResults = await Future.wait(map((e) => e.exists()));
final missing = allResults.contains(false);
return !missing;
}
}
extension on Asset {
Future<bool> exists() async {
final path_ = file;
return switch (path_) {
null => true,
_ => await path_.fileSystemEntity.exists(),
};
}
}
extension UriExtension on Uri {
FileSystemEntity get fileSystemEntity {
if (path.endsWith(Platform.pathSeparator) || path.endsWith('/')) {
return Directory.fromUri(this);
}
return File.fromUri(this);
}
}
String yamlEncode(Object yamlEncoding) {
final editor = YamlEditor('');
editor.update(
[],
wrapAsYamlNode(
yamlEncoding,
collectionStyle: CollectionStyle.BLOCK,
),
);
return editor.toString();
}