blob: 3c987670772fe90c7e6de14559d638e1b713f740 [file] [log] [blame]
library which.src.candidate_paths;
import 'dart:io';
import 'package:path/path.dart';
Iterable<String> getCandidatePaths(String command, Map<String, String> environment, bool isWindows, Context context) {
if (context.isAbsolute(command)) return [command];
String getEnvVar(String envVar, String defaultValue) {
var v = environment[envVar];
return v == null ? defaultValue : v;
}
var pathVarSeparator = isWindows ? ";" : ":";
List<String> splitEnvVar(String envVar, String defaultValue) =>
getEnvVar(envVar, defaultValue).split(pathVarSeparator);
var pathEnv = splitEnvVar('PATH', '');
var noExtPaths =
pathEnv.map((pathEntry) => context.join(pathEntry, command));
if (!isWindows) return noExtPaths;
pathEnv.insert(0, context.current);
var pathExt = splitEnvVar('PATHEXT', ".EXE");
if (command.contains('.')) pathExt.insert(0, '');
return noExtPaths.expand((commandPath) =>
pathExt.map((pathExtEntry) => commandPath + pathExtEntry));
}
Iterable<String> getRealCandidatePaths(String command) =>
getCandidatePaths(command, Platform.environment, Platform.isWindows, context);