Files
sdk/pkg/front_end/test/utils/io_utils.dart
T
Johnni Winther e7e07f73aa [cfe] Normalize repo dir
Uri.base, Platform.script and dart:io operations use the drive letter capitalization of the current working directory, but git, alas, does not. This normalizes the computeRepoDir to match that of Uri.base, thus avoiding spurious errors on Windows.

Change-Id: If4324874fa9b5c73c679c1b67a9481371ce8808d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/421161
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
2025-04-08 05:48:41 -07:00

59 lines
2.1 KiB
Dart

// Copyright (c) 2019, 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' show Directory, File, Platform, Process, ProcessResult;
import 'package:_fe_analyzer_shared/src/util/filenames.dart';
String computeRepoDir() {
Uri uri;
if (Platform.script.hasAbsolutePath) {
uri = Platform.script;
} else if (Platform.packageConfig != null) {
String packageConfig = Platform.packageConfig!;
final String prefix = "file://";
if (packageConfig.startsWith(prefix)) {
uri = Uri.parse(packageConfig);
} else {
uri = Uri.base.resolve(nativeToUriPath(packageConfig));
}
} else {
throw "Can't obtain the path to the SDK either via "
"Platform.script or Platform.packageConfig";
}
String path = new File.fromUri(uri).parent.path;
ProcessResult result = Process.runSync(
'git', ['rev-parse', '--show-toplevel'],
runInShell: true, workingDirectory: path);
if (result.exitCode != 0) {
throw "Git returned non-zero error code (${result.exitCode}):\n\n"
"stdout: ${result.stdout}\n\n"
"stderr: ${result.stderr}";
}
String dirPath = (result.stdout as String).trim();
if (!new Directory(dirPath).existsSync()) {
throw "The path returned by git ($dirPath) does not actually exist.";
}
if (dirPath.length > 1 && dirPath[1] == ':') {
// Absolute Windows path. Normalize drive letter to match Uri.base.
if (Uri.base.path.length < 3 ||
Uri.base.path[0] != '/' ||
Uri.base.path[2] != ':') {
throw "Expected Uri.base=${Uri.base} to be an absolute file path.";
}
bool isLowerCase = Uri.base.path[1] == Uri.base.path[1].toLowerCase();
if (isLowerCase) {
dirPath = dirPath[0].toLowerCase() + dirPath.substring(1);
} else {
dirPath = dirPath[0].toUpperCase() + dirPath.substring(1);
}
}
return dirPath;
}
Uri computeRepoDirUri() {
String dirPath = computeRepoDir();
return new Directory(dirPath).uri;
}