From 8e64caae8f01283cbfaa1df8761265c7d8f3c49b Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Thu, 15 Dec 2022 13:44:11 +0100 Subject: [PATCH] Add scripted to test the sbt plugin resolution As of sbt 1.9, we publish deprecated and valid poms. In this test we check that sbt resolve the valid pom of an sbt plugin and fallback to the deprecated pom if the valid pom cannot be found. --- .../sbt-plugin-diamond/build.sbt | 105 ++++++++++++++++++ .../sbt-plugin-diamond/test | 12 ++ 2 files changed, 117 insertions(+) create mode 100644 sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/build.sbt create mode 100644 sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/test diff --git a/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/build.sbt b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/build.sbt new file mode 100644 index 000000000..1a33daa26 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/build.sbt @@ -0,0 +1,105 @@ +// sbt-plugin-example-diamond is a diamond graph of dependencies of sbt plugins. +// sbt-plugin-example-diamond +// / \ +// sbt-plugin-example-left sbt-plugin-example-right +// \ / +// sbt-plugin-example-bottom +// Depending on the version of sbt-plugin-example-diamond, we test different patterns +// of dependencies: +// * Some dependencies were published using the deprecated Maven paths, some with the new +// * Wheter the dependency on sbt-plugin-example-bottom needs conflict resolution or not + +inThisBuild( + Seq( + csrCacheDirectory := baseDirectory.value / "coursier-cache" + ) +) + +// only deprecated Maven paths +lazy val v1 = project + .in(file("v1")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.1.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond-0.1.0.jar", + "sbt-plugin-example-left-0.1.0.jar", + "sbt-plugin-example-right-0.1.0.jar", + "sbt-plugin-example-bottom-0.1.0.jar", + ).value + ) + +// diamond and left use the new Maven paths +lazy val v2 = project + .in(file("v2")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.2.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond_2.12_1.0-0.2.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.2.0.jar", + "sbt-plugin-example-right-0.1.0.jar", + "sbt-plugin-example-bottom-0.1.0.jar", + ).value + ) + +// conflict resolution on bottom between new and deprecated Maven paths +lazy val v3 = project + .in(file("v3")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.3.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right-0.1.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.2.0.jar", + ).value + ) + +// right still uses the deprecated Maven path and it depends on bottom +// which uses the new Maven path +lazy val v4 = project + .in(file("v4")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.4.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond_2.12_1.0-0.4.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right-0.2.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.2.0.jar", + ).value + ) + +// only new Maven paths with conflict resolution on bottom +lazy val v5 = project + .in(file("v5")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.5.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond_2.12_1.0-0.5.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.3.0.jar", + ).value + ) + +def localCache = + ivyPaths := IvyPaths(baseDirectory.value, Some((ThisBuild / baseDirectory).value / "ivy-cache")) + +lazy val checkUpdate = taskKey[Unit]("check the resolved artifacts") + +def checkUpdateDef(expected: String*): Def.Initialize[Task[Unit]] = Def.task { + val report = update.value + val obtainedFiles = report.configurations + .find(_.configuration.name == Compile.name) + .toSeq + .flatMap(_.modules) + .flatMap(_.artifacts) + .map(_._2) + val obtainedSet = obtainedFiles.map(_.getName).toSet + val expectedSet = expected.toSet + "scala-library.jar" + assert(obtainedSet == expectedSet, obtainedFiles) +} diff --git a/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/test b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/test new file mode 100644 index 000000000..2ba8a5cca --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/test @@ -0,0 +1,12 @@ +> v1/checkUpdate +> v2/checkUpdate +> v3/checkUpdate +> v4/checkUpdate +> v5/checkUpdate + +> set ThisBuild/useCoursier:=true +> v1/checkUpdate +> v2/checkUpdate +> v3/checkUpdate +> v4/checkUpdate +> v5/checkUpdate