make manifest.json filename case-insensitive

This commit is contained in:
Jesse Plamondon-Willard 2022-04-16 14:28:20 -04:00
parent 95d7ba8935
commit f93c41f55c
No known key found for this signature in database
GPG Key ID: CF8B1456B3E29F49
2 changed files with 20 additions and 6 deletions

View File

@ -5,6 +5,7 @@ using System.Linq;
using System.Text.RegularExpressions;
using StardewModdingAPI.Toolkit.Serialization;
using StardewModdingAPI.Toolkit.Serialization.Models;
using StardewModdingAPI.Toolkit.Utilities;
namespace StardewModdingAPI.Toolkit.Framework.ModScanning
{
@ -251,8 +252,19 @@ namespace StardewModdingAPI.Toolkit.Framework.ModScanning
{
while (true)
{
// check for manifest in current folder
FileInfo file = new(Path.Combine(folder.FullName, "manifest.json"));
// check for conventional manifest in current folder
const string defaultName = "manifest.json";
FileInfo file = new(Path.Combine(folder.FullName, defaultName));
if (file.Exists)
return file;
// check for manifest with incorrect capitalization
{
CaseInsensitivePathLookup pathLookup = new(folder.FullName, SearchOption.TopDirectoryOnly); // don't use GetCachedFor, since we only need it temporarily
string realName = pathLookup.GetFilePath(defaultName);
if (realName != defaultName)
file = new(Path.Combine(folder.FullName, realName));
}
if (file.Exists)
return file;

View File

@ -25,10 +25,11 @@ namespace StardewModdingAPI.Toolkit.Utilities
*********/
/// <summary>Construct an instance.</summary>
/// <param name="rootPath">The root directory path for relative paths.</param>
public CaseInsensitivePathLookup(string rootPath)
/// <param name="searchOption">Which directories to scan from the root.</param>
public CaseInsensitivePathLookup(string rootPath, SearchOption searchOption = SearchOption.AllDirectories)
{
this.RootPath = rootPath;
this.RelativePathCache = new(this.GetRelativePathCache);
this.RelativePathCache = new(() => this.GetRelativePathCache(searchOption));
}
/// <summary>Get the exact capitalization for a given relative file path.</summary>
@ -108,11 +109,12 @@ namespace StardewModdingAPI.Toolkit.Utilities
}
/// <summary>Get a case-insensitive lookup of file paths (see <see cref="RelativePathCache"/>).</summary>
private Dictionary<string, string> GetRelativePathCache()
/// <param name="searchOption">Which directories to scan from the root.</param>
private Dictionary<string, string> GetRelativePathCache(SearchOption searchOption)
{
Dictionary<string, string> cache = new(StringComparer.OrdinalIgnoreCase);
foreach (string path in Directory.EnumerateFiles(this.RootPath, "*", SearchOption.AllDirectories))
foreach (string path in Directory.EnumerateFiles(this.RootPath, "*", searchOption))
{
string relativePath = path.Substring(this.RootPath.Length + 1);