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 System.Text.RegularExpressions;
using StardewModdingAPI.Toolkit.Serialization; using StardewModdingAPI.Toolkit.Serialization;
using StardewModdingAPI.Toolkit.Serialization.Models; using StardewModdingAPI.Toolkit.Serialization.Models;
using StardewModdingAPI.Toolkit.Utilities;
namespace StardewModdingAPI.Toolkit.Framework.ModScanning namespace StardewModdingAPI.Toolkit.Framework.ModScanning
{ {
@ -251,8 +252,19 @@ namespace StardewModdingAPI.Toolkit.Framework.ModScanning
{ {
while (true) while (true)
{ {
// check for manifest in current folder // check for conventional manifest in current folder
FileInfo file = new(Path.Combine(folder.FullName, "manifest.json")); 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) if (file.Exists)
return file; return file;

View File

@ -25,10 +25,11 @@ namespace StardewModdingAPI.Toolkit.Utilities
*********/ *********/
/// <summary>Construct an instance.</summary> /// <summary>Construct an instance.</summary>
/// <param name="rootPath">The root directory path for relative paths.</param> /// <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.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> /// <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> /// <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); 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); string relativePath = path.Substring(this.RootPath.Length + 1);