diff --git a/src/NuGet.Core/NuGet.Configuration/PackageSource/NuGetConstants.cs b/src/NuGet.Core/NuGet.Configuration/PackageSource/NuGetConstants.cs index 16887563ad3..4f913ed5eb8 100644 --- a/src/NuGet.Core/NuGet.Configuration/PackageSource/NuGetConstants.cs +++ b/src/NuGet.Core/NuGet.Configuration/PackageSource/NuGetConstants.cs @@ -23,6 +23,8 @@ public static class NuGetConstants public static readonly string FeedName = "nuget.org"; + public static readonly string AddV3TrackFile = "nugetorgadd.trk"; + public static readonly string DefaultConfigContent = @" diff --git a/src/NuGet.Core/NuGet.Configuration/Settings/Settings.cs b/src/NuGet.Core/NuGet.Configuration/Settings/Settings.cs index 308ea8b6e73..4b51fcb46a0 100644 --- a/src/NuGet.Core/NuGet.Configuration/Settings/Settings.cs +++ b/src/NuGet.Core/NuGet.Configuration/Settings/Settings.cs @@ -291,6 +291,20 @@ bool useTestingGlobalPath else { appDataSettings = ReadSettings(root, defaultSettingsFilePath); + bool IsEmptyConfig = !appDataSettings.GetSettingValues(ConfigurationConstants.PackageSources).Any(); + + if (IsEmptyConfig) + { + var trackFilePath = Path.Combine(Path.GetDirectoryName(defaultSettingsFilePath), NuGetConstants.AddV3TrackFile); + + if (!File.Exists(trackFilePath)) + { + File.Create(trackFilePath).Dispose(); + var defaultPackageSource = new SettingValue(NuGetConstants.FeedName, NuGetConstants.V3FeedUrl, isMachineWide: false); + defaultPackageSource.AdditionalData.Add(ConfigurationConstants.ProtocolVersionAttribute, "3"); + appDataSettings.UpdateSections(ConfigurationConstants.PackageSources, new List { defaultPackageSource }); + } + } } } else diff --git a/test/NuGet.Core.Tests/NuGet.Configuration.Test/SettingsTests.cs b/test/NuGet.Core.Tests/NuGet.Configuration.Test/SettingsTests.cs index 05d99aa80b9..0659b37972d 100644 --- a/test/NuGet.Core.Tests/NuGet.Configuration.Test/SettingsTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Configuration.Test/SettingsTests.cs @@ -2236,6 +2236,46 @@ public void CreateNewConfigFileIfNoConfig() } } + [Fact] + public void AddV3ToEmptyConfigFile() + { + using (var mockBaseDirectory = TestFileSystemUtility.CreateRandomTestFolder()) + { + // Arrange + var config = @" + +"; + + var nugetConfigPath = "NuGet.Config"; + ConfigurationFileTestUtility.CreateConfigurationFile(nugetConfigPath, + Path.Combine(mockBaseDirectory, "TestingGlobalPath"), config); + + // Act + var settings = Settings.LoadDefaultSettings(mockBaseDirectory, null, null, true, true); + + // Assert + var text = File.ReadAllText(Path.Combine(mockBaseDirectory, "TestingGlobalPath", "NuGet.Config")).Replace("\r\n", "\n"); + var result = @" + + + + +".Replace("\r\n", "\n"); + Assert.Equal(result, text); + + // Act + settings.DeleteSection("packageSources"); + settings = Settings.LoadDefaultSettings(mockBaseDirectory, null, null, true, true); + + // Assert + text = File.ReadAllText(Path.Combine(mockBaseDirectory, "TestingGlobalPath" , "NuGet.Config")).Replace("\r\n", "\n"); + result = @" + +".Replace("\r\n", "\n"); + Assert.Equal(result, text); + } + } + [Fact] public void LoadNuGetConfig_InvalidXmlThrowException() {