@@ -4,7 +4,7 @@ import mill.api.{ExecResult, Result, Val}
44import mill .constants .{OutFolderMode }
55import mill .constants .OutFiles .OutFiles
66import mill .{Task , given }
7- import mill .api .{Cross , DefaultTaskModule , Discover , Module , PathRef }
7+ import mill .api .{Cross , DefaultTaskModule , Discover , ExternalModule , Module , PathRef }
88import mill .testkit .UnitTester
99import mill .testkit .TestRootModule
1010import mill .util .MainModule
@@ -15,6 +15,17 @@ import scala.collection.mutable
1515import scala .concurrent .duration .DurationInt
1616import scala .util .Properties
1717
18+ // External module for testing clean command with external workers
19+ object TestExternalWorkerModule extends ExternalModule {
20+ def externalWorker = Task .Worker {
21+ new AutoCloseable {
22+ def close () = ()
23+ override def toString = " externalWorkerInstance"
24+ }
25+ }
26+ lazy val millDiscover = Discover [this .type ]
27+ }
28+
1829object MainModuleTests extends TestSuite {
1930
2031 object mainModule extends TestRootModule with MainModule {
@@ -707,6 +718,31 @@ object MainModuleTests extends TestSuite {
707718 assert(workers.size == 2 )
708719 }
709720 }
721+
722+ test(" external-module" ) {
723+ // Test cleaning external module workers (issue #6549)
724+ // External modules have segments ending with '/' which need special handling
725+ object externalModuleBuild extends TestRootModule with MainModule {
726+ def useExternalWorker = Task {
727+ TestExternalWorkerModule .externalWorker()
728+ " done"
729+ }
730+ lazy val millDiscover = Discover [this .type ]
731+ }
732+ UnitTester (externalModuleBuild, null ).scoped { ev =>
733+ // First run the task that uses the external worker
734+ val r1 = ev.evaluator.execute(Seq (externalModuleBuild.useExternalWorker)).executionResults
735+ assert(r1.transitiveFailing.size == 0 )
736+
737+ // Now try to clean the external worker - this should not throw an error
738+ // Previously this would fail with: "[mill.util.TestExternalWorkerModule/] is not a valid path segment"
739+ val r2 = ev.evaluator.execute(Seq (externalModuleBuild.clean(
740+ ev.evaluator,
741+ " mill.util.TestExternalWorkerModule/externalWorker"
742+ ))).executionResults
743+ assert(r2.transitiveFailing.size == 0 )
744+ }
745+ }
710746 }
711747 }
712748}
0 commit comments