-
Notifications
You must be signed in to change notification settings - Fork 930
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use Directory.EnumerateFiles
instead of Directory.GetFiles
in WhichUtil.
#2882
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -69,6 +69,8 @@ public static class Runner | |
public static readonly OSPlatform Platform = OSPlatform.OSX; | ||
#elif OS_WINDOWS | ||
public static readonly OSPlatform Platform = OSPlatform.Windows; | ||
#else | ||
public static readonly OSPlatform Platform = OSPlatform.Linux; | ||
#endif | ||
|
||
#if X86 | ||
|
@@ -79,6 +81,8 @@ public static class Runner | |
public static readonly Architecture PlatformArchitecture = Architecture.Arm; | ||
#elif ARM64 | ||
public static readonly Architecture PlatformArchitecture = Architecture.Arm64; | ||
#else | ||
public static readonly Architecture PlatformArchitecture = Architecture.X64; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same, help vscode a little bit... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This makes sense and I'm happy to +1 it. Rather than defaulting to X64 in this case, is it possible to, like, raise an error of some kind if we can't determine the system architecture? As a future developer, I'd rather see a compile-time error than have the preprocessor silently assume I'm on X64 when I'm not. (I'm far from a C# preprocessor expert, so I'll defer to your judgment here and +1 whatever you think is best.) |
||
#endif | ||
|
||
public static readonly TimeSpan ExitOnUnloadTimeout = TimeSpan.FromSeconds(30); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -114,6 +114,128 @@ public static string Which(string command, bool require = false, ITraceWriter tr | |
} | ||
} | ||
|
||
#if OS_WINDOWS | ||
trace?.Info($"{command}: command not found. Make sure '{command}' is installed and its location included in the 'Path' environment variable."); | ||
#else | ||
trace?.Info($"{command}: command not found. Make sure '{command}' is installed and its location included in the 'PATH' environment variable."); | ||
#endif | ||
if (require) | ||
{ | ||
throw new FileNotFoundException( | ||
message: $"{command}: command not found", | ||
fileName: command); | ||
} | ||
|
||
return null; | ||
} | ||
|
||
public static string Which2(string command, bool require = false, ITraceWriter trace = null, string prependPath = null) | ||
{ | ||
ArgUtil.NotNullOrEmpty(command, nameof(command)); | ||
trace?.Info($"Which2: '{command}'"); | ||
if (Path.IsPathFullyQualified(command) && File.Exists(command)) | ||
{ | ||
trace?.Info($"Fully qualified path: '{command}'"); | ||
return command; | ||
} | ||
string path = Environment.GetEnvironmentVariable(PathUtil.PathVariable); | ||
if (string.IsNullOrEmpty(path)) | ||
{ | ||
trace?.Info("PATH environment variable not defined."); | ||
path = path ?? string.Empty; | ||
} | ||
if (!string.IsNullOrEmpty(prependPath)) | ||
{ | ||
path = PathUtil.PrependPath(prependPath, path); | ||
} | ||
|
||
string[] pathSegments = path.Split(new Char[] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries); | ||
for (int i = 0; i < pathSegments.Length; i++) | ||
{ | ||
pathSegments[i] = Environment.ExpandEnvironmentVariables(pathSegments[i]); | ||
} | ||
|
||
foreach (string pathSegment in pathSegments) | ||
{ | ||
if (!string.IsNullOrEmpty(pathSegment) && Directory.Exists(pathSegment)) | ||
{ | ||
#if OS_WINDOWS | ||
string pathExt = Environment.GetEnvironmentVariable("PATHEXT"); | ||
if (string.IsNullOrEmpty(pathExt)) | ||
{ | ||
// XP's system default value for PATHEXT system variable | ||
pathExt = ".com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh"; | ||
} | ||
|
||
string[] pathExtSegments = pathExt.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); | ||
|
||
// if command already has an extension. | ||
if (pathExtSegments.Any(ext => command.EndsWith(ext, StringComparison.OrdinalIgnoreCase))) | ||
{ | ||
try | ||
{ | ||
foreach (var file in Directory.EnumerateFiles(pathSegment, command)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
{ | ||
if (IsPathValid(file, trace)) | ||
{ | ||
trace?.Info($"Location: '{file}'"); | ||
return file; | ||
} | ||
} | ||
} | ||
catch (UnauthorizedAccessException ex) | ||
{ | ||
trace?.Info("Ignore UnauthorizedAccess exception during Which."); | ||
trace?.Verbose(ex.ToString()); | ||
} | ||
} | ||
else | ||
{ | ||
string searchPattern; | ||
searchPattern = StringUtil.Format($"{command}.*"); | ||
try | ||
{ | ||
foreach (var file in Directory.EnumerateFiles(pathSegment, searchPattern)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
{ | ||
// add extension. | ||
for (int i = 0; i < pathExtSegments.Length; i++) | ||
{ | ||
string fullPath = Path.Combine(pathSegment, $"{command}{pathExtSegments[i]}"); | ||
if (string.Equals(file, fullPath, StringComparison.OrdinalIgnoreCase) && IsPathValid(fullPath, trace)) | ||
{ | ||
trace?.Info($"Location: '{fullPath}'"); | ||
return fullPath; | ||
} | ||
} | ||
} | ||
} | ||
catch (UnauthorizedAccessException ex) | ||
{ | ||
trace?.Info("Ignore UnauthorizedAccess exception during Which."); | ||
trace?.Verbose(ex.ToString()); | ||
} | ||
} | ||
#else | ||
try | ||
{ | ||
foreach (var file in Directory.EnumerateFiles(pathSegment, command)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
{ | ||
if (IsPathValid(file, trace)) | ||
{ | ||
trace?.Info($"Location: '{file}'"); | ||
return file; | ||
} | ||
} | ||
} | ||
catch (UnauthorizedAccessException ex) | ||
{ | ||
trace?.Info("Ignore UnauthorizedAccess exception during Which."); | ||
trace?.Verbose(ex.ToString()); | ||
} | ||
#endif | ||
} | ||
} | ||
|
||
#if OS_WINDOWS | ||
trace?.Info($"{command}: command not found. Make sure '{command}' is installed and its location included in the 'Path' environment variable."); | ||
#else | ||
|
@@ -134,7 +256,12 @@ private static bool IsPathValid(string path, ITraceWriter trace = null) | |
{ | ||
var fileInfo = new FileInfo(path); | ||
var linkTargetFullPath = fileInfo.Directory?.FullName + Path.DirectorySeparatorChar + fileInfo.LinkTarget; | ||
if (fileInfo.LinkTarget == null || File.Exists(linkTargetFullPath) || File.Exists(fileInfo.LinkTarget)) return true; | ||
if (fileInfo.LinkTarget == null || | ||
File.Exists(linkTargetFullPath) || | ||
File.Exists(fileInfo.LinkTarget)) | ||
{ | ||
return true; | ||
} | ||
trace?.Info($"the target '{fileInfo.LinkTarget}' of the symbolic link '{path}', does not exist"); | ||
return false; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
add a
#else
to provide default value, so VSCode won't barking on us.