diff --git a/src/SMAPI.Toolkit/Framework/ModScanning/ModScanner.cs b/src/SMAPI.Toolkit/Framework/ModScanning/ModScanner.cs
index 12333c4e..84329f63 100644
--- a/src/SMAPI.Toolkit/Framework/ModScanning/ModScanner.cs
+++ b/src/SMAPI.Toolkit/Framework/ModScanning/ModScanner.cs
@@ -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;
diff --git a/src/SMAPI.Toolkit/Utilities/CaseInsensitivePathLookup.cs b/src/SMAPI.Toolkit/Utilities/CaseInsensitivePathLookup.cs
index 2e149e3c..12fad008 100644
--- a/src/SMAPI.Toolkit/Utilities/CaseInsensitivePathLookup.cs
+++ b/src/SMAPI.Toolkit/Utilities/CaseInsensitivePathLookup.cs
@@ -25,10 +25,11 @@ namespace StardewModdingAPI.Toolkit.Utilities
*********/
/// Construct an instance.
/// The root directory path for relative paths.
- public CaseInsensitivePathLookup(string rootPath)
+ /// Which directories to scan from the root.
+ public CaseInsensitivePathLookup(string rootPath, SearchOption searchOption = SearchOption.AllDirectories)
{
this.RootPath = rootPath;
- this.RelativePathCache = new(this.GetRelativePathCache);
+ this.RelativePathCache = new(() => this.GetRelativePathCache(searchOption));
}
/// Get the exact capitalization for a given relative file path.
@@ -108,11 +109,12 @@ namespace StardewModdingAPI.Toolkit.Utilities
}
/// Get a case-insensitive lookup of file paths (see ).
- private Dictionary GetRelativePathCache()
+ /// Which directories to scan from the root.
+ private Dictionary GetRelativePathCache(SearchOption searchOption)
{
Dictionary 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);