/// <summary> /// Loads the machine wide settings. /// </summary> /// <remarks> /// For example, if <paramref name="paths" /> is {"IDE", "Version", "SKU" }, then /// the files loaded are (in the order that they are loaded): /// %programdata%\NuGet\Config\IDE\Version\SKU\*.config /// %programdata%\NuGet\Config\IDE\Version\*.config /// %programdata%\NuGet\Config\IDE\*.config /// %programdata%\NuGet\Config\*.config /// </remarks> /// <param name="root">The file system in which the settings files are read.</param> /// <param name="paths">The additional paths under which to look for settings files.</param> /// <returns>The list of settings read.</returns> public static ISettings LoadMachineWideSettings( string root, params string[] paths) { if (string.IsNullOrEmpty(root)) { throw new ArgumentException("root cannot be null or empty"); } var settingFiles = new List <SettingsFile>(); var combinedPath = Path.Combine(paths); while (true) { // load setting files in directory foreach (var file in FileSystemUtility.GetFilesRelativeToRoot(root, combinedPath, SupportedMachineWideConfigExtension, SearchOption.TopDirectoryOnly)) { var settings = ReadSettings(root, file, isMachineWideSettings: true); if (settings != null) { settingFiles.Add(settings); } } if (combinedPath.Length == 0) { break; } var index = combinedPath.LastIndexOf(Path.DirectorySeparatorChar); if (index < 0) { index = 0; } combinedPath = combinedPath.Substring(0, index); } if (settingFiles.Any()) { SettingsFile.ConnectSettingsFilesLinkedList(settingFiles); return(new Settings(settingFiles.Last())); } return(NullSettings.Instance); }
private static ISettings LoadSettingsForSpecificConfigs( string root, string configFileName, List <SettingsFile> validSettingFiles, IMachineWideSettings machineWideSettings, bool loadUserWideSettings, bool useTestingGlobalPath) { if (loadUserWideSettings) { var userSpecific = LoadUserSpecificSettings(root, configFileName, useTestingGlobalPath); if (userSpecific != null) { validSettingFiles.Add(userSpecific); } } if (machineWideSettings != null && machineWideSettings.Settings is Settings mwSettings && string.IsNullOrEmpty(configFileName)) { // Priority gives you the settings file in the order you want to start reading them validSettingFiles.AddRange( mwSettings.Priority.Select( s => new SettingsFile(s.DirectoryPath, s.FileName, s.IsMachineWide))); } if (validSettingFiles?.Any() != true) { // This means we've failed to load all config files and also failed to load or create the one in %AppData% // Work Item 1531: If the config file is malformed and the constructor throws, NuGet fails to load in VS. // Returning a null instance prevents us from silently failing and also from picking up the wrong config return(NullSettings.Instance); } SettingsFile.ConnectSettingsFilesLinkedList(validSettingFiles); // Create a settings object with the linked list head. Typically, it's either the config file in %ProgramData%\NuGet\Config, // or the user wide config (%APPDATA%\NuGet\nuget.config) if there are no machine // wide config files. The head file is the one we want to read first, while the user wide config // is the one that we want to write to. // TODO: add UI to allow specifying which one to write to return(new Settings(validSettingFiles.Last())); }