Skip to content

Commit

Permalink
Allow setting minecraft version with a version constraint
Browse files Browse the repository at this point in the history
  • Loading branch information
lukebemish committed Jan 6, 2025
1 parent 81473f2 commit 5cb6996
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import dev.lukebemish.crochet.internal.tasks.VanillaInstallationArtifacts;
import org.apache.commons.lang3.StringUtils;
import org.gradle.api.Project;
import org.gradle.api.artifacts.VersionConstraint;
import org.gradle.api.attributes.Category;
import org.gradle.api.attributes.Usage;
import org.gradle.api.provider.Property;
Expand Down Expand Up @@ -124,8 +125,8 @@ private static boolean requiresVanillaMappings(MappingsStructure structure) {
}

@Override
public AbstractVanillaInstallationDependencies getDependencies() {
return (AbstractVanillaInstallationDependencies) dependencies;
public AbstractVanillaInstallationDependencies<?> getDependencies() {
return (AbstractVanillaInstallationDependencies<?>) dependencies;
}

@ApiStatus.Experimental
Expand All @@ -135,15 +136,37 @@ public void setMinecraft(String string) {
setMinecraft(project.provider(() -> string));
}

/**
* Sets the Minecraft version to use for this installation; the version can be a string or a {@link VersionConstraint}.
*/
@SuppressWarnings("UnstableApiUsage")
public void setMinecraft(Provider<String> string) {
public void setMinecraft(Provider<?> provider) {
getDependencies().getMinecraftDependencies().add(
project.provider(() -> project.getDependencies().create(
(getUseStubBackedMinecraftDependencies().get() ? CrochetRepositoriesPlugin.MOJANG_STUBS_GROUP + ":minecraft-dependencies" : "net.neoforged:minecraft-dependencies")+":"+string.get()
))
project.provider(() -> dependencies.module(
(getUseStubBackedMinecraftDependencies().get() ? CrochetRepositoriesPlugin.MOJANG_STUBS_GROUP + ":minecraft-dependencies" : "net.neoforged:minecraft-dependencies")
)), dep -> {
var value = provider.get();
if (value instanceof VersionConstraint version) {
dep.version(v -> {
if (!version.getPreferredVersion().isEmpty()) v.prefer(version.getPreferredVersion());
if (!version.getRejectedVersions().isEmpty()) v.reject(version.getRejectedVersions().toArray(String[]::new));
if (version.getBranch() != null) v.setBranch(version.getBranch());
if (!version.getStrictVersion().isEmpty()) v.strictly(version.getStrictVersion());
if (!version.getRequiredVersion().isEmpty()) v.require(version.getRequiredVersion());
});
} else if (value instanceof String string) {
dep.version(v -> v.require(string));
} else {
throw new IllegalArgumentException("Unsupported type for minecraft version: " + value.getClass());
}
}
);
}

public void setMinecraft(VersionConstraint version) {
setMinecraft(project.provider(() -> version));
}

@Override
public void forFeature(SourceSet sourceSet) {
super.forFeature(sourceSet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import javax.inject.Inject;

public abstract class CrochetSettingsExtension {
private final ExtensiblePolymorphicDomainObjectContainer<SettingsMinecraftInstallation<?, ?, ?>> installations;
private final ExtensiblePolymorphicDomainObjectContainer<SettingsMinecraftInstallation<?, ?>> installations;

@Inject
protected abstract ObjectFactory getObjects();
Expand All @@ -17,7 +17,7 @@ public abstract class CrochetSettingsExtension {
@Inject
public CrochetSettingsExtension(Settings settings) {
this.installations = getObjects().polymorphicDomainObjectContainer(
(Class<SettingsMinecraftInstallation<?, ?, ?>>) (Class) SettingsMinecraftInstallation.class
(Class<SettingsMinecraftInstallation<?, ?>>) (Class) SettingsMinecraftInstallation.class
);
this.installations.registerFactory(
SettingsMinecraftInstallation.Vanilla.class,
Expand All @@ -33,7 +33,7 @@ public CrochetSettingsExtension(Settings settings) {
);
}

public ExtensiblePolymorphicDomainObjectContainer<SettingsMinecraftInstallation<?, ?, ?>> getInstallations() {
public ExtensiblePolymorphicDomainObjectContainer<SettingsMinecraftInstallation<?, ?>> getInstallations() {
return installations;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import dev.lukebemish.crochet.internal.CrochetPlugin;
import dev.lukebemish.crochet.internal.CrochetRepositoriesPlugin;
import org.gradle.api.Action;
import org.gradle.api.artifacts.VersionConstraint;
import org.gradle.api.initialization.Settings;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.Provider;
Expand All @@ -13,7 +14,7 @@
import java.util.ArrayList;
import java.util.List;

public abstract class SettingsMinecraftInstallation<T extends SettingsMinecraftInstallation<T, R, D>, R extends LocalMinecraftInstallation, D extends AbstractLocalInstallationDependencies<D>> implements GeneralizedMinecraftInstallation {
public abstract class SettingsMinecraftInstallation<R extends LocalMinecraftInstallation, D extends AbstractLocalInstallationDependencies<D>> implements GeneralizedMinecraftInstallation {
@SuppressWarnings("UnstableApiUsage")
@Inject
public SettingsMinecraftInstallation(String name, Settings settings) {
Expand Down Expand Up @@ -44,7 +45,7 @@ public void dependencies(Action<? super D> action) {
dependencyActions.add(action);
}

public abstract static class AbstractVanilla<T extends SettingsMinecraftInstallation<T, R, D>, R extends AbstractVanillaInstallation, D extends AbstractVanillaInstallationDependencies<D>> extends SettingsMinecraftInstallation<T, R, D> {
public abstract static class AbstractVanilla<T extends SettingsMinecraftInstallation<R, D>, R extends AbstractVanillaInstallation, D extends AbstractVanillaInstallationDependencies<D>> extends SettingsMinecraftInstallation<R, D> {
@Inject
public AbstractVanilla(String name, Settings settings) {
super(name, settings);
Expand All @@ -62,19 +63,43 @@ public void setMinecraft(String string) {
});
}

public void setMinecraft(Provider<String> string) {
public void setMinecraft(VersionConstraint version) {
dependencies(dependencies -> {
setMinecraftOnDependencies(dependencies.installation.crochetExtension.project.provider(() -> version), dependencies);
});
}

/**
* Sets the Minecraft version to use for this installation; the version can be a string or a {@link VersionConstraint}.
*/
public void setMinecraft(Provider<?> string) {
dependencies(dependencies -> {
setMinecraftOnDependencies(string, dependencies);
});
}

@SuppressWarnings("UnstableApiUsage")
private void setMinecraftOnDependencies(Provider<String> string, D dependencies) {
private void setMinecraftOnDependencies(Provider<?> provider, D dependencies) {
var installation = (AbstractVanillaInstallation) dependencies.installation;
dependencies.getMinecraftDependencies().add(
dependencies.installation.crochetExtension.project.provider(() ->
dependencies.module((installation.getUseStubBackedMinecraftDependencies().get() ? CrochetRepositoriesPlugin.MOJANG_STUBS_GROUP + ":minecraft-dependencies" : "net.neoforged:minecraft-dependencies")+":"+ string.get())
)
dependencies.module((installation.getUseStubBackedMinecraftDependencies().get() ? CrochetRepositoriesPlugin.MOJANG_STUBS_GROUP + ":minecraft-dependencies" : "net.neoforged:minecraft-dependencies"))
), dep -> {
var value = provider.get();
if (value instanceof VersionConstraint version) {
dep.version(v -> {
if (!version.getPreferredVersion().isEmpty()) v.prefer(version.getPreferredVersion());
if (!version.getRejectedVersions().isEmpty()) v.reject(version.getRejectedVersions().toArray(String[]::new));
if (version.getBranch() != null) v.setBranch(version.getBranch());
if (!version.getStrictVersion().isEmpty()) v.strictly(version.getStrictVersion());
if (!version.getRequiredVersion().isEmpty()) v.require(version.getRequiredVersion());
});
} else if (value instanceof String string) {
dep.version(v -> v.require(string));
} else {
throw new IllegalArgumentException("Unsupported type for minecraft version: " + value.getClass());
}
}
);
}

Expand Down Expand Up @@ -125,7 +150,7 @@ protected void configureInstallation(FabricInstallation installation) {
}
}

public abstract static class NeoForm extends SettingsMinecraftInstallation<NeoForm, NeoFormInstallation, NeoFormInstallationDependencies> {
public abstract static class NeoForm extends SettingsMinecraftInstallation<NeoFormInstallation, NeoFormInstallationDependencies> {
@Inject
public NeoForm(String name, Settings settings) {
super(name, settings);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
@file:Suppress("INAPPLICABLE_JVM_NAME")

package dev.lukebemish.crochet.kotlin.extension

import dev.lukebemish.crochet.model.AbstractVanillaInstallation
import dev.lukebemish.crochet.model.AbstractVanillaInstallationDependencies
import dev.lukebemish.crochet.model.MinecraftInstallation
import dev.lukebemish.crochet.model.SettingsMinecraftInstallation
import org.gradle.api.artifacts.VersionConstraint
import org.gradle.api.provider.Provider

val MinecraftInstallation.minecraftVersion: KotlinLazyProvider<String>
Expand All @@ -13,8 +16,8 @@ val MinecraftInstallation.minecraftVersion: KotlinLazyProvider<String>
}
}

val AbstractVanillaInstallation.minecraftVersion: KotlinLazyProperty<String>
get() = object: KotlinLazyProperty<String> {
val AbstractVanillaInstallation.minecraftVersion: VersionProperty
get() = object: VersionProperty {
override fun asProvider(): Provider<String> {
return minecraft
}
Expand All @@ -26,16 +29,35 @@ val AbstractVanillaInstallation.minecraftVersion: KotlinLazyProperty<String>
override fun assign(value: String) {
setMinecraft(value)
}

@JvmName("assignVersionConstraintProvider")
override fun assign(provider: Provider<VersionConstraint>) {
setMinecraft(provider)
}

override fun assign(value: VersionConstraint) {
setMinecraft(value)
}
}

val <T: SettingsMinecraftInstallation<T, R, D>, R: AbstractVanillaInstallation, D: AbstractVanillaInstallationDependencies<D>>
SettingsMinecraftInstallation.AbstractVanilla<T, R, D>.minecraftVersion: KotlinLazySetter<String>
get() = object: KotlinLazySetter<String> {
val <T: SettingsMinecraftInstallation<R, D>, R: AbstractVanillaInstallation, D: AbstractVanillaInstallationDependencies<D>>
SettingsMinecraftInstallation.AbstractVanilla<T, R, D>.minecraftVersion: VersionSetter
get() = object: VersionSetter {

override fun assign(provider: Provider<String>) {
setMinecraft(provider)
}

override fun assign(value: String) {
setMinecraft(value)
}

@JvmName("assignVersionConstraintProvider")
override fun assign(provider: Provider<VersionConstraint>) {
setMinecraft(provider)
}

override fun assign(value: VersionConstraint) {
setMinecraft(value)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ package dev.lukebemish.crochet.kotlin.extension
import org.gradle.api.SupportsKotlinAssignmentOverloading

@SupportsKotlinAssignmentOverloading
interface KotlinLazyProperty<T>: KotlinLazyProvider<T>, KotlinLazySetter<T> {}
interface KotlinLazyProperty<T>: KotlinLazyProvider<T>, KotlinLazySetter<T>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package dev.lukebemish.crochet.kotlin.extension

import org.gradle.api.SupportsKotlinAssignmentOverloading

@SupportsKotlinAssignmentOverloading
interface VersionProperty : KotlinLazyProperty<String>, VersionSetter
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package dev.lukebemish.crochet.kotlin.extension

import org.gradle.api.SupportsKotlinAssignmentOverloading
import org.gradle.api.artifacts.VersionConstraint
import org.gradle.api.provider.Provider

@Suppress("INAPPLICABLE_JVM_NAME")
@SupportsKotlinAssignmentOverloading
interface VersionSetter: KotlinLazySetter<String> {
@JvmName("assignVersionConstraintProvider")
fun assign(provider: Provider<VersionConstraint>)

@JvmName("assignVersionConstraintProvider")
fun assign(value: VersionConstraint)
}

0 comments on commit 5cb6996

Please sign in to comment.