Skip to content

Commit 4e53840

Browse files
author
William Li
committed
Fix nuget config not being honored
Copy user level nuget config to override folder
1 parent d48a33a commit 4e53840

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

src/Cli/dotnet/SudoEnvironmentDirectoryOverride.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
using System;
55
using System.CommandLine.Parsing;
66
using System.IO;
7+
using System.Linq;
8+
using Microsoft.DotNet.Cli.Utils;
9+
using NuGet.Common;
10+
using NuGet.Configuration;
711

812
namespace Microsoft.DotNet.Cli
913
{
@@ -33,7 +37,57 @@ public static void OverrideEnvironmentVariableToTmp(ParseResult parseResult)
3337
if (!OperatingSystem.IsWindows() && IsRunningUnderSudo() && IsRunningWorkloadCommand(parseResult))
3438
{
3539
Directory.CreateDirectory(SudoHomeDirectory);
40+
41+
var homeBeforeOverride = Path.Combine(Environment.GetEnvironmentVariable("HOME"));
3642
Environment.SetEnvironmentVariable("HOME", SudoHomeDirectory);
43+
44+
CopyUserNuGetConfigToOverridenHome(homeBeforeOverride);
45+
}
46+
}
47+
48+
/// <summary>
49+
/// To make NuGet honor the user's NuGet config file.
50+
/// Copying instead of using the file directoy to avoid existing file being set higher permission
51+
/// Try to delete the existing NuGet config file in "/tmp/dotnet_sudo_home/"
52+
/// to avoid different user's NuGet config getting mixed.
53+
/// </summary>
54+
private static void CopyUserNuGetConfigToOverridenHome(string homeBeforeOverride)
55+
{
56+
// https://github.com/NuGet/NuGet.Client/blob/dev/src/NuGet.Core/NuGet.Common/PathUtil/NuGetEnvironment.cs#L139
57+
// home is cache in NuGet we cannot directly use the call
58+
var userSettingsDir = Path.Combine(homeBeforeOverride, ".nuget", "NuGet");
59+
60+
string userNuGetConfig = Settings.OrderedSettingsFileNames
61+
.Select(fileName => Path.Combine(userSettingsDir, fileName))
62+
.FirstOrDefault(f => File.Exists(f));
63+
64+
var overridenSettingsDir = NuGetEnvironment.GetFolderPath(NuGetFolderPath.UserSettingsDirectory);
65+
var overridenNugetConfig = Path.Combine(overridenSettingsDir, Settings.DefaultSettingsFileName);
66+
67+
if (File.Exists(overridenNugetConfig))
68+
{
69+
try
70+
{
71+
FileAccessRetrier.RetryOnIOException(
72+
() => File.Delete(overridenNugetConfig));
73+
}
74+
catch
75+
{
76+
// best effort to remove
77+
}
78+
}
79+
80+
if (userNuGetConfig != default)
81+
{
82+
try
83+
{
84+
FileAccessRetrier.RetryOnIOException(
85+
() => File.Copy(userNuGetConfig, overridenNugetConfig, overwrite: true));
86+
}
87+
catch
88+
{
89+
// best effort to copy
90+
}
3791
}
3892
}
3993

0 commit comments

Comments
 (0)