Skip to content

stopAfter task cannot be set from inside task  #53

@rschuetz

Description

@rschuetz

According to the documentation, the "stopAfter" task can be set from within the (Java)ExecFork task, i.e. the following should work (the "run" task simulates a task for example for integration tests that needs a server running) IMHO, right? (KTS)

plugins {
    id("com.github.psxpaul.execfork") version "0.2.0"
}

defaultTasks("run")

tasks {
    val triggerShutdown = register("triggerShutdown") {
    }

    register<com.github.psxpaul.task.ExecFork>("startServer") {
        executable = "sleep"
        args = mutableListOf("60")
        stopAfter = triggerShutdown
    }

    register("run") {
        dependsOn("startServer")
        finalizedBy("triggerShutdown", "sleep")
        doFirst {
             Thread.sleep(30 * 1000)
        }
    }

    register("sleep") {
        doFirst {
             Thread.sleep(30 * 1000)
        }
    }
}

However, it fails (tested with Gradle 7.1.1 and 7.4.2) with

* Exception is:
org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreationException: Could not create task ':startServer'.
 [...]
Caused by: org.gradle.api.internal.AbstractMutationGuard$IllegalMutationException: DefaultTaskContainer#register(String, Class, Action) on task set cannot be executed in the current context.
	at org.gradle.api.internal.AbstractMutationGuard.createIllegalStateException(AbstractMutationGuard.java:39)
	at org.gradle.api.internal.AbstractMutationGuard.assertMutationAllowed(AbstractMutationGuard.java:27)
	at org.gradle.api.internal.DefaultDomainObjectCollection.assertMutable(DefaultDomainObjectCollection.java:458)
	at org.gradle.api.internal.tasks.DefaultTaskContainer.register(DefaultTaskContainer.java:374)
	at com.github.psxpaul.task.AbstractExecFork.setStopAfter(AbstractExecFork.kt:98)
	at Build_gradle$1$1.invoke(build.gradle.kts:14)
	at Build_gradle$1$1.invoke(build.gradle.kts:1)
	at Build_gradle$inlined$sam$i$org_gradle_api_Action$0.execute(TaskContainerExtensions.kt)
 [...]

when the stop task gets registered in AbstractExecFork.kt. The same happens if

 stopAfter = triggerShutdown 

is being replaced with

 stopAfter = project.tasks.named("triggerShutdown")

The only workaround I found so far was linking both tasks later on like this:

plugins {
    id("com.github.psxpaul.execfork") version "0.2.0"
}

defaultTasks("run")

tasks {
    val triggerShutdown = register("triggerShutdown") {
    }

    val startServer = register<com.github.psxpaul.task.ExecFork>("startServer") {
        executable = "sleep"
        args = mutableListOf("60")
    }

    startServer.get().stopAfter = triggerShutdown

    register("run") {
        dependsOn("startServer")
        finalizedBy("triggerShutdown", "sleep")
        doFirst {
             Thread.sleep(30 * 1000)
        }
    }

    register("sleep") {
        doFirst {
             Thread.sleep(30 * 1000)
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions