Skip to content

Commit 524546a

Browse files
committed
Add unpack and other helpers to SharedUtil
1 parent 54e9798 commit 524546a

File tree

5 files changed

+155
-63
lines changed

5 files changed

+155
-63
lines changed

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ plugins {
66
id 'idea'
77
id 'eclipse'
88
id 'maven-publish'
9-
alias libs.plugins.javadoc.links
109
alias libs.plugins.versions
1110
alias libs.plugins.licenser
1211
alias libs.plugins.gradleutils

gradleutils-shared/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ plugins {
77
id 'idea'
88
id 'eclipse'
99
id 'maven-publish'
10-
alias libs.plugins.javadoc.links
1110
alias libs.plugins.versions
1211
alias libs.plugins.licenser
1312
alias libs.plugins.gradleutils

gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/SharedUtil.java

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import groovy.lang.DelegatesTo;
99
import groovy.transform.stc.ClosureParams;
1010
import groovy.transform.stc.FirstParam;
11+
import kotlin.jvm.functions.Function0;
1112
import org.gradle.TaskExecutionRequest;
1213
import org.gradle.api.Action;
1314
import org.gradle.api.DomainObjectCollection;
@@ -24,6 +25,7 @@
2425
import org.gradle.api.plugins.JavaPluginExtension;
2526
import org.gradle.api.provider.Property;
2627
import org.gradle.api.provider.Provider;
28+
import org.gradle.api.provider.ProviderConvertible;
2729
import org.gradle.api.provider.ProviderFactory;
2830
import org.gradle.api.specs.Spec;
2931
import org.gradle.api.tasks.SourceSet;
@@ -41,13 +43,16 @@
4143
import java.io.InputStreamReader;
4244
import java.io.PipedInputStream;
4345
import java.io.PipedOutputStream;
46+
import java.text.MessageFormat;
4447
import java.util.ArrayList;
4548
import java.util.Collection;
4649
import java.util.List;
4750
import java.util.Objects;
4851
import java.util.Set;
52+
import java.util.concurrent.Callable;
4953
import java.util.function.Consumer;
5054
import java.util.function.Predicate;
55+
import java.util.function.Supplier;
5156
import java.util.stream.Collectors;
5257
import java.util.stream.Stream;
5358

@@ -445,6 +450,118 @@ public static String toString(Dependency dependency) {
445450
dependency instanceof FileCollectionDependency ? String.format(" [%s]", String.join(", ", ((FileCollectionDependency) dependency).getFiles().getFiles().stream().map(File::getAbsolutePath).map(CharSequence.class::cast)::iterator)) : ""
446451
);
447452
}
453+
454+
/// Converts a given dependency to a relative path, accounting for the possible nullable
455+
/// {@linkplain Dependency#getGroup() group} and {@linkplain Dependency#getVersion() version}.
456+
///
457+
/// @param dependency The dependency to pathify
458+
/// @return The pathified dependency
459+
public static String pathify(Dependency dependency) {
460+
var group = dependency.getGroup();
461+
var name = dependency.getName();
462+
var version = dependency.getVersion();
463+
return MessageFormat.format("{0}{1}/{2}",
464+
group == null ? "" : group.replace('.', '/') + '/',
465+
name,
466+
version == null ? "/" : '/' + version + '/'
467+
);
468+
}
469+
470+
//endregion
471+
472+
//region Deferred Objects
473+
474+
/// Unpacks a deferred value.
475+
///
476+
/// @param value The value to unpack
477+
/// @param <T> The type of value held by the provider
478+
/// @return The unpacked value
479+
/// @see #unpack(Object)
480+
public static <T> T unpack(Provider<T> value) {
481+
return value.get();
482+
}
483+
484+
/// Unpacks a deferred value.
485+
///
486+
/// @param value The value to unpack
487+
/// @param <T> The type of value held by the provider
488+
/// @return The unpacked value
489+
/// @see #unpack(Object)
490+
public static <T> T unpack(ProviderConvertible<T> value) {
491+
return value.asProvider().get();
492+
}
493+
494+
/// Unpacks a deferred value.
495+
///
496+
/// @param value The value to unpack
497+
/// @param <T> The type of value held by the provider
498+
/// @return The unpacked value
499+
/// @see #unpack(Object)
500+
public static <T> T unpack(Closure<T> value) {
501+
return Closures.invoke(value);
502+
}
503+
504+
/// Unpacks a deferred value.
505+
///
506+
/// @param value The value to unpack
507+
/// @param <T> The type of value held by the provider
508+
/// @return The unpacked value
509+
/// @see #unpack(Object)
510+
public static <T> T unpack(Callable<T> value) {
511+
try {
512+
return value.call();
513+
} catch (Exception e) {
514+
throw new RuntimeException(e);
515+
}
516+
}
517+
518+
/// Unpacks a deferred value.
519+
///
520+
/// @param value The value to unpack
521+
/// @param <T> The type of value held by the provider
522+
/// @return The unpacked value
523+
/// @see #unpack(Object)
524+
public static <T> T unpack(Function0<T> value) {
525+
return value.invoke();
526+
}
527+
528+
/// Unpacks a deferred value.
529+
///
530+
/// @param value The value to unpack
531+
/// @param <T> The type of value held by the provider
532+
/// @return The unpacked value
533+
/// @see #unpack(Object)
534+
public static <T> T unpack(Supplier<T> value) {
535+
return value.get();
536+
}
537+
538+
/// Unpacks a deferred value.
539+
///
540+
/// Since buildscripts are dynamically compiled, this allows buildscript authors to use this method with version
541+
/// catalog entries, other provider-like objects. This prevents the need to arbitrarily call [Provider#get()] (or
542+
/// similar) on values which may or may not be deferred based on circumstance.
543+
///
544+
/// @param value The value to unpack
545+
/// @param <T> The type of value held by the provider
546+
/// @return The unpacked value
547+
@SuppressWarnings("unchecked")
548+
public static <T> T unpack(Object value) {
549+
if (value instanceof ProviderConvertible<?> deferred) {
550+
return (T) unpack(deferred);
551+
} else if (value instanceof Provider<?> deferred) {
552+
return (T) unpack(deferred);
553+
} else if (value instanceof Closure<?> deferred) {
554+
return (T) unpack(deferred);
555+
} else if (value instanceof Callable<?> deferred) {
556+
return (T) unpack(deferred);
557+
} else if (value instanceof Function0<?> deferred) {
558+
return (T) unpack(deferred);
559+
} else if (value instanceof Supplier<?> deferred) {
560+
return (T) unpack(deferred);
561+
} else {
562+
return (T) value;
563+
}
564+
}
448565
//endregion
449566

450567
//region Properties

settings.gradle

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,49 +22,45 @@ gradle.beforeProject { Project project ->
2222
}
2323

2424
//@formatter:off
25-
dependencyResolutionManagement {
26-
versionCatalogs {
27-
register('libs') {
28-
version 'gradle-javadoc-links', '8.14'
29-
version 'gradle-versions', '0.53.0'
25+
dependencyResolutionManagement.versionCatalogs {
26+
register('libs') {
27+
version 'gradle-versions', '0.53.0'
3028

31-
plugin 'javadoc-links', 'io.freefair.javadoc-links' versionRef 'gradle-javadoc-links'
32-
plugin 'versions', 'com.github.ben-manes.versions' versionRef 'gradle-versions'
33-
plugin 'licenser', 'net.minecraftforge.licenser' version '1.2.0'
34-
plugin 'gradleutils', 'net.minecraftforge.gradleutils' version '3.3.16'
35-
plugin 'gitversion', 'net.minecraftforge.gitversion' version '3.1.1'
36-
plugin 'changelog', 'net.minecraftforge.changelog' version '3.1.2'
37-
plugin 'plugin-publish', 'com.gradle.plugin-publish' version '2.0.0'
38-
plugin 'shadow', 'com.gradleup.shadow' version '9.2.2'
29+
plugin 'versions', 'com.github.ben-manes.versions' versionRef 'gradle-versions'
30+
plugin 'licenser', 'net.minecraftforge.licenser' version '1.2.0'
31+
plugin 'gradleutils', 'net.minecraftforge.gradleutils' version '3.3.16'
32+
plugin 'gitversion', 'net.minecraftforge.gitversion' version '3.1.1'
33+
plugin 'changelog', 'net.minecraftforge.changelog' version '3.1.2'
34+
plugin 'plugin-publish', 'com.gradle.plugin-publish' version '2.0.0'
35+
plugin 'shadow', 'com.gradleup.shadow' version '9.2.2'
3936

40-
// Static Analysis
41-
library 'nulls', 'org.jetbrains', 'annotations' version '26.0.2'
37+
// Static Analysis
38+
library 'nulls', 'org.jetbrains', 'annotations' version '26.0.2'
4239

43-
// Gradle API
44-
// Original: https://github.com/remal-gradle-api/packages/packages/760197?version=9.0.0
45-
// Mirror: https://repos.moddinglegacy.com/#/modding-legacy/name/remal/gradle-api/gradle-api/9.0.0
46-
version 'gradle', '9.0.0'
47-
library 'gradle', 'name.remal.gradle-api', 'gradle-api' versionRef 'gradle'
40+
// Gradle API
41+
// Original: https://github.com/remal-gradle-api/packages/packages/760197?version=9.0.0
42+
// Mirror: https://repos.moddinglegacy.com/#/modding-legacy/name/remal/gradle-api/gradle-api/9.0.0
43+
version 'gradle', '9.0.0'
44+
library 'gradle', 'name.remal.gradle-api', 'gradle-api' versionRef 'gradle'
4845

49-
// GradleUtils Shared Base
50-
library 'gradleutils-shared', 'net.minecraftforge', 'gradleutils-shared' withoutVersion()
46+
// GradleUtils Shared Base
47+
library 'gradleutils-shared', 'net.minecraftforge', 'gradleutils-shared' withoutVersion()
5148

52-
// JavaDoc Links Plugin
53-
library 'gradle-javadoc-links', 'io.freefair.javadoc-links', 'io.freefair.javadoc-links.gradle.plugin' versionRef 'gradle-javadoc-links'
49+
// JavaDoc Links Plugin
50+
library 'gradle-javadoc-links', 'io.freefair.javadoc-links', 'io.freefair.javadoc-links.gradle.plugin' version '8.14'
5451

55-
// Versions Plugin
56-
library 'gradle-versions', 'com.github.ben-manes.versions', 'com.github.ben-manes.versions.gradle.plugin' versionRef 'gradle-versions'
52+
// Versions Plugin
53+
library 'gradle-versions', 'com.github.ben-manes.versions', 'com.github.ben-manes.versions.gradle.plugin' versionRef 'gradle-versions'
5754

58-
// GitHub Actions Workflows
59-
library 'yaml', 'org.yaml', 'snakeyaml' version '2.4'
60-
}
55+
// GitHub Actions Workflows
56+
library 'yaml', 'org.yaml', 'snakeyaml' version '2.4'
57+
}
6158

62-
register('sharedLibs') {
63-
// Tools
64-
library 'utils-hash', 'net.minecraftforge', 'hash-utils' version '0.1.9' // https://files.minecraftforge.net/net/minecraftforge/hash-utils/index.html
65-
library 'utils-download', 'net.minecraftforge', 'download-utils' version '0.3.1' // https://files.minecraftforge.net/net/minecraftforge/download-utils/index.html
66-
bundle 'utils', ['utils-hash', 'utils-download']
67-
}
59+
register('sharedLibs') {
60+
// Tools
61+
library 'utils-hash', 'net.minecraftforge', 'hash-utils' version '0.1.9' // https://files.minecraftforge.net/net/minecraftforge/hash-utils/index.html
62+
library 'utils-download', 'net.minecraftforge', 'download-utils' version '0.3.1' // https://files.minecraftforge.net/net/minecraftforge/download-utils/index.html
63+
bundle 'utils', ['utils-hash', 'utils-download']
6864
}
6965
}
7066
//@formatter:on

src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtension.java

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ default Action<MavenArtifactRepository> getPublishingForgeMaven(Provider<?> defa
282282
/// @return The unpacked value
283283
/// @see #unpack(Object)
284284
default <T> T unpack(Provider<T> value) {
285-
return value.get();
285+
return Util.unpack(value);
286286
}
287287

288288
/// Unpacks a deferred value.
@@ -292,7 +292,7 @@ default <T> T unpack(Provider<T> value) {
292292
/// @return The unpacked value
293293
/// @see #unpack(Object)
294294
default <T> T unpack(ProviderConvertible<T> value) {
295-
return value.asProvider().get();
295+
return Util.unpack(value);
296296
}
297297

298298
/// Unpacks a deferred value.
@@ -302,7 +302,7 @@ default <T> T unpack(ProviderConvertible<T> value) {
302302
/// @return The unpacked value
303303
/// @see #unpack(Object)
304304
default <T> T unpack(Closure<T> value) {
305-
return Closures.invoke(value);
305+
return Util.unpack(value);
306306
}
307307

308308
/// Unpacks a deferred value.
@@ -312,11 +312,7 @@ default <T> T unpack(Closure<T> value) {
312312
/// @return The unpacked value
313313
/// @see #unpack(Object)
314314
default <T> T unpack(Callable<T> value) {
315-
try {
316-
return value.call();
317-
} catch (Exception e) {
318-
throw new RuntimeException(e);
319-
}
315+
return Util.unpack(value);
320316
}
321317

322318
/// Unpacks a deferred value.
@@ -326,7 +322,7 @@ default <T> T unpack(Callable<T> value) {
326322
/// @return The unpacked value
327323
/// @see #unpack(Object)
328324
default <T> T unpack(Function0<T> value) {
329-
return value.invoke();
325+
return Util.unpack(value);
330326
}
331327

332328
/// Unpacks a deferred value.
@@ -336,7 +332,7 @@ default <T> T unpack(Function0<T> value) {
336332
/// @return The unpacked value
337333
/// @see #unpack(Object)
338334
default <T> T unpack(Supplier<T> value) {
339-
return value.get();
335+
return Util.unpack(value);
340336
}
341337

342338
/// Unpacks a deferred value.
@@ -348,22 +344,7 @@ default <T> T unpack(Supplier<T> value) {
348344
/// @param value The value to unpack
349345
/// @param <T> The type of value held by the provider
350346
/// @return The unpacked value
351-
@SuppressWarnings("unchecked")
352347
default <T> T unpack(Object value) {
353-
if (value instanceof ProviderConvertible<?> deferred) {
354-
return (T) this.unpack(deferred);
355-
} else if (value instanceof Provider<?> deferred) {
356-
return (T) this.unpack(deferred);
357-
} else if (value instanceof Closure<?> deferred) {
358-
return (T) this.unpack(deferred);
359-
} else if (value instanceof Callable<?> deferred) {
360-
return (T) this.unpack(deferred);
361-
} else if (value instanceof Function0<?> deferred) {
362-
return (T) this.unpack(deferred);
363-
} else if (value instanceof Supplier<?> deferred) {
364-
return (T) this.unpack(deferred);
365-
} else {
366-
return (T) value;
367-
}
348+
return Util.unpack(value);
368349
}
369350
}

0 commit comments

Comments
 (0)