-
Notifications
You must be signed in to change notification settings - Fork 8.1k
Clean up ShellExecute code to use the .NET Core implementation #4523
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
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe cache the value in a variable instead of looking it up twice in the same method.
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.
Updated the code to cache the value in Platform.IsWindowsDesktop.
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.
@daxian-dbw This does not seem to be fixed.
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.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we use Platform.IsWindowsDesktop here?
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.
Sure. Will update the code.
| xdg-mime default nativeCommandProcessor.desktop text/plain | ||
| } | ||
| } | ||
| elseif ($IsWindows) { |
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.
We can use Platform.IsWindowsDesktop if it is made public.
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.
Good point. Will update.
| & $dllFile | ||
| throw "No Exception!" | ||
| } catch { | ||
| $_.FullyQualifiedErrorId | should be "NativeCommandFailed" |
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.
Use ShouldBeErroId. Example :
| { & $testdrive/test.ps1 } | ShouldBeErrorId "Argument" |
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.
Fixed.
| } | ||
| } | ||
|
|
||
| internal static bool IsWindowsDesktop |
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.
Should we consider making this public? This will be very useful in tests.
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.
Done.
| & $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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe use quotas - "notepad"?
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.
OK, will update.
| 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we move this in AfterAll?
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.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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) |
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.
@daxian-dbw This does not seem to be fixed.
adityapatwardhan
left a comment
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.
LGTM
iSazonov
left a comment
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.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is obvious comment. Please add in the comment why we do this.
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.
Fixed. More comment added to Cleanup() to explain what we are cleaning up.
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.
Closed.
| this.Command.Context.EngineHostInterface.NotifyEndApplication(); | ||
| } | ||
| // Do the clean up... | ||
| // Do the cleanup... |
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.
Again obvious comment. Please remove or enhance.
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.
Fixed.
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.
Closed.
| #else | ||
| if (Platform.IsNanoServer) | ||
| return false; | ||
| if (!Platform.IsWindowsDesktop) { 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.
Formatting - Can we use the one line pattern for if?
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.
Yes, as long as the if block is a single simple statement like this one.
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.
Closed.
| 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We use "notepad" in three lines (66, 68, 69 and maybe 65) so maybe use a variable?
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.
Fixed.
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.
Closed.
|
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. |
adityapatwardhan
left a comment
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.
LGTM
|
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