Add ItemSeparator and AltItemSeparator properties in ProviderInfo (#8587)

Add two properties in `ProviderInfo` class: `ItemSeparator` and `AltItemSeparator`.
On windows, the default values for those two properties are `ItemSeparator = '\'` and `AltItemSeparator = '/'`.
On unix, the default values for those two properties are `ItemSeparator = '/'` and `AltItemSeparator = '\'`.

Registry provider is the only exception, both properties for it have the value `\`.
This commit is contained in:
Rene Hernandez
2019-04-02 09:59:36 -07:00
committed by Dongbo Wang
parent 34fa5e472d
commit 75da390d1e
8 changed files with 96 additions and 2 deletions
@@ -942,6 +942,7 @@ namespace Microsoft.PowerShell.Commands
StoreLocation.LocalMachine);
WriteItemObject(outStore, path, true);
}
#region DriveCmdletProvider overrides
/// <summary>
@@ -259,6 +259,16 @@ namespace System.Management.Automation
/// </summary>
public bool VolumeSeparatedByColon { get; internal set; } = true;
/// <summary>
/// Gets the default item separator character for this provider.
/// </summary>
public char ItemSeparator { get; private set; }
/// <summary>
/// Gets the alternate item separator character for this provider.
/// </summary>
public char AltItemSeparator { get; private set; }
/// <summary>
/// Constructs an instance of the class using an existing reference
/// as a template.
@@ -292,6 +302,8 @@ namespace System.Management.Automation
PSSnapIn = providerInfo.PSSnapIn;
_sessionState = providerInfo._sessionState;
VolumeSeparatedByColon = providerInfo.VolumeSeparatedByColon;
ItemSeparator = providerInfo.ItemSeparator;
AltItemSeparator = providerInfo.AltItemSeparator;
}
/// <summary>
@@ -606,6 +618,8 @@ namespace System.Management.Automation
}
Provider.CmdletProvider result = providerInstance as Provider.CmdletProvider;
ItemSeparator = result.ItemSeparator;
AltItemSeparator = result.AltItemSeparator;
Dbg.Diagnostics.Assert(
result != null,
@@ -316,6 +316,7 @@ namespace Microsoft.PowerShell.Commands
return result;
}
#endregion protected members
}
@@ -340,8 +340,9 @@ namespace Microsoft.PowerShell.Commands
#endregion
#region CmdletProvider members
/// <summary>
/// Starts the File System provider. This method sets the Home for the
/// Starts the File System provider. This method sets the Home for the
/// provider to providerInfo.Home if specified, and %USERPROFILE%
/// otherwise.
/// </summary>
@@ -354,7 +355,7 @@ namespace Microsoft.PowerShell.Commands
protected override ProviderInfo Start(ProviderInfo providerInfo)
{
// Set the home folder for the user
if (providerInfo != null && string.IsNullOrEmpty(providerInfo.Home))
if (providerInfo != null && string.IsNullOrEmpty(providerInfo.Home))
{
// %USERPROFILE% - indicate where a user's home directory is located in the file system.
string homeDirectory = Environment.GetEnvironmentVariable(Platform.CommonEnvVariableNames.Home);
@@ -5,6 +5,7 @@
#pragma warning disable 56506
using System.Collections.ObjectModel;
using System.IO;
using System.Management.Automation.Runspaces;
using System.Management.Automation.Internal;
using System.Management.Automation.Host;
@@ -1384,6 +1385,21 @@ namespace System.Management.Automation.Provider
}
}
/// <summary>
/// Gets the default item separator character for this provider.
/// </summary>
public virtual char ItemSeparator => Path.DirectorySeparatorChar;
/// <summary>
/// Gets the alternate item separator character for this provider.
/// </summary>
public virtual char AltItemSeparator =>
#if UNIX
Utils.Separators.Backslash[0];
#else
Path.AltDirectorySeparatorChar;
#endif
#region IResourceSupplier
/// <summary>
/// Gets the resource string corresponding to baseName and
@@ -86,6 +86,15 @@ namespace Microsoft.PowerShell.Commands
/// </summary>
public const string ProviderName = "Registry";
#region CmdletProvider overrides
/// <summary>
/// Gets the alternate item separator character for this provider.
/// </summary>
public override char AltItemSeparator => ItemSeparator;
#endregion
#region DriveCmdletProvider overrides
/// <summary>
@@ -24,4 +24,43 @@ Describe "Get-PSProvider" -Tags "CI" {
{ $actual | Format-List } | Should -Not -Throw
}
Context 'ItemSeparator properties' {
BeforeAll {
$testCases = if ($IsWindows) {
@(
@{Provider = 'FileSystem'; ItemSeparator = '\'; AltItemSeparator = '/'}
@{Provider = 'Variable'; ItemSeparator = '\'; AltItemSeparator = '/'}
@{Provider = 'Function'; ItemSeparator = '\'; AltItemSeparator = '/'}
@{Provider = 'Alias'; ItemSeparator = '\'; AltItemSeparator = '/'}
@{Provider = 'Environment'; ItemSeparator = '\'; AltItemSeparator = '/'}
@{Provider = 'Certificate'; ItemSeparator = '\'; AltItemSeparator = '/'}
@{Provider = 'Registry'; ItemSeparator = '\'; AltItemSeparator = '\'}
)
}
else {
@(
@{Provider = 'FileSystem'; ItemSeparator = '/'; AltItemSeparator = '\'}
@{Provider = 'Variable'; ItemSeparator = '/'; AltItemSeparator = '\'}
@{Provider = 'Function'; ItemSeparator = '/'; AltItemSeparator = '\'}
@{Provider = 'Alias'; ItemSeparator = '/'; AltItemSeparator = '\'}
@{Provider = 'Environment'; ItemSeparator = '/'; AltItemSeparator = '\'}
)
}
}
It '<Provider> provider has ItemSeparator properties' -TestCases $testCases {
param ($Provider, $ItemSeparator, $AltItemSeparator)
(Get-PSProvider $Provider).ItemSeparator | Should -Be $ItemSeparator
(Get-PSProvider $Provider).AltItemSeparator | Should -Be $AltItemSeparator
}
It 'ItemSeparator properties is read-only in <Provider> provider' -TestCases $testCases {
param ($Provider, $ItemSeparator, $AltItemSeparator)
{ (Get-PSProvider $Provider).ItemSeparator = $null } | Should -Throw
{ (Get-PSProvider $Provider).AltItemSeparator = $null } | Should -Throw
}
}
}
@@ -439,4 +439,17 @@ Describe "WSMan Config Provider" -Tag Feature,RequireAdminOnWindows {
}
}
}
Context 'ItemSeparator properties' {
It 'WSMan provider has ItemSeparator properties' {
(Get-PSProvider WSMan).ItemSeparator | Should -Be '\'
(Get-PSProvider WSMan).AltItemSeparator | Should -Be '/'
}
It 'ItemSeparator properties is read-only in WSMan provider' {
{ (Get-PSProvider WSMan).ItemSeparator = $null } | Should -Throw
{ (Get-PSProvider WSMan).AltItemSeparator = $null } | Should -Throw
}
}
}