This commit is contained in:
TheBrokenRail 2020-07-25 14:10:06 -04:00
parent 4d4facdf50
commit 2f140c4a60
12 changed files with 85 additions and 11 deletions

View File

@ -1,5 +1,9 @@
# Changelog # Changelog
**1.1.8**
* Strict Minecraft Version Checking by Default
* Print Message To Log Showing All Scanned Mods
**1.1.7** **1.1.7**
* Disable SemVer In JSON Strategy * Disable SemVer In JSON Strategy

View File

@ -17,6 +17,7 @@ This update strategy uses the CurseForge API to check for updates.
``` ```
- Requires Semantic Versioning - Requires Semantic Versioning
- In Loose Versioning Mode, Can Infer File's Supported Minecraft version From CurseForge Metadata
- [Requires ```build.gradle``` modification](#build-gradle-modification) - [Requires ```build.gradle``` modification](#build-gradle-modification)
## GitHub Releases ## GitHub Releases
@ -108,4 +109,19 @@ If you prefer hyphens you can also use:
version = "${project.mod_version}-${project.minecraft_version}" version = "${project.mod_version}-${project.minecraft_version}"
``` ```
You can also just use the major version of Minecraft instead of the full version (like ```1.16``` instead of ```1.16.1``` or ```20w20a```). ## Loose VS Strict Versioning Mode
### Strict (Default)
In strict mode it only marks a file as compatibleif the Minecraft version is identical.
### Loose
```json
{
"custom": {
"modupdater": {
"strict": false
}
}
}
```
In loose mode, it will also mark a file as compatible if it has the same release target.

View File

@ -9,7 +9,7 @@ org.gradle.jvmargs = -Xmx1G
fabric_loader_version = 0.8.8+build.202 fabric_loader_version = 0.8.8+build.202
# Mod Properties # Mod Properties
mod_version = 1.1.7 mod_version = 1.1.8
maven_group = com.thebrokenrail maven_group = com.thebrokenrail
# Dependencies # Dependencies

View File

@ -5,6 +5,8 @@ public interface ConfigObject {
int getInt(String str) throws MissingValueException; int getInt(String str) throws MissingValueException;
boolean getBoolean(String str) throws MissingValueException;
class MissingValueException extends Exception { class MissingValueException extends Exception {
private static final String MISSING_MSG = "Missing Configuration Property: %s"; private static final String MISSING_MSG = "Missing Configuration Property: %s";
private static final String INVALID_MSG = "Invalid Configuration Property: %s"; private static final String INVALID_MSG = "Invalid Configuration Property: %s";

View File

@ -7,4 +7,12 @@ import javax.annotation.Nullable;
public interface UpdateStrategy { public interface UpdateStrategy {
@Nullable @Nullable
ModUpdate run(ConfigObject obj, String oldVersion, String name); ModUpdate run(ConfigObject obj, String oldVersion, String name);
default boolean isStrict(ConfigObject obj) {
try {
return obj.getBoolean("strict");
} catch (ConfigObject.MissingValueException e) {
return true;
}
}
} }

View File

@ -35,4 +35,17 @@ public class ConfigObjectCustom implements ConfigObject {
throw new MissingValueException(false, str); throw new MissingValueException(false, str);
} }
} }
@Override
public boolean getBoolean(String str) throws MissingValueException {
if (obj.containsKey(str)) {
try {
return obj.get(str).getAsBoolean();
} catch (ClassCastException e) {
throw new MissingValueException(true, str);
}
} else {
throw new MissingValueException(false, str);
}
}
} }

View File

@ -36,4 +36,17 @@ public class ConfigObjectHardcoded implements ConfigObject {
throw new MissingValueException(false, str); throw new MissingValueException(false, str);
} }
} }
@Override
public boolean getBoolean(String str) throws MissingValueException {
if (map.containsKey(str)) {
try {
return (Boolean) map.get(str);
} catch (ClassCastException e) {
throw new MissingValueException(true, str);
}
} else {
throw new MissingValueException(false, str);
}
}
} }

View File

