private bool PathIsAbsolute(Path path) { string drive = null; if (path.TryGetDriveName(out drive)) { // TODO: workaround to be removed when we completeley remove the Path class and // use PathIntrinsics instead if (System.IO.Path.DirectorySeparatorChar == '\\' && path.StartsWithSlash()) { return false; } return true; } return false; }
internal PathInfo SetLocation(Path path, ProviderRuntime providerRuntime) { // TODO: deal with paths starting with ".\" if (path == null) { throw new NullReferenceException("Path can't be null"); } if (path == "~") { // Older Mono versions (sadly the one that's currently still // available) have a bug where GetFolderPath returns an empty // string for most SpecialFolder values, but only on // non-Windows. // See: https://bugzilla.xamarin.com/show_bug.cgi?id=2873 path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); // HACK: Use $Env:HOME until Mono 2.10 dies out. if (path == "") path = Environment.GetEnvironmentVariable("HOME"); } PSDriveInfo nextDrive = CurrentDrive; path = path.NormalizeSlashes(); string driveName = null; if (path.TryGetDriveName(out driveName)) { try { nextDrive = _executionContext.SessionState.Drive.Get(driveName); } catch (MethodInvocationException) //didn't find a drive (maybe it's "\" on Windows) { nextDrive = CurrentDrive; } } Path newLocation = PathNavigation.CalculateFullPath(nextDrive.CurrentLocation, path); // I'm not a fan of this block of code. // The goal here is to throw an exception if trying to "CD" into an invalid location // // Not sure why the providerInstances are returned as a collection. Feels like given a // path we should have one provider we're talking to. if (_providerInstances.ContainsKey(nextDrive.Provider.Name)) { bool pathExists = false; IEnumerable<ItemCmdletProvider> cmdletProviders = _providerInstances[nextDrive.Provider.Name].Where(x => x is ItemCmdletProvider).Cast<ItemCmdletProvider>(); ItemCmdletProvider currentProvider = null; foreach (var provider in cmdletProviders) { if (provider.ItemExists(newLocation, providerRuntime)) { pathExists = true; currentProvider = provider; break; } } if (!pathExists) { throw new Exception(string.Format("Cannot find path '{0}' because it does not exist.", newLocation)); } else { if (currentProvider is FileSystemProvider) { System.Environment.CurrentDirectory = newLocation; } } } else { throw new NotImplementedException("Unsure how to set location with provider:" + nextDrive.Provider.Name); } nextDrive.CurrentLocation = newLocation; CurrentDrive = nextDrive; _providersCurrentDrive[CurrentDrive.Provider] = CurrentDrive; return CurrentLocation; }
internal PathInfo SetLocation(Path path, ProviderRuntime providerRuntime) { // TODO: deal with paths starting with ".\" if (path == null) { throw new NullReferenceException("Path can't be null"); } PSDriveInfo nextDrive = CurrentDrive; path = path.NormalizeSlashes(); string driveName = null; if (path.TryGetDriveName(out driveName)) { nextDrive = GetDrive(driveName); } if (nextDrive == null) { nextDrive = CurrentDrive; } Path newLocation = PathNavigation.CalculateFullPath(nextDrive.CurrentLocation, path); // I'm not a fan of this block of code. // The goal here is to throw an exception if trying to "CD" into an invalid location // // Not sure why the providerInstances are returned as a collection. Feels like given a // path we should have one provider we're talking to. if (_providerInstances.ContainsKey(nextDrive.Provider.Name)) { bool pathExists = false; IEnumerable<ItemCmdletProvider> cmdletProviders = _providerInstances[nextDrive.Provider.Name].Where(x => x is ItemCmdletProvider).Cast<ItemCmdletProvider>(); ItemCmdletProvider currentProvider = null; foreach (var provider in cmdletProviders) { if (provider.ItemExists(newLocation, providerRuntime)) { pathExists = true; currentProvider = provider; break; } } if (!pathExists) { throw new Exception(string.Format("Cannot find path '{0}' because it does not exist.", newLocation)); } else { if (currentProvider is FileSystemProvider) { System.Environment.CurrentDirectory = newLocation; } } } else { throw new NotImplementedException("Unsure how to set location with provider:" + nextDrive.Provider.Name); } nextDrive.CurrentLocation = newLocation; CurrentDrive = nextDrive; _providersCurrentDrive[CurrentDrive.Provider] = CurrentDrive; return CurrentLocation; }