Support expanding ~ in $env:PATH when doing command discovery (#11552)

This commit is contained in:
Steve Lee
2020-01-14 10:24:26 -08:00
committed by Andrew
parent 1484749f04
commit de2d34b2ad
2 changed files with 67 additions and 26 deletions
@@ -888,7 +888,7 @@ namespace System.Management.Automation
It attempts to load modules from a fixed ModulesWithJobSourceAdapters list that currently has only `PSScheduledJob` module that is not PS-Core compatible.
Because this function does not check the result of a (currently failing) `PSScheduledJob` module autoload, it provides no value.
After discussion it was decided to comment out this code as it may be useful if ModulesWithJobSourceAdapters list changes in the future.
if (!context.IsModuleWithJobSourceAdapterLoaded)
{
PSModuleAutoLoadingPreference moduleAutoLoadingPreference = GetCommandDiscoveryPreference(context, SpecialVariables.PSModuleAutoLoadingPreferenceVarPath, "PSModuleAutoLoadingPreference");
@@ -1328,6 +1328,15 @@ namespace System.Management.Automation
foreach (string directory in tokenizedPath)
{
string tempDir = directory.TrimStart();
if (tempDir.EqualsOrdinalIgnoreCase("~"))
{
tempDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
}
else if (tempDir.StartsWith("~" + Path.DirectorySeparatorChar))
{
tempDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + Path.DirectorySeparatorChar + tempDir.Substring(2);
}
_cachedPath.Add(tempDir);
result.Add(tempDir);
}
@@ -3,44 +3,76 @@
Describe "Environment-Variables" -Tags "CI" {
It "Should have environment variables" {
Get-Item ENV: | Should -Not -BeNullOrEmpty
Get-Item ENV: | Should -Not -BeNullOrEmpty
}
It "Should have a nonempty PATH" {
$ENV:PATH | Should -Not -BeNullOrEmpty
$ENV:PATH | Should -Not -BeNullOrEmpty
}
It "Should contain /bin in the PATH" {
if ($IsWindows)
{
$ENV:PATH | Should -Match "C:"
}
else
{
$ENV:PATH | Should -Match "/bin"
}
if ($IsWindows) {
$ENV:PATH | Should -Match "C:"
} else {
$ENV:PATH | Should -Match "/bin"
}
}
It "Should have the correct HOME" {
if ($IsWindows)
{
# \Windows\System32 is found as $env:HOMEPATH for temporary profiles
$expected = "\Users", "\Windows"
Split-Path $ENV:HOMEPATH -Parent | Should -BeIn $expected
}
else
{
$expected = /bin/bash -c "cd ~ && pwd"
$ENV:HOME | Should -Be $expected
}
if ($IsWindows) {
# \Windows\System32 is found as $env:HOMEPATH for temporary profiles
$expected = "\Users", "\Windows"
Split-Path $ENV:HOMEPATH -Parent | Should -BeIn $expected
} else {
$expected = /bin/bash -c "cd ~ && pwd"
$ENV:HOME | Should -Be $expected
}
}
It "Should be able to set the environment variables" {
$expected = "this is a test environment variable"
{ $ENV:TESTENVIRONMENTVARIABLE = $expected } | Should -Not -Throw
$expected = "this is a test environment variable"
{ $ENV:TESTENVIRONMENTVARIABLE = $expected } | Should -Not -Throw
$ENV:TESTENVIRONMENTVARIABLE | Should -Not -BeNullOrEmpty
$ENV:TESTENVIRONMENTVARIABLE | Should -Be $expected
$ENV:TESTENVIRONMENTVARIABLE | Should -Not -BeNullOrEmpty
$ENV:TESTENVIRONMENTVARIABLE | Should -Be $expected
}
Context "~ in PATH" {
AfterEach {
$env:PATH = $oldPath
}
BeforeAll {
$oldPath = $env:PATH
$pwsh = (Get-Command pwsh | Select-Object -First 1).Source
if ($IsWindows) {
$pwsh2 = "pwsh2.exe"
} else {
$pwsh2 = "pwsh2"
}
Copy-Item -Path $pwsh -Destination "~/$pwsh2"
$testPath = Join-Path -Path "~" -ChildPath (New-Guid)
New-Item -Path $testPath -ItemType Directory > $null
Copy-Item -Path $pwsh -Destination "$testPath/$pwsh2"
}
AfterAll {
Remove-Item -Path "~/pwsh2" -Force
Remove-Item -Path $testPath -Recurse -Force
}
It "Should be able to resolve ~ in PATH" {
$env:PATH = "~" + [System.IO.Path]::PathSeparator + $env:PATH
$out = Get-Command pwsh2
$out.Source | Should -BeExactly (Join-Path -Path ([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile)) -ChildPath $pwsh2)
}
It "Should be able to resolve ~/folder in PATH" {
$env:PATH = $testPath + [System.IO.Path]::PathSeparator + $env:PATH
$out = Get-Command pwsh2
$out.Source | Should -BeExactly (Join-Path -Path (Resolve-Path $testPath) -ChildPath $pwsh2)
}
}
}