Skip to content

Commit 44ce576

Browse files
apenevejoelverhagen
authored andcommitted
Configurable cache file name (#49)
* Added support for custom cache file name. Handy when you have configured two feeds pointing to the same packages folder. * added some air after commas in type parameter * added curlies, even on one liners * renamed misleading InitializeServerPackageStore method to InitializeServerPackageCache * Updated XML comment explaining the custom cache file name option * Throwing up on invalid cache file name. Added tests to prove it. * compacting test arrange code
1 parent 135a920 commit 44ce576

11 files changed

Lines changed: 165 additions & 17 deletions

File tree

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
using System;
34
using System.Collections.Generic;
45
using NuGet.Server.Core.Infrastructure;
56

67
namespace NuGet.Server.V2.Samples.OwinHost
78
{
89
public class DictionarySettingsProvider : ISettingsProvider
910
{
10-
readonly Dictionary<string, bool> _settings;
11+
readonly Dictionary<string, object> _settings;
1112

12-
public DictionarySettingsProvider(Dictionary<string, bool> settings)
13+
public DictionarySettingsProvider(Dictionary<string, object> settings)
1314
{
1415
_settings = settings;
1516
}
@@ -18,8 +19,13 @@ public DictionarySettingsProvider(Dictionary<string, bool> settings)
1819
public bool GetBoolSetting(string key, bool defaultValue)
1920
{
2021
System.Diagnostics.Debug.WriteLine("getSetting: " + key);
21-
return _settings.ContainsKey(key) ? _settings[key] : defaultValue;
22+
return _settings.ContainsKey(key) ? Convert.ToBoolean(_settings[key]) : defaultValue;
2223

2324
}
25+
26+
public string GetStringSetting(string key, string defaultValue)
27+
{
28+
return _settings.ContainsKey(key) ? Convert.ToString(_settings[key]) : defaultValue;
29+
}
2430
}
2531
}

samples/NuGet.Server.V2.Samples.OwinHost/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ static void Main(string[] args)
2424

2525
// Set up a common settingsProvider to be used by all repositories.
2626
// If a setting is not present in dictionary default value will be used.
27-
var settings = new Dictionary<string, bool>();
27+
var settings = new Dictionary<string, object>();
2828
settings.Add("enableDelisting", false); //default=false
2929
settings.Add("enableFrameworkFiltering", false); //default=false
3030
settings.Add("ignoreSymbolsPackages", true); //default=false

src/NuGet.Server.Core/Infrastructure/DefaultSettingsProvider.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,10 @@ public bool GetBoolSetting(string key, bool defaultValue)
88
{
99
return defaultValue;
1010
}
11+
12+
public string GetStringSetting(string key, string defaultValue)
13+
{
14+
return defaultValue;
15+
}
1116
}
1217
}

src/NuGet.Server.Core/Infrastructure/ISettingsProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ namespace NuGet.Server.Core.Infrastructure
55
public interface ISettingsProvider
66
{
77
bool GetBoolSetting(string key, bool defaultValue);
8+
string GetStringSetting(string key, string defaultValue);
89
}
910
}

