Initial XDG support and folder default changes
Conflicts: src/Microsoft.PowerShell.ConsoleHost/host/msh/ConsoleHost.cs
This commit is contained in:
parent
fd649c0f77
commit
54c64c9db6
|
@ -185,14 +185,18 @@ namespace Microsoft.PowerShell
|
|||
{
|
||||
profileDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) +
|
||||
@"\Microsoft\Windows\PowerShell";
|
||||
} else
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
profileDir = System.IO.Path.Combine(Environment.GetEnvironmentVariable("HOME"), ".powershell");
|
||||
//check if the user has set an XDG path in their environment variables
|
||||
profileDir = Platform.SelectProductNameForDirectory("profile");
|
||||
}
|
||||
|
||||
if (!Directory.Exists(profileDir))
|
||||
|
||||
if (!Directory.Exists(profileDir)) //xdg value may have been set but not a valid directory
|
||||
{
|
||||
Directory.CreateDirectory(profileDir);
|
||||
Console.WriteLine("The selected directory for the profile does not exist. Using the default path.");
|
||||
profileDir = Platform.SelectProductNameForDirectory("default");
|
||||
}
|
||||
ClrFacade.SetProfileOptimizationRoot(profileDir);
|
||||
}
|
||||
|
@ -268,7 +272,6 @@ namespace Microsoft.PowerShell
|
|||
: "StartupProfileData-NonInteractive");
|
||||
exitCode = theConsoleHost.Run(cpp, !string.IsNullOrEmpty(preStartWarning));
|
||||
}
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
|
|
@ -178,14 +178,25 @@ namespace Microsoft.PowerShell
|
|||
}
|
||||
else
|
||||
{
|
||||
//PSReadline does not have access to Utils.CorePSPlatform. Must set PSReadline path seperately
|
||||
string modulepath = System.Environment.GetEnvironmentVariable("XDG_CACHE_HOME");
|
||||
|
||||
if (String.IsNullOrEmpty(modulepath))
|
||||
{
|
||||
modulepath = System.IO.Path.Combine(
|
||||
Environment.GetEnvironmentVariable("HOME"),
|
||||
".config/powershell/modules");
|
||||
}
|
||||
|
||||
HistorySavePath = System.IO.Path.Combine(
|
||||
Environment.GetEnvironmentVariable("HOME"),
|
||||
".powershell",
|
||||
modulepath,
|
||||
"PSReadLine",
|
||||
hostName + "_history.txt");
|
||||
}
|
||||
#else
|
||||
HistorySavePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
|
||||
|
||||
}
|
||||
#else
|
||||
HistorySavePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
|
||||
+ @"\Microsoft\Windows\PowerShell\PSReadline\" + hostName + "_history.txt";
|
||||
#endif
|
||||
CommandValidationHandler = null;
|
||||
|
@ -205,7 +216,7 @@ namespace Microsoft.PowerShell
|
|||
"Where-Object", "?", "where",
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public EditMode EditMode { get; set; }
|
||||
|
||||
public string ContinuationPrompt { get; set; }
|
||||
|
|
|
@ -96,8 +96,57 @@ namespace System.Management.Automation
|
|||
"WSMan.format.ps1xml"
|
||||
};
|
||||
|
||||
// directory location of PowerShell for profile loading
|
||||
public static string ProductNameForDirectory = ".powershell";
|
||||
// function for choosing directory location of PowerShell for profile loading
|
||||
public static string SelectProductNameForDirectory (string dir){
|
||||
|
||||
string xdgconfighome = System.Environment.GetEnvironmentVariable("XDG_CONFIG_HOME");
|
||||
string xdgdatahome = System.Environment.GetEnvironmentVariable("XDG_DATA_HOME");
|
||||
string xdgcachehome = System.Environment.GetEnvironmentVariable("XDG_CACHE_HOME");
|
||||
|
||||
|
||||
//the user has set XDG_CONFIG_HOME corrresponding to profile path
|
||||
if (!String.IsNullOrEmpty(xdgconfighome) && dir == "profile")
|
||||
{
|
||||
return xdgconfighome;
|
||||
}
|
||||
|
||||
//the user has set XDG_DATA_HOME corresponding to module path
|
||||
if (!String.IsNullOrEmpty(xdgdatahome) && dir == "modules")
|
||||
{
|
||||
return xdgdatahome;
|
||||
}
|
||||
|
||||
//the user has set XDG_CACHE_HOME
|
||||
if (!String.IsNullOrEmpty(xdgcachehome) && dir == "history")
|
||||
{
|
||||
return xdgcachehome;
|
||||
}
|
||||
|
||||
if (dir == "default")
|
||||
{
|
||||
return @".config/powershell";
|
||||
}
|
||||
//the user has set XDG_DATA_HOME
|
||||
else //xdg values have not been set
|
||||
{
|
||||
if (dir == "profile" || dir == "history")
|
||||
{
|
||||
return @".config/powershell"; //default on Linux
|
||||
}
|
||||
if (dir == "modules")
|
||||
{
|
||||
if (!Directory.Exists(@".config/powershell/modules"))
|
||||
{
|
||||
Directory.CreateDirectory(@".config/powershell/modules");
|
||||
|
||||
}
|
||||
|
||||
return @".config/powershell/modules"; //default on Linux
|
||||
}
|
||||
|
||||
return @".config/powershell";
|
||||
}
|
||||
}
|
||||
|
||||
// ComObjectType is null on CoreCLR for Linux since there is
|
||||
// no COM support on Linux
|
||||
|
|
|
@ -548,12 +548,7 @@ namespace System.Management.Automation
|
|||
/// <returns>personal module path</returns>
|
||||
internal static string GetPersonalModulePath()
|
||||
{
|
||||
string personalModuleRoot = Path.Combine(
|
||||
Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
|
||||
Utils.ProductNameForDirectory),
|
||||
Utils.ModuleDirectory);
|
||||
|
||||
string personalModuleRoot = Platform.SelectProductNameForDirectory("modules");
|
||||
return personalModuleRoot;
|
||||
}
|
||||
|
||||
|
@ -597,6 +592,7 @@ namespace System.Management.Automation
|
|||
psHome = psHome.ToLowerInvariant().Replace("\\syswow64\\", "\\system32\\");
|
||||
}
|
||||
Interlocked.CompareExchange(ref SystemWideModulePath, Path.Combine(psHome, Utils.ModuleDirectory), null);
|
||||
|
||||
}
|
||||
|
||||
return SystemWideModulePath;
|
||||
|
|
|
@ -606,13 +606,13 @@ namespace System.Management.Automation
|
|||
/// Profile uses this to control profile loading.
|
||||
/// </remarks>
|
||||
internal static string ProductNameForDirectory =
|
||||
Platform.IsWindows ? "WindowsPowerShell" : Platform.ProductNameForDirectory;
|
||||
Platform.IsWindows ? "WindowsPowerShell" : Platform.SelectProductNameForDirectory("profile");
|
||||
|
||||
/// <summary>
|
||||
/// The name of the subdirectory that contains packages.
|
||||
/// </summary>
|
||||
internal static string ModuleDirectory = "Modules";
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The partial path to the DSC module directory
|
||||
/// </summary>
|
||||
|
|
|
@ -152,6 +152,7 @@ namespace System.Management.Automation
|
|||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
command = new PSCommand();
|
||||
command.AddCommand(profilePath, false);
|
||||
commands.Add(command);
|
||||
|
@ -186,7 +187,14 @@ namespace System.Management.Automation
|
|||
{
|
||||
basePath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
|
||||
basePath = IO.Path.Combine(basePath, Utils.ProductNameForDirectory);
|
||||
|
||||
//If the profile path doesn't exist, create it.
|
||||
if (!System.IO.Directory.Exists(basePath))
|
||||
{
|
||||
System.IO.Directory.CreateDirectory(basePath);
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
basePath = GetAllUsersFolderPath(shellId);
|
||||
|
@ -198,7 +206,6 @@ namespace System.Management.Automation
|
|||
|
||||
string profileName = useTestProfile ? "profile_test.ps1" : "profile.ps1";
|
||||
|
||||
|
||||
if (!string.IsNullOrEmpty(shellId))
|
||||
{
|
||||
profileName = shellId + "_" + profileName;
|
||||
|
|
Loading…
Reference in a new issue