Clean up ShellExecute code to use the .NET Core implementation#4523
Clean up ShellExecute code to use the .NET Core implementation#4523adityapatwardhan merged 7 commits intoPowerShell:masterfrom
Conversation
|
|
||
| // -Verb and -WindowStyle are not supported on non-Windows platforms as well as Windows headless SKUs | ||
| if (_isOnFullWinSku) | ||
| if (Platform.IsWindowsDesktop) |
There was a problem hiding this comment.
Maybe cache the value in a variable instead of looking it up twice in the same method.
There was a problem hiding this comment.
Updated the code to cache the value in Platform.IsWindowsDesktop.
There was a problem hiding this comment.
The value is cached in a static field in Platform.IsWindowsDesktop property.
| #else | ||
| ShellExecuteHelper.Start(invokeProcess.StartInfo); | ||
| // Use ShellExecute when it's not a headless SKU | ||
| invokeProcess.StartInfo.UseShellExecute = !Platform.IsNanoServer && !Platform.IsIoT; |
There was a problem hiding this comment.
Can we use Platform.IsWindowsDesktop here?
There was a problem hiding this comment.
Sure. Will update the code.
| xdg-mime default nativeCommandProcessor.desktop text/plain | ||
| } | ||
| } | ||
| elseif ($IsWindows) { |
There was a problem hiding this comment.
We can use Platform.IsWindowsDesktop if it is made public.
There was a problem hiding this comment.
Good point. Will update.
| & $dllFile | ||
| throw "No Exception!" | ||
| } catch { | ||
| $_.FullyQualifiedErrorId | should be "NativeCommandFailed" |
There was a problem hiding this comment.
Use ShouldBeErroId. Example :
| } | ||
| } | ||
|
|
||
| internal static bool IsWindowsDesktop |
There was a problem hiding this comment.
Should we consider making this public? This will be very useful in tests.
| & $TestFile | ||
| $startTime = Get-Date | ||
| # It may take time for handler to start | ||
| while (((Get-Date) - $startTime).TotalSeconds -lt 10 -and (-not (Test-Path "$HOME/nativeCommandProcessor.Success"))) { |
There was a problem hiding this comment.
Polling for a file can be a common pattern. Consider implementing a generic file watcher function in HelpersCommon.psm1
There was a problem hiding this comment.
Sounds reasonable. Opened #4524. Will address in a separate PR.
1ffa36b to
7d375eb
Compare
| Get-Process -Name notepad | Stop-Process -Force | ||
| Invoke-Item -Path $notepad | ||
| $notepadProcess = Get-Process -Name notepad | ||
| $notepadProcess.Name | Should Be notepad |
There was a problem hiding this comment.
Maybe use quotas - "notepad"?
| Invoke-Item -Path $notepad | ||
| $notepadProcess = Get-Process -Name notepad | ||
| $notepadProcess.Name | Should Be notepad | ||
| Stop-Process -InputObject $notepadProcess |
There was a problem hiding this comment.
Should we move this in AfterAll?
There was a problem hiding this comment.
I think it should stay here, as it's specific to this test when running on full desktop.
There was a problem hiding this comment.
I don't like commands after Should 😄
|
There are 2 failures in AppVeyor feature test run and both are related to |
|
@adityapatwardhan @iSazonov Your comments have been addressed. Please take another look. Thanks! |
|
|
||
| // -Verb and -WindowStyle are not supported on non-Windows platforms as well as Windows headless SKUs | ||
| if (_isOnFullWinSku) | ||
| if (Platform.IsWindowsDesktop) |
iSazonov
left a comment
There was a problem hiding this comment.
Since the PR is a cleanup we could add fix - we use "UseShellExecute" constant three times in Process.cs and could move it to private static variable.
| } | ||
| catch (Exception) | ||
| { | ||
| // Do the cleanup and rethrow the exception |
There was a problem hiding this comment.
It is obvious comment. Please add in the comment why we do this.
There was a problem hiding this comment.
Fixed. More comment added to Cleanup() to explain what we are cleaning up.
| this.Command.Context.EngineHostInterface.NotifyEndApplication(); | ||
| } | ||
| // Do the clean up... | ||
| // Do the cleanup... |
There was a problem hiding this comment.
Again obvious comment. Please remove or enhance.
| #else | ||
| if (Platform.IsNanoServer) | ||
| return false; | ||
| if (!Platform.IsWindowsDesktop) { return false; } |
There was a problem hiding this comment.
Formatting - Can we use the one line pattern for if?
There was a problem hiding this comment.
Yes, as long as the if block is a single simple statement like this one.
| Get-Process -Name notepad | Stop-Process -Force | ||
| Invoke-Item -Path $notepad | ||
| $notepadProcess = Get-Process -Name notepad | ||
| $notepadProcess.Name | Should Be "notepad" |
There was a problem hiding this comment.
We use "notepad" in three lines (66, 68, 69 and maybe 65) so maybe use a variable?
|
The "Default" constant string is used in 9 places and should be cleaned too (change to const variable, instead of static). But I think they should be in separate PRs as they will introduce too many diffs and make it hard to see the focus of this PR. |
|
LGTM. |
|
@iSazonov @adityapatwardhan Thanks for the review! Aditya, can you please merge this PR? My follow-up work on the file watcher test helper needs to update the tests in this PR (#4524). |
Fix #4499
This PR includes following major changes:
ProcessStartInfo.UseShellExecuteis now supported in .NET Core on Windows. So we need to remove our implementation ofShellExecuteand use the .NET Core API directly.NativeCommandProcessorto open files using default program associated with the shell.NativeCommandProcessorto properly clean up in case an exception is thrown inPrepareandProcessRecord.Note that,
UseShellExecuteworks as full .NET on windows desktop, but it doesn't work properly on Unix and the improvement work is tracked by dotnet/corefx#19956. So on Linux/OSX, we still need to rely onxdg-open/open