@ -70,11 +70,13 @@ public class CurseForgeStrategy implements UpdateStrategy {
versionStr = version.getReleaseTarget() + "-Snapshot"; versionStr = version.getReleaseTarget() + "-Snapshot";
} }
boolean strict = isStrict(obj);
CurseForgeFile newestFile = null; CurseForgeFile newestFile = null;
for (CurseForgeFile file : files) { for (CurseForgeFile file : files) {
if (Util.isFileCompatible(file.fileName)) { if (Util.isFileCompatible(file.fileName)) {
String fileVersion = Util.getVersionFromFileName(file.fileName); String fileVersion = Util.getVersionFromFileName(file.fileName);
if (Arrays.asList(file.gameVersion).contains(versionStr) || Util.isVersionCompatible(fileVersion)) { if ((Arrays.asList(file.gameVersion).contains(versionStr) && strict) || Util.isVersionCompatible(fileVersion, strict)) {
if (newestFile != null) { if (newestFile != null) {
String newestFileVersion = Util.getVersionFromFileName(newestFile.fileName); String newestFileVersion = Util.getVersionFromFileName(newestFile.fileName);
try { try {

View File

@ -66,12 +66,14 @@ public class GitHubReleasesStrategy implements UpdateStrategy {
return null; return null;
} }
boolean strict = isStrict(obj);
GitHubReleaseAsset newestFile = null; GitHubReleaseAsset newestFile = null;
for (GitHubRelease release : releases) { for (GitHubRelease release : releases) {
for (GitHubReleaseAsset asset : release.assets) { for (GitHubReleaseAsset asset : release.assets) {
if (Util.isFileCompatible(asset.name)) { if (Util.isFileCompatible(asset.name)) {
String fileVersion = Util.getVersionFromFileName(asset.name); String fileVersion = Util.getVersionFromFileName(asset.name);
if (Util.isVersionCompatible(fileVersion)) { if (Util.isVersionCompatible(fileVersion, strict)) {
if (newestFile != null) { if (newestFile != null) {
try { try {
if (SemanticVersion.parse(fileVersion).compareTo(SemanticVersion.parse(fileVersion)) > 0) { if (SemanticVersion.parse(fileVersion).compareTo(SemanticVersion.parse(fileVersion)) > 0) {

View File

@ -80,12 +80,14 @@ public class MavenStrategy implements UpdateStrategy {
return null; return null;
} }
boolean strict = isStrict(obj);
String newestVersion = null; String newestVersion = null;
for (int i = 0; i < versions.getLength(); i++) { for (int i = 0; i < versions.getLength(); i++) {
Node node = versions.item(i); Node node = versions.item(i);
String version = node.getTextContent(); String version = node.getTextContent();
if (Util.isVersionCompatible(version)) { if (Util.isVersionCompatible(version, strict)) {
if (newestVersion != null) { if (newestVersion != null) {
try { try {
if (SemanticVersion.parse(version).compareTo(SemanticVersion.parse(newestVersion)) > 0) { if (SemanticVersion.parse(version).compareTo(SemanticVersion.parse(newestVersion)) > 0) {

View File

@ -14,10 +14,11 @@ import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
public class UpdateStrategyRunner { public class UpdateStrategyRunner {
@Nullable @Nullable
private static ModUpdate checkModForUpdate(ModMetadata metadata) { private static ModUpdate checkModForUpdate(ModMetadata metadata, Consumer<String> scan) {
String name = metadata.getName() + " (" + metadata.getId() + ')'; String name = metadata.getName() + " (" + metadata.getId() + ')';
ConfigObject obj; ConfigObject obj;
@ -51,6 +52,8 @@ public class UpdateStrategyRunner {
return null; return null;
} }
scan.accept(name);
return strategyObj.run(obj, oldVersion, name); return strategyObj.run(obj, oldVersion, name);
} }
@ -58,6 +61,7 @@ public class UpdateStrategyRunner {
ModUpdater.logInfo("Checking For Mod Updates..."); ModUpdater.logInfo("Checking For Mod Updates...");
List<ModUpdate> updates = new ArrayList<>(); List<ModUpdate> updates = new ArrayList<>();
List<String> scannedMods = new ArrayList<>();
AtomicInteger remaining = new AtomicInteger(0); AtomicInteger remaining = new AtomicInteger(0);
@ -66,7 +70,11 @@ public class UpdateStrategyRunner {
try { try {
ModMetadata metadata = mod.getMetadata(); ModMetadata metadata = mod.getMetadata();
ModUpdate update = checkModForUpdate(metadata); ModUpdate update = checkModForUpdate(metadata, name -> {
synchronized (scannedMods) {
scannedMods.add(name);
}
});
if (update != null) { if (update != null) {
ModUpdater.logInfo(update.text + " (" + update.downloadURL + ')'); ModUpdater.logInfo(update.text + " (" + update.downloadURL + ')');
@ -100,6 +108,8 @@ public class UpdateStrategyRunner {
ModUpdater.logInfo(updates.size() + String.format(" Mod Update%s Found", updates.size() == 1 ? "" : "s")); ModUpdater.logInfo(updates.size() + String.format(" Mod Update%s Found", updates.size() == 1 ? "" : "s"));
ModUpdater.logInfo("Scanned " + scannedMods.size() + " Mods: " + String.join(", ", scannedMods));
return updates.toArray(new ModUpdate[0]); return updates.toArray(new ModUpdate[0]);
} }
} }

View File

@ -75,13 +75,13 @@ public class Util {
} }
} }
private static boolean isVersionCompatible(String versionStr, char prefix) { private static boolean isVersionCompatible(String versionStr, char prefix, boolean strict) {
updateMinecraftVersion(); updateMinecraftVersion();
return versionStr.endsWith(prefix + minecraftVersionSemantic) || versionStr.endsWith(prefix + minecraftVersion.getReleaseTarget()) || versionStr.endsWith(prefix + getMajorVersion()); return versionStr.endsWith(prefix + minecraftVersionSemantic) || versionStr.endsWith(prefix + minecraftVersion.getName()) || (!strict && (versionStr.endsWith(prefix + minecraftVersion.getReleaseTarget()) || versionStr.endsWith(prefix + getMajorVersion())));
} }
public static boolean isVersionCompatible(String versionStr) { public static boolean isVersionCompatible(String versionStr, boolean strict) {
return isVersionCompatible(versionStr, '+') || isVersionCompatible(versionStr, '-'); return isVersionCompatible(versionStr, '+', strict) || isVersionCompatible(versionStr, '-', strict);
} }
public static boolean isFileCompatible(String fileName) { public static boolean isFileCompatible(String fileName) {
@ -99,12 +99,14 @@ public class Util {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("strategy", "curseforge"); map.put("strategy", "curseforge");
map.put("projectID", 306612); map.put("projectID", 306612);
map.put("strict", false);
return new ConfigObjectHardcoded(map); return new ConfigObjectHardcoded(map);
} }
case "modmenu": { case "modmenu": {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("strategy", "curseforge"); map.put("strategy", "curseforge");
map.put("projectID", 308702); map.put("projectID", 308702);
map.put("strict", false);
return new ConfigObjectHardcoded(map); return new ConfigObjectHardcoded(map);
} }
default: { default: {