Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ repositories {

dependencies {
implementation(kotlin("gradle-plugin"))
implementation("org.ajoberstar:gradle-git-publish:0.3.3")
implementation("org.ajoberstar.git-publish:gradle-git-publish:5.1.1")

implementation("org.asciidoctor:asciidoctor-gradle-jvm:4.0.4")
}
Expand Down
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id("com.gradle.enterprise").version("3.1.1")
id("com.gradle.enterprise").version("3.19.2")
}

rootProject.name = "gradle-playframework"
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import spock.lang.TempDir

class AbstractIntegrationTest extends Specification {

boolean enableCC = true

@TempDir
File temporaryFolder

Expand All @@ -32,9 +34,13 @@ class AbstractIntegrationTest extends Specification {
}

private GradleRunner createAndConfigureGradleRunner(String... arguments) {
def args = (arguments + ['-s']) as List<String>
if (enableCC) {
args += '--configuration-cache'
}
GradleRunner.create()
.withProjectDir(projectDir)
.withArguments(arguments + '-s' as List<String>)
.withArguments(args)
.withPluginClasspath().forwardOutput()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import static org.gradle.playframework.fixtures.Repositories.playRepositories

abstract class WellBehavedPluginTest extends AbstractIntegrationTest {


def setup() {
buildFile << """
plugins {
Expand All @@ -17,6 +18,7 @@ abstract class WellBehavedPluginTest extends AbstractIntegrationTest {

// TODO: End result should be that only the help task is realized
def "does not realize all possible tasks"() {
enableCC = false
buildFile << """
def configuredTasks = []
tasks.configureEach {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.gradle.playframework.plugins;

import org.gradle.api.*;
import org.gradle.api.artifacts.ArtifactCollection;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.component.ComponentIdentifier;
import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
Expand All @@ -11,6 +10,7 @@
import org.gradle.api.distribution.DistributionContainer;
import org.gradle.api.distribution.plugins.DistributionPlugin;
import org.gradle.api.file.CopySpec;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.FileCopyDetails;
import org.gradle.api.provider.Provider;
import org.gradle.api.provider.ProviderFactory;
Expand All @@ -27,10 +27,7 @@
import org.gradle.util.GradleVersion;

import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.function.Function;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -83,6 +80,15 @@ private void createDistributionContentTasks(Project project, Distribution distri
final String capitalizedDistName = capitalizeDistributionName(distribution.getName());
final String jarTaskName = "create" + capitalizedDistName + "DistributionJar";

// Workaround for gradle/gradle#25372: how to safely use ResolvedArtifactResult as task input.
Configuration runtimeClasspath = project.getConfigurations().getByName(RUNTIME_CLASSPATH_CONFIGURATION_NAME);
Provider<Set<ResolvedArtifactResult>> artifactsProvider = runtimeClasspath.getIncoming().getArtifacts().getResolvedArtifacts();
Provider<Set<ComponentIdAndFile>> componentAndFileProvider = artifactsProvider.map(resultSet ->
resultSet.stream()
.map(result -> new ComponentIdAndFile(result.getId().getComponentIdentifier(), result.getFile()))
.collect(Collectors.toSet())
);

TaskProvider<Jar> distributionJarTask = project.getTasks().register(jarTaskName, Jar.class, jar -> {
jar.setDescription("Assembles an application jar suitable for deployment.");
jar.dependsOn(mainJarTask, assetsJarTask);
Expand All @@ -91,7 +97,7 @@ private void createDistributionContentTasks(Project project, Distribution distri
jar.getArchiveBaseName().convention(mainJarTask.flatMap(AbstractArchiveTask::getArchiveBaseName));

Map<String, Object> classpath = new HashMap<>();
classpath.put("Class-Path", new PlayManifestClasspath(project.getConfigurations().getByName(RUNTIME_CLASSPATH_CONFIGURATION_NAME), assetsJarTask.get().getArchiveFile().get().getAsFile()));
classpath.put("Class-Path", new PlayManifestClasspath(runtimeClasspath, componentAndFileProvider, assetsJarTask.get().getArchiveFile().get().getAsFile()));
jar.getManifest().attributes(classpath);
});

Expand All @@ -114,7 +120,7 @@ private void createDistributionContentTasks(Project project, Distribution distri
copySpec.from(distributionJarTask);
copySpec.from(assetsJarTask.flatMap(AbstractArchiveTask::getArchiveFile));
copySpec.from(project.getConfigurations().getByName(RUNTIME_CLASSPATH_CONFIGURATION_NAME));
copySpec.eachFile(new PrefixArtifactFileNames(project.getConfigurations().getByName(RUNTIME_CLASSPATH_CONFIGURATION_NAME)));
copySpec.eachFile(new PrefixArtifactFileNames(componentAndFileProvider));
});

distSpec.into("bin", copySpec -> {
Expand Down Expand Up @@ -219,30 +225,32 @@ private String capitalizeDistributionName(String distributionName) {
* Represents a classpath to be defined in a jar manifest
*/
static class PlayManifestClasspath {
final Configuration configuration;
final File assetsJarFile;
private final Provider<Set<ComponentIdAndFile>> componentAndFileProvider;
private final FileCollection configuration;

public PlayManifestClasspath(Configuration configuration, File assetsJarFile) {
public PlayManifestClasspath(FileCollection configuration, Provider<Set<ComponentIdAndFile>> componentAndFileProvider, File assetsJarFile) {
this.componentAndFileProvider = componentAndFileProvider;
this.configuration = configuration;
this.assetsJarFile = assetsJarFile;
}

@Override
public String toString() {
Stream<File> allFiles = Stream.concat(configuration.getFiles().stream(), Collections.singleton(assetsJarFile).stream());
Stream<String> transformedFiles = allFiles.map(new PrefixArtifactFileNames(configuration));
Stream<String> transformedFiles = allFiles.map(new PrefixArtifactFileNames(componentAndFileProvider));
return String.join(" ",
transformedFiles.collect(Collectors.toList())
);
}
}

static class PrefixArtifactFileNames implements Action<FileCopyDetails>, Function<File, String> {
private final Configuration configuration;
private final Provider<Set<ComponentIdAndFile>> componentAndFileProvider;
Map<File, String> renames;

PrefixArtifactFileNames(Configuration configuration) {
this.configuration = configuration;
PrefixArtifactFileNames(Provider<Set<ComponentIdAndFile>> componentAndFileProvider) {
this.componentAndFileProvider = componentAndFileProvider;
}

@Override
Expand All @@ -268,26 +276,25 @@ private void calculateRenames() {

private Map<File, String> calculate() {
Map<File, String> files = new HashMap<>();
for (ResolvedArtifactResult artifact : getResolvedArtifacts()) {
ComponentIdentifier componentId = artifact.getId().getComponentIdentifier();
for (ComponentIdAndFile artifact : getResolvedArtifacts()) {
ComponentIdentifier componentId = artifact.getComponentId();
if (componentId instanceof ProjectComponentIdentifier) {
// rename project dependencies
ProjectComponentIdentifier projectComponentIdentifier = (ProjectComponentIdentifier) componentId;
files.put(artifact.getFile(), renameForProject(projectComponentIdentifier, artifact.getFile()));
files.put(artifact.getArtifactFile(), renameForProject(projectComponentIdentifier, artifact.getArtifactFile()));
} else if (componentId instanceof ModuleComponentIdentifier) {
ModuleComponentIdentifier moduleComponentIdentifier = (ModuleComponentIdentifier) componentId;
files.put(artifact.getFile(), renameForModule(moduleComponentIdentifier, artifact.getFile()));
files.put(artifact.getArtifactFile(), renameForModule(moduleComponentIdentifier, artifact.getArtifactFile()));
} else {
// don't rename other types of dependencies
files.put(artifact.getFile(), artifact.getFile().getName());
files.put(artifact.getArtifactFile(), artifact.getArtifactFile().getName());
}
}
return Collections.unmodifiableMap(files);
}

Set<ResolvedArtifactResult> getResolvedArtifacts() {
ArtifactCollection artifacts = configuration.getIncoming().getArtifacts();
return artifacts.getArtifacts();
Set<ComponentIdAndFile> getResolvedArtifacts() {
return componentAndFileProvider.get();
}

static String renameForProject(ProjectComponentIdentifier id, File file) {
Expand Down Expand Up @@ -330,3 +337,34 @@ private static boolean hasExtension(File file, String extension) {
return file.getPath().endsWith(extension);
}
}

class ComponentIdAndFile {
private final ComponentIdentifier componentId;
private final File artifactFile;


ComponentIdAndFile(ComponentIdentifier componentId, File artifactFile) {
this.componentId = componentId;
this.artifactFile = artifactFile;
}

public ComponentIdentifier getComponentId() {
return componentId;
}

public File getArtifactFile() {
return artifactFile;
}

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
ComponentIdAndFile componentIdAndFile = (ComponentIdAndFile) o;
return Objects.equals(componentId, componentIdAndFile.componentId) && Objects.equals(artifactFile, componentIdAndFile.artifactFile);
}

@Override
public int hashCode() {
return Objects.hash(componentId, artifactFile);
}
}
24 changes: 13 additions & 11 deletions src/main/java/org/gradle/playframework/tasks/JavaScriptMinify.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
package org.gradle.playframework.tasks;

import org.gradle.api.Action;
import org.gradle.api.file.*;
import org.gradle.playframework.tasks.internal.JavaScriptMinifyParameters;
import org.gradle.playframework.tasks.internal.JavaScriptMinifyRunnable;
import org.gradle.playframework.tasks.internal.JavaScriptMinifyWorkAction;
import org.gradle.playframework.tools.internal.javascript.DefaultJavaScriptCompileSpec;
import org.gradle.playframework.tools.internal.javascript.JavaScriptCompileSpec;
import org.gradle.playframework.tools.internal.javascript.SimpleStaleClassCleaner;
import org.gradle.playframework.tools.internal.javascript.StaleClassCleaner;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.file.Directory;
import org.gradle.api.file.FileTree;
import org.gradle.api.file.FileVisitDetails;
import org.gradle.api.file.FileVisitor;
import org.gradle.api.internal.file.FileOperations;
import org.gradle.api.internal.file.RelativeFile;
import org.gradle.api.internal.project.ProjectInternal;
Expand Down Expand Up @@ -41,11 +37,13 @@ public class JavaScriptMinify extends SourceTask {
private final WorkerExecutor workerExecutor;
private final Property<Directory> destinationDir;
private final ConfigurableFileCollection compilerClasspath;
private final FileSystemOperations fileSystemOperations;

@Inject
public JavaScriptMinify(WorkerExecutor workerExecutor) {
public JavaScriptMinify(WorkerExecutor workerExecutor, FileSystemOperations fileSystemOperations) {
this.workerExecutor = workerExecutor;
this.include("**/*.js");
this.fileSystemOperations = fileSystemOperations;
this.include("/*.js");
this.destinationDir = getProject().getObjects().directoryProperty();
this.compilerClasspath = getProject().files();
}
Expand Down Expand Up @@ -81,7 +79,7 @@ void compileJavaScriptSources() {
cleaner.addDirToClean(destinationDir.get().getAsFile());
cleaner.execute();

MinifyFileVisitor visitor = new MinifyFileVisitor();
MinifyFileVisitor visitor = new MinifyFileVisitor(fileSystemOperations);
getSource().visit(visitor);

JavaScriptCompileSpec spec = new DefaultJavaScriptCompileSpec(visitor.relativeFiles, destinationDir.get().getAsFile());
Expand All @@ -105,8 +103,13 @@ public void execute(JavaScriptMinifyParameters parameters) {
* Copies each file in the source set to the output directory and gathers relative files for compilation
*/
class MinifyFileVisitor implements FileVisitor {
private final FileSystemOperations fileSystemOperations;
List<RelativeFile> relativeFiles = new ArrayList<>();

MinifyFileVisitor(FileSystemOperations fileSystemOperations) {
this.fileSystemOperations = fileSystemOperations;
}

@Override
public void visitDir(FileVisitDetails dirDetails) {
new File(destinationDir.get().getAsFile(), dirDetails.getRelativePath().getPathString()).mkdirs();
Expand All @@ -116,9 +119,8 @@ public void visitDir(FileVisitDetails dirDetails) {
public void visitFile(final FileVisitDetails fileDetails) {
final File outputFileDir = new File(destinationDir.get().getAsFile(), fileDetails.getRelativePath().getParent().getPathString());

// Copy the raw form
FileOperations fileOperations = ((ProjectInternal) getProject()).getFileOperations();
fileOperations.copy(copySpec -> copySpec.from(fileDetails.getFile()).into(outputFileDir));
// Use FileSystemOperations to copy
fileSystemOperations.copy(copySpec -> copySpec.from(fileDetails.getFile()).into(outputFileDir));

// Capture the relative file
relativeFiles.add(new RelativeFile(fileDetails.getFile(), fileDetails.getRelativePath()));
Expand Down