This commit is contained in:
parent
4d4facdf50
commit
2f140c4a60
@ -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
|
||||||
|
|
||||||
|
@ -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.
|
@ -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
|
||||||
|
@ -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";
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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: {
|
||||||
|
Reference in New Issue
Block a user