summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework/ModLoading
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2019-07-20 14:54:56 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2019-09-14 18:53:37 -0400
commit673ef91cc75e3b460acb8ab875d4d9d0be07042e (patch)
tree59b6e301af984379c7b199b604ad909de9ab2cf7 /src/SMAPI/Framework/ModLoading
parentec747b518b28184c440dcea7ce74f3e80b627505 (diff)
downloadSMAPI-673ef91cc75e3b460acb8ab875d4d9d0be07042e.tar.gz
SMAPI-673ef91cc75e3b460acb8ab875d4d9d0be07042e.tar.bz2
SMAPI-673ef91cc75e3b460acb8ab875d4d9d0be07042e.zip
show versions in duplicate-mod errors, make folder paths in trace logs clearer
Diffstat (limited to 'src/SMAPI/Framework/ModLoading')
-rw-r--r--src/SMAPI/Framework/ModLoading/ModMetadata.cs25
-rw-r--r--src/SMAPI/Framework/ModLoading/ModResolver.cs12
2 files changed, 28 insertions, 9 deletions
diff --git a/src/SMAPI/Framework/ModLoading/ModMetadata.cs b/src/SMAPI/Framework/ModLoading/ModMetadata.cs
index 39f2f482..7f788d17 100644
--- a/src/SMAPI/Framework/ModLoading/ModMetadata.cs
+++ b/src/SMAPI/Framework/ModLoading/ModMetadata.cs
@@ -1,10 +1,12 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using StardewModdingAPI.Framework.ModHelpers;
using StardewModdingAPI.Toolkit.Framework.Clients.WebApi;
using StardewModdingAPI.Toolkit.Framework.ModData;
using StardewModdingAPI.Toolkit.Framework.UpdateData;
+using StardewModdingAPI.Toolkit.Utilities;
namespace StardewModdingAPI.Framework.ModLoading
{
@@ -17,10 +19,13 @@ namespace StardewModdingAPI.Framework.ModLoading
/// <summary>The mod's display name.</summary>
public string DisplayName { get; }
- /// <summary>The mod's full directory path.</summary>
+ /// <summary>The root path containing mods.</summary>
+ public string RootPath { get; }
+
+ /// <summary>The mod's full directory path within the <see cref="RootPath"/>.</summary>
public string DirectoryPath { get; }
- /// <summary>The <see cref="IModMetadata.DirectoryPath"/> relative to the game's Mods folder.</summary>
+ /// <summary>The <see cref="DirectoryPath"/> relative to the <see cref="RootPath"/>.</summary>
public string RelativeDirectoryPath { get; }
/// <summary>The mod manifest.</summary>
@@ -68,16 +73,17 @@ namespace StardewModdingAPI.Framework.ModLoading
*********/
/// <summary>Construct an instance.</summary>
/// <param name="displayName">The mod's display name.</param>
- /// <param name="directoryPath">The mod's full directory path.</param>
- /// <param name="relativeDirectoryPath">The <paramref name="directoryPath"/> relative to the game's Mods folder.</param>
+ /// <param name="directoryPath">The mod's full directory path within the <paramref name="rootPath"/>.</param>
+ /// <param name="rootPath">The root path containing mods.</param>
/// <param name="manifest">The mod manifest.</param>
/// <param name="dataRecord">Metadata about the mod from SMAPI's internal data (if any).</param>
/// <param name="isIgnored">Whether the mod folder should be ignored. This should be <c>true</c> if it was found within a folder whose name starts with a dot.</param>
- public ModMetadata(string displayName, string directoryPath, string relativeDirectoryPath, IManifest manifest, ModDataRecordVersionedFields dataRecord, bool isIgnored)
+ public ModMetadata(string displayName, string directoryPath, string rootPath, IManifest manifest, ModDataRecordVersionedFields dataRecord, bool isIgnored)
{
this.DisplayName = displayName;
this.DirectoryPath = directoryPath;
- this.RelativeDirectoryPath = relativeDirectoryPath;
+ this.RootPath = rootPath;
+ this.RelativeDirectoryPath = PathUtilities.GetRelativePath(this.RootPath, this.DirectoryPath);
this.Manifest = manifest;
this.DataRecord = dataRecord;
this.IsIgnored = isIgnored;
@@ -196,5 +202,12 @@ namespace StardewModdingAPI.Framework.ModLoading
this.Warnings.HasFlag(warning)
&& (this.DataRecord?.DataRecord == null || !this.DataRecord.DataRecord.SuppressWarnings.HasFlag(warning));
}
+
+ /// <summary>Get a relative path which includes the root folder name.</summary>
+ public string GetRelativePathWithRoot()
+ {
+ string rootFolderName = Path.GetFileName(this.RootPath) ?? "";
+ return Path.Combine(rootFolderName, this.RelativeDirectoryPath);
+ }
}
}
diff --git a/src/SMAPI/Framework/ModLoading/ModResolver.cs b/src/SMAPI/Framework/ModLoading/ModResolver.cs
index b6bdb357..20941a5f 100644
--- a/src/SMAPI/Framework/ModLoading/ModResolver.cs
+++ b/src/SMAPI/Framework/ModLoading/ModResolver.cs
@@ -42,9 +42,8 @@ namespace StardewModdingAPI.Framework.ModLoading
ModMetadataStatus status = folder.ManifestParseError == ModParseError.None || shouldIgnore
? ModMetadataStatus.Found
: ModMetadataStatus.Failed;
- string relativePath = PathUtilities.GetRelativePath(rootPath, folder.Directory.FullName);
- yield return new ModMetadata(folder.DisplayName, folder.Directory.FullName, relativePath, manifest, dataRecord, isIgnored: shouldIgnore)
+ yield return new ModMetadata(folder.DisplayName, folder.Directory.FullName, rootPath, manifest, dataRecord, isIgnored: shouldIgnore)
.SetStatus(status, shouldIgnore ? "disabled by dot convention" : folder.ManifestParseErrorText);
}
}
@@ -199,7 +198,14 @@ namespace StardewModdingAPI.Framework.ModLoading
{
if (mod.Status == ModMetadataStatus.Failed)
continue; // don't replace metadata error
- mod.SetStatus(ModMetadataStatus.Failed, $"you have multiple copies of this mod installed ({string.Join(", ", group.Select(p => p.RelativeDirectoryPath).OrderBy(p => p))}).");
+
+ string folderList = string.Join(", ",
+ from entry in @group
+ let relativePath = entry.GetRelativePathWithRoot()
+ orderby relativePath
+ select $"{relativePath} ({entry.Manifest.Version})"
+ );
+ mod.SetStatus(ModMetadataStatus.Failed, $"you have multiple copies of this mod installed. Found in folders: {folderList}.");
}
}
}