Skip to content

Commit ff836cd

Browse files
Snapshot handling in SonatypeCentralPublishModule/publishAll (#5539)
Currently, there are two ways to publish artifacts to Sonatype Central: - `./mill __.publishSonatypeCentral` - `./mill SonatypeCentralPublishModule/publishAll` They have different code paths, and when adding snapshot support, I only added it to `publishSonatypeCentral`, which resulted in people being confused about why things do not work when they use `SonatypeCentralPublishModule/publishAll`. I looked at whether snapshot support can be added to `publishAll`, but it seems it is a bit of a hack, as the `publishArtifacts: mill.util.Tasks[PublishModule.PublishData] = Tasks.resolveMainDefault("__:PublishModule.publishArtifacts")` value does not have enough metadata for snapshot publishing (we require `PublishInfo`, but by the time we get `PublishData` it is already gone). However, I implemented extracting metadata from strings. It is not guaranteed to work with all cases: https://github.com/arturaz/mill/blob/e88240354d4ba417748aedfebda6f7c8b1c92d62/libs/javalib/src/mill/javalib/publish/PublishInfo.scala#L69-L101, but it seems to work fine for the default publishing workflow, which is what most people use. For future reference, the whole publishing pipeline needs improvements, as mentioned in #5538. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent 09dbec2 commit ff836cd

File tree

8 files changed

+478
-283
lines changed

8 files changed

+478
-283
lines changed

integration/feature/publish-sonatype-central-snapshots/src/PublishSonatypeCentralSnapshotTests.scala

Lines changed: 116 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -5,115 +5,135 @@ import utest.*
55
object PublishSonatypeCentralSnapshotTests extends UtestIntegrationTestSuite {
66
private val ENV_VAR_PUBLISH_ORG = "MILL_TESTS_PUBLISH_ORG"
77
private val ENV_VAR_DRY_RUN = "MILL_TESTS_PUBLISH_DRY_RUN"
8-
9-
val tests: Tests = Tests {
10-
test("actual") - integrationTest { tester =>
11-
import tester.*
12-
13-
val env = sys.env
14-
val maybePublishOrg = env.get(ENV_VAR_PUBLISH_ORG)
15-
val maybePublishUsername = env.get(USERNAME_ENV_VARIABLE_NAME)
16-
val maybePublishPassword = env.get(PASSWORD_ENV_VARIABLE_NAME)
17-
18-
(maybePublishOrg, maybePublishUsername, maybePublishPassword) match {
19-
case (Some(publishOrg), Some(publishUsername), Some(publishPassword)) =>
20-
val res = eval(
21-
"testProject.publishSonatypeCentral",
22-
env = Map(
23-
ENV_VAR_PUBLISH_ORG -> publishOrg,
24-
USERNAME_ENV_VARIABLE_NAME -> publishUsername,
25-
PASSWORD_ENV_VARIABLE_NAME -> publishPassword
26-
)
8+
private val PublishTaskName = "testProject.publishSonatypeCentral"
9+
private val PublishDirName = os.SubPath("testProject/publishSonatypeCentral.dest")
10+
private val PublishAllTaskName = "mill.javalib.SonatypeCentralPublishModule/publishAll"
11+
private val PublishAllDirName =
12+
os.SubPath("mill/javalib/SonatypeCentralPublishModule/publishAll.dest")
13+
14+
private def actual(taskName: String): Unit = integrationTest { tester =>
15+
import tester.*
16+
17+
val env = sys.env
18+
val maybePublishOrg = env.get(ENV_VAR_PUBLISH_ORG)
19+
val maybePublishUsername = env.get(USERNAME_ENV_VARIABLE_NAME)
20+
val maybePublishPassword = env.get(PASSWORD_ENV_VARIABLE_NAME)
21+
22+
(maybePublishOrg, maybePublishUsername, maybePublishPassword) match {
23+
case (Some(publishOrg), Some(publishUsername), Some(publishPassword)) =>
24+
val res = eval(
25+
taskName,
26+
env = Map(
27+
ENV_VAR_PUBLISH_ORG -> publishOrg,
28+
USERNAME_ENV_VARIABLE_NAME -> publishUsername,
29+
PASSWORD_ENV_VARIABLE_NAME -> publishPassword
2730
)
28-
println(res.debugString)
29-
// Extract the values so that `assert` macro would print them out nicely if the test fails
30-
// instead of printing `res` twice.
31-
val isSuccess = res.isSuccess
32-
val err = res.err
33-
assert(isSuccess && err.contains("finished with result:"))
34-
35-
case _ =>
36-
case class WithName[A](name: String, description: String, value: A)
37-
val missingEnvVars = Vector(
38-
WithName(
39-
ENV_VAR_PUBLISH_ORG,
40-
"The organization to publish to",
41-
maybePublishOrg
42-
),
43-
WithName(USERNAME_ENV_VARIABLE_NAME, "Sonatype Central username", maybePublishUsername),
44-
WithName(PASSWORD_ENV_VARIABLE_NAME, "Sonatype Central password", maybePublishPassword)
45-
).filter(_.value.isEmpty).map(v => s"${v.name} (${v.description})")
46-
47-
println(
48-
s"""Test is disabled by default (due to the potential flakyness and slowness of Sonatype Central).
49-
|
50-
|To enable this test, set the following environment variables:
51-
|${missingEnvVars.mkString("\n")}""".stripMargin
52-
)
53-
}
31+
)
32+
println(res.debugString)
33+
// Extract the values so that `assert` macro would print them out nicely if the test fails
34+
// instead of printing `res` twice.
35+
val isSuccess = res.isSuccess
36+
val err = res.err
37+
assert(isSuccess && err.contains("finished with result:"))
38+
39+
case _ =>
40+
case class WithName[A](name: String, description: String, value: A)
41+
val missingEnvVars = Vector(
42+
WithName(
43+
ENV_VAR_PUBLISH_ORG,
44+
"The organization to publish to",
45+
maybePublishOrg
46+
),
47+
WithName(USERNAME_ENV_VARIABLE_NAME, "Sonatype Central username", maybePublishUsername),
48+
WithName(PASSWORD_ENV_VARIABLE_NAME, "Sonatype Central password", maybePublishPassword)
49+
).filter(_.value.isEmpty).map(v => s"${v.name} (${v.description})")
50+
51+
println(
52+
s"""Test is disabled by default (due to the potential flakyness and slowness of Sonatype Central).
53+
|
54+
|To enable this test, set the following environment variables:
55+
|${missingEnvVars.mkString("\n")}""".stripMargin
56+
)
5457
}
58+
}
5559

56-
test("dryRun") - integrationTest { tester =>
57-
import tester.*
60+
private def dryRun(taskName: String, dirName: os.SubPath): Unit = integrationTest { tester =>
61+
import tester.*
5862

59-
val res = eval(
60-
"testProject.publishSonatypeCentral",
61-
env = Map(
62-
ENV_VAR_PUBLISH_ORG -> "io.github.mill_tests",
63-
USERNAME_ENV_VARIABLE_NAME -> "mill-tests-username",
64-
PASSWORD_ENV_VARIABLE_NAME -> "mill-tests-password",
65-
ENV_VAR_DRY_RUN -> "1"
66-
)
63+
val res = eval(
64+
taskName,
65+
env = Map(
66+
ENV_VAR_PUBLISH_ORG -> "io.github.mill_tests",
67+
USERNAME_ENV_VARIABLE_NAME -> "mill-tests-username",
68+
PASSWORD_ENV_VARIABLE_NAME -> "mill-tests-password",
69+
ENV_VAR_DRY_RUN -> "1"
6770
)
68-
println(res.debugString)
69-
// Extract the values so that `assert` macro would print them out nicely if the test fails
70-
// instead of printing `res` twice.
71-
val isSuccess = res.isSuccess
72-
val err = res.err
73-
assert(isSuccess && err.contains("finished with result:"))
71+
)
72+
println(res.debugString)
73+
// Extract the values so that `assert` macro would print them out nicely if the test fails
74+
// instead of printing `res` twice.
75+
val isSuccess = res.isSuccess
76+
val err = res.err
77+
assert(isSuccess && err.contains("finished with result:"))
7478

75-
val publishedDir =
76-
workspacePath / "out" / "testProject" / "publishSonatypeCentral.dest" / "repository" / "io" / "github" /
77-
"mill_tests" / "testProject_3"
79+
val publishedDir =
80+
workspacePath / "out" / dirName / "repository" / "io" / "github" / "mill_tests" / "testProject_3"
7881

79-
val rootMetadataFile = publishedDir / "maven-metadata.xml"
80-
assert(os.exists(rootMetadataFile))
82+
val rootMetadataFile = publishedDir / "maven-metadata.xml"
83+
assert(os.exists(rootMetadataFile))
8184

82-
val rootMetadataContents = os.read(rootMetadataFile)
83-
assert(rootMetadataContents.contains("<version>0.0.1-SNAPSHOT</version>"))
85+
val rootMetadataContents = os.read(rootMetadataFile)
86+
assert(rootMetadataContents.contains("<version>0.0.1-SNAPSHOT</version>"))
8487

85-
val publishedVersionDir = publishedDir / "0.0.1-SNAPSHOT"
88+
val publishedVersionDir = publishedDir / "0.0.1-SNAPSHOT"
8689

87-
val metadataFile = publishedVersionDir / "maven-metadata.xml"
88-
assert(os.exists(metadataFile))
90+
val metadataFile = publishedVersionDir / "maven-metadata.xml"
91+
assert(os.exists(metadataFile))
8992

90-
val metadataContents: String = os.read(metadataFile)
91-
assert(metadataContents.contains("<version>0.0.1-SNAPSHOT</version>"))
93+
val metadataContents: String = os.read(metadataFile)
94+
assert(metadataContents.contains("<version>0.0.1-SNAPSHOT</version>"))
9295

93-
val timestampRegex = """<timestamp>(\d{8}\.\d{6})</timestamp>""".r
94-
val timestamp = timestampRegex.findFirstMatchIn(metadataContents).map(_.group(1)).getOrElse {
95-
throw new Exception(
96-
s"No timestamp found via $timestampRegex in $metadataFile:\n$metadataContents"
97-
)
98-
}
99-
100-
val expectedFiles = Vector(
101-
rootMetadataFile,
102-
publishedDir / "maven-metadata.xml.md5",
103-
publishedDir / "maven-metadata.xml.sha1",
104-
metadataFile,
105-
publishedVersionDir / "maven-metadata.xml.md5",
106-
publishedVersionDir / "maven-metadata.xml.sha1",
107-
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.jar",
108-
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.jar.md5",
109-
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.jar.sha1",
110-
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.pom",
111-
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.pom.md5",
112-
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.pom.sha1"
96+
val timestampRegex = """<timestamp>(\d{8}\.\d{6})</timestamp>""".r
97+
val timestamp = timestampRegex.findFirstMatchIn(metadataContents).map(_.group(1)).getOrElse {
98+
throw new Exception(
99+
s"No timestamp found via $timestampRegex in $metadataFile:\n$metadataContents"
113100
)
114-
val actualFiles = os.walk(publishedDir).toVector
115-
val missingFiles = expectedFiles.filterNot(actualFiles.contains)
116-
assert(missingFiles.isEmpty)
101+
}
102+
103+
val expectedFiles = Vector(
104+
rootMetadataFile,
105+
publishedDir / "maven-metadata.xml.md5",
106+
publishedDir / "maven-metadata.xml.sha1",
107+
metadataFile,
108+
publishedVersionDir / "maven-metadata.xml.md5",
109+
publishedVersionDir / "maven-metadata.xml.sha1",
110+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.jar",
111+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.jar.md5",
112+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.jar.sha1",
113+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1-sources.jar",
114+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1-sources.jar.md5",
115+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1-sources.jar.sha1",
116+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1-javadoc.jar",
117+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1-javadoc.jar.md5",
118+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1-javadoc.jar.sha1",
119+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.pom",
120+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.pom.md5",
121+
publishedVersionDir / s"testProject_3-0.0.1-$timestamp-1.pom.sha1"
122+
)
123+
val actualFiles = os.walk(publishedDir).toVector
124+
val missingFiles = expectedFiles.filterNot(actualFiles.contains)
125+
assert(missingFiles.isEmpty)
126+
}
127+
128+
val tests: Tests = Tests {
129+
test("actual") {
130+
test("module") - actual(PublishTaskName)
131+
test("externalModule") - actual(PublishAllTaskName)
132+
}
133+
134+
test("dryRun") {
135+
test("module") - dryRun(PublishTaskName, PublishDirName)
136+
test("externalModule") - dryRun(PublishAllTaskName, PublishAllDirName)
117137
}
118138
}
119139
}

integration/feature/publish-sonatype-central/src/PublishSonatypeCentralTests.scala

Lines changed: 57 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,59 +4,68 @@ import utest.*
44

55
object PublishSonatypeCentralTests extends UtestIntegrationTestSuite {
66
private val ENV_VAR_DRY_RUN = "MILL_TESTS_PUBLISH_DRY_RUN"
7+
private val PublishTaskName = "testProject.publishSonatypeCentral"
8+
private val PublishDirName = os.SubPath("testProject/publishSonatypeCentral.dest")
9+
private val PublishAllTaskName = "mill.javalib.SonatypeCentralPublishModule/publishAll"
10+
private val PublishAllDirName =
11+
os.SubPath("mill/javalib/SonatypeCentralPublishModule/publishAll.dest")
712

8-
val tests: Tests = Tests {
9-
test("dryRun") - integrationTest { tester =>
10-
import tester.*
13+
private def dryRun(taskName: String, dirName: os.SubPath): Unit = integrationTest { tester =>
14+
import tester.*
1115

12-
val res = eval(
13-
"testProject.publishSonatypeCentral",
14-
env = Map(
15-
USERNAME_ENV_VARIABLE_NAME -> "mill-tests-username",
16-
PASSWORD_ENV_VARIABLE_NAME -> "mill-tests-password",
17-
ENV_VAR_DRY_RUN -> "1",
18-
"MILL_PGP_SECRET_BASE64" -> "LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQoKeFZnRWFHekhpeFlKS3dZQkJBSGFSdzhCQVFkQWxQamhsaGo5MUtZUnhDQXFtaUZNMjR1UEVDL0kxemR0CnlWS2dRR1lENHZZQUFQOW9jK0ZFQzQ2dkt6b0tNWVE3M1Jvemh4UDE3WWhUZnZwRFBwYk1CZHNZQ2c2RQp6VEpwYnk1bmFYUm9kV0l1WVhKMGRYSmhlaTUwWlhOMFVISnZhbVZqZENCaWIzUWdQR0Z6UUdGeWRIVnkKWVhvdWJtVjBQc0tNQkJBV0NnQWRCUUpvYk1lTEJBc0pCd2dERlFnS0JCWUFBZ0VDR1FFQ0d3TUNIZ0VBCklRa1FBMkRDK3lxemF1RVdJUVRnUmJWQ05LcVpxRTFkdDB3RFlNTDdLck5xNFR1L0FQNHRDYzZpYWNUdQpZVEJBa2Q3UDZOM1E1VTZjbGdnSElVQ2lRL3lIbmFvVHZ3RUExbU92M2MydEVORGtrdnF5Ujl2YVhWNHEKZlBEckNDRmRTUTR0anpMY3hnVEhYUVJvYk1lTEVnb3JCZ0VFQVpkVkFRVUJBUWRBUHpzMjV5RERLSC80Cm1KNmtMU1dLSExITXJEWUZMWGVHOTNWRTluSVY0Q0FEQVFnSEFBRC9aQ1hVMDhqMkZTU2VYQWdZaFZzNwp2akVDQjQweTA2TjdaM0pqaitCSko3Z08xc0o0QkJnV0NBQUpCUUpvYk1lTEFoc01BQ0VKRUFOZ3d2c3EKczJyaEZpRUU0RVcxUWpTcW1haE5YYmRNQTJEQyt5cXphdUgrY2dEL1QxRUVkVDl1WnR6L255bGk1OHR0CjYxaWNLcndyU3kzSTBBRDNYWWErcm40QS9qWEZlZXNsNVBZZWtpU0ZzNVZGNUczRVNpWmY0amJxZXlOWQpLd09ENVIwSwo9WDhSdQotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQo="
19-
)
16+
val res = eval(
17+
taskName,
18+
env = Map(
19+
USERNAME_ENV_VARIABLE_NAME -> "mill-tests-username",
20+
PASSWORD_ENV_VARIABLE_NAME -> "mill-tests-password",
21+
ENV_VAR_DRY_RUN -> "1",
22+
"MILL_PGP_SECRET_BASE64" -> "LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQoKeFZnRWFHekhpeFlKS3dZQkJBSGFSdzhCQVFkQWxQamhsaGo5MUtZUnhDQXFtaUZNMjR1UEVDL0kxemR0CnlWS2dRR1lENHZZQUFQOW9jK0ZFQzQ2dkt6b0tNWVE3M1Jvemh4UDE3WWhUZnZwRFBwYk1CZHNZQ2c2RQp6VEpwYnk1bmFYUm9kV0l1WVhKMGRYSmhlaTUwWlhOMFVISnZhbVZqZENCaWIzUWdQR0Z6UUdGeWRIVnkKWVhvdWJtVjBQc0tNQkJBV0NnQWRCUUpvYk1lTEJBc0pCd2dERlFnS0JCWUFBZ0VDR1FFQ0d3TUNIZ0VBCklRa1FBMkRDK3lxemF1RVdJUVRnUmJWQ05LcVpxRTFkdDB3RFlNTDdLck5xNFR1L0FQNHRDYzZpYWNUdQpZVEJBa2Q3UDZOM1E1VTZjbGdnSElVQ2lRL3lIbmFvVHZ3RUExbU92M2MydEVORGtrdnF5Ujl2YVhWNHEKZlBEckNDRmRTUTR0anpMY3hnVEhYUVJvYk1lTEVnb3JCZ0VFQVpkVkFRVUJBUWRBUHpzMjV5RERLSC80Cm1KNmtMU1dLSExITXJEWUZMWGVHOTNWRTluSVY0Q0FEQVFnSEFBRC9aQ1hVMDhqMkZTU2VYQWdZaFZzNwp2akVDQjQweTA2TjdaM0pqaitCSko3Z08xc0o0QkJnV0NBQUpCUUpvYk1lTEFoc01BQ0VKRUFOZ3d2c3EKczJyaEZpRUU0RVcxUWpTcW1haE5YYmRNQTJEQyt5cXphdUgrY2dEL1QxRUVkVDl1WnR6L255bGk1OHR0CjYxaWNLcndyU3kzSTBBRDNYWWErcm40QS9qWEZlZXNsNVBZZWtpU0ZzNVZGNUczRVNpWmY0amJxZXlOWQpLd09ENVIwSwo9WDhSdQotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQo="
2023
)
21-
println(res.debugString)
22-
// Extract the values so that `assert` macro would print them out nicely if the test fails
23-
// instead of printing `res` twice.
24-
val isSuccess = res.isSuccess
25-
assert(isSuccess)
24+
)
25+
println(res.debugString)
26+
// Extract the values so that `assert` macro would print them out nicely if the test fails
27+
// instead of printing `res` twice.
28+
val isSuccess = res.isSuccess
29+
assert(isSuccess)
2630

27-
val dir =
28-
workspacePath / "out" / "testProject" / "publishSonatypeCentral.dest" / "repository" /
29-
"io.github.lihaoyi.testProject_3-0.0.1"
31+
val dir =
32+
workspacePath / "out" / dirName / "repository" / "io.github.lihaoyi.testProject_3-0.0.1"
3033

31-
val expectedFiles = Vector(
32-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar",
33-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.asc",
34-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.asc.md5",
35-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.asc.sha1",
36-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.md5",
37-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.sha1",
38-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar",
39-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.asc",
40-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.asc.md5",
41-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.asc.sha1",
42-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.md5",
43-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.sha1",
44-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar",
45-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.asc",
46-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.asc.md5",
47-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.asc.sha1",
48-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.md5",
49-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.sha1",
50-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom",
51-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.asc",
52-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.asc.md5",
53-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.asc.sha1",
54-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.md5",
55-
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.sha1"
56-
)
57-
val actualFiles = os.walk(dir).toVector
58-
val missingFiles = expectedFiles.filterNot(actualFiles.contains)
59-
assert(missingFiles.isEmpty)
34+
val expectedFiles = Vector(
35+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar",
36+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.asc",
37+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.asc.md5",
38+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.asc.sha1",
39+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.md5",
40+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-javadoc.jar.sha1",
41+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar",
42+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.asc",
43+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.asc.md5",
44+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.asc.sha1",
45+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.md5",
46+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1-sources.jar.sha1",
47+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar",
48+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.asc",
49+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.asc.md5",
50+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.asc.sha1",
51+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.md5",
52+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.jar.sha1",
53+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom",
54+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.asc",
55+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.asc.md5",
56+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.asc.sha1",
57+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.md5",
58+
dir / "io/github/lihaoyi/testProject_3/0.0.1/testProject_3-0.0.1.pom.sha1"
59+
)
60+
val actualFiles = os.walk(dir).toVector
61+
val missingFiles = expectedFiles.filterNot(actualFiles.contains)
62+
assert(missingFiles.isEmpty)
63+
}
64+
65+
val tests: Tests = Tests {
66+
test("dryRun") {
67+
test("module") - dryRun(PublishTaskName, PublishDirName)
68+
test("externalModule") - dryRun(PublishAllTaskName, PublishAllDirName)
6069
}
6170
}
6271
}

0 commit comments

Comments
 (0)