src/NuGet.Server.Core/Infrastructure/ServerPackageRepository.cs

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public ServerPackageRepository(
5858
_runBackgroundTasks = true;
5959
_settingsProvider = settingsProvider ?? new DefaultSettingsProvider();
6060
_logger = logger ?? new TraceLogger();
61-
_serverPackageCache = InitializeServerPackageStore();
61+
_serverPackageCache = InitializeServerPackageCache();
6262
_serverPackageStore = new ServerPackageStore(
6363
_fileSystem,
6464
new ExpandedPackageRepository(_fileSystem, hashProvider),
@@ -81,7 +81,7 @@ internal ServerPackageRepository(
8181
_runBackgroundTasks = runBackgroundTasks;
8282
_settingsProvider = settingsProvider ?? new DefaultSettingsProvider();
8383
_logger = logger ?? new TraceLogger();
84-
_serverPackageCache = InitializeServerPackageStore();
84+
_serverPackageCache = InitializeServerPackageCache();
8585
_serverPackageStore = new ServerPackageStore(
8686
_fileSystem,
8787
innerRepository,
@@ -105,9 +105,39 @@ internal ServerPackageRepository(
105105
private bool EnableFileSystemMonitoring =>
106106
_settingsProvider.GetBoolSetting("enableFileSystemMonitoring", true);
107107

108-
private ServerPackageCache InitializeServerPackageStore()
108+
private string CacheFileName => _settingsProvider.GetStringSetting("cacheFileName", null);
109+
110+
private ServerPackageCache InitializeServerPackageCache()
109111
{
110-
return new ServerPackageCache(_fileSystem, Environment.MachineName.ToLowerInvariant() + ".cache.bin");
112+
return new ServerPackageCache(_fileSystem, ResolveCacheFileName());
113+
}
114+
115+
private string ResolveCacheFileName()
116+
{
117+
var fileName = CacheFileName;
118+
const string suffix = ".cache.bin";
119+
120+
if (String.IsNullOrWhiteSpace(fileName))
121+
{
122+
// Default file name
123+
return Environment.MachineName.ToLowerInvariant() + suffix;
124+
}
125+
126+
if (fileName.LastIndexOfAny(Path.GetInvalidFileNameChars()) > 0)
127+
{
128+
var message = string.Format(Strings.Error_InvalidCacheFileName, fileName);
129+
130+
_logger.Log(LogLevel.Error, message);
131+
132+
throw new InvalidOperationException(message);
133+
}
134+
135+
if (fileName.EndsWith(suffix, StringComparison.OrdinalIgnoreCase))
136+
{
137+
return fileName;
138+
}
139+
140+
return fileName + suffix;
111141
}
112142

113143
/// <summary>

src/NuGet.Server.Core/Strings.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/NuGet.Server.Core/Strings.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@
117117
<resheader name="writer">
118118
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
119119
</resheader>
120+
<data name="Error_InvalidCacheFileName" xml:space="preserve">
121+
<value>Configured cache file name '{0}' is invalid. Keep it simple; No paths allowed.</value>
122+
</data>
120123
<data name="Error_PackageAlreadyExists" xml:space="preserve">
121124
<value>Package {0} already exists. The server is configured to not allow overwriting packages that already exist.</value>
122125
</data>

src/NuGet.Server/Infrastructure/WebConfigSettingsProvider.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,11 @@ public bool GetBoolSetting(string key, bool defaultValue)
2828
bool value;
2929
return !bool.TryParse(settings[key], out value) ? defaultValue : value;
3030
}
31+
32+
public string GetStringSetting(string key, string defaultValue)
33+
{
34+
var settings = _getSettings();
35+
return settings[key] ?? defaultValue;
36+
}
3137
}
3238
}

src/NuGet.Server/Web.config

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
-->
2323
<add key="packagesPath" value="" />
2424

25+
<!--
26+
Change the name of the internal cache file. Default is machine name (System.Environment.MachineName).
27+
This is the name of the cache file in the packages folder. No paths allowed.
28+
-->
29+
<add key="cacheFileName" value="" />
30+
2531
<!--
2632
Set allowOverrideExistingPackageOnPush to false to mimic NuGet.org's behaviour (do not allow overwriting packages with same id + version).
2733
-->

test/NuGet.Server.Core.Tests/Infrastructure/FuncSettingsProvider.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ namespace NuGet.Server.Core.Tests.Infrastructure
77
{
88
class FuncSettingsProvider : ISettingsProvider
99
{
10-
readonly Func<string, bool, bool> _getSetting;
11-
internal FuncSettingsProvider(Func<string,bool,bool> getSetting)
10+
readonly Func<string, object, object> _getSetting;
11+
internal FuncSettingsProvider(Func<string, object, object> getSetting)
1212
{
1313
if (getSetting == null)
1414
{
@@ -20,7 +20,12 @@ internal FuncSettingsProvider(Func<string,bool,bool> getSetting)
2020

2121
public bool GetBoolSetting(string key, bool defaultValue)
2222
{
23-
return _getSetting(key, defaultValue);
23+
return Convert.ToBoolean(_getSetting(key, defaultValue));
24+
}
25+
26+
public string GetStringSetting(string key, string defaultValue)
27+
{
28+
return Convert.ToString(_getSetting(key, defaultValue));
2429
}
2530
}
2631
}

0 commit comments

Comments
 (0)