From 0c0fd7c7ba3269a44f14fcd0bfbd03feae8f7af4 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 22 Aug 2024 12:05:21 +0200 Subject: [PATCH] throw `Result.Failure` for prettier error messages --- main/server/src/mill/main/server/Server.scala | 4 ++-- main/util/src/mill/util/Jvm.scala | 3 ++- .../api/src/mill/scalalib/api/ZincWorkerUtil.scala | 8 ++++---- scalalib/src/mill/scalalib/CrossModuleBase.scala | 3 ++- scalalib/src/mill/scalalib/Dep.scala | 12 ++++++------ scalalib/src/mill/scalalib/PublishModule.scala | 2 +- scalalib/src/mill/scalalib/ZincWorkerModule.scala | 2 +- .../mill/scalalib/publish/SonatypeHttpApi.scala | 14 +++++++------- 8 files changed, 25 insertions(+), 23 deletions(-) diff --git a/main/server/src/mill/main/server/Server.scala b/main/server/src/mill/main/server/Server.scala index 588b1533dac..1e3672e70e4 100644 --- a/main/server/src/mill/main/server/Server.scala +++ b/main/server/src/mill/main/server/Server.scala @@ -6,7 +6,7 @@ import scala.jdk.CollectionConverters._ import org.newsclub.net.unix.AFUNIXServerSocket import org.newsclub.net.unix.AFUNIXSocketAddress import mill.main.client._ -import mill.api.SystemStreams +import mill.api.{Result, SystemStreams} import mill.main.client.ProxyStream.Output import mill.main.client.lock.{Lock, Locks} @@ -63,7 +63,7 @@ abstract class Server[T]( } ) () - }.getOrElse(throw new Exception("Mill server process already present")) + }.getOrElse(throw Result.Failure("Mill server process already present")) finally exitServer() } diff --git a/main/util/src/mill/util/Jvm.scala b/main/util/src/mill/util/Jvm.scala index 78417d35ed7..a63dda55861 100644 --- a/main/util/src/mill/util/Jvm.scala +++ b/main/util/src/mill/util/Jvm.scala @@ -185,7 +185,8 @@ object Jvm extends CoursierSupport { Runtime.getRuntime().removeShutdownHook(shutdownHook) } if (process.exitCode() == 0) () - else throw new Exception("Interactive Subprocess Failed (exit code " + process.exitCode() + ")") + else + throw Result.Failure("Interactive Subprocess Failed (exit code " + process.exitCode() + ")") } /** diff --git a/scalalib/api/src/mill/scalalib/api/ZincWorkerUtil.scala b/scalalib/api/src/mill/scalalib/api/ZincWorkerUtil.scala index 699506c1a39..4a39b135d93 100644 --- a/scalalib/api/src/mill/scalalib/api/ZincWorkerUtil.scala +++ b/scalalib/api/src/mill/scalalib/api/ZincWorkerUtil.scala @@ -1,7 +1,7 @@ package mill.scalalib.api import mill.api.Loose.Agg -import mill.api.PathRef +import mill.api.{PathRef, Result} import scala.util.matching.Regex trait ZincWorkerUtil { @@ -38,7 +38,7 @@ trait ZincWorkerUtil { classPath.iterator .find(pathRef => mavenStyleMatch(pathRef.path.last) || ivyStyleMatch(pathRef.path)) - .getOrElse(throw new Exception( + .getOrElse(throw Result.Failure( s"Cannot find **/$name-$versionPrefix*$suffix or **/$versionPrefix*/$dir/$name$suffix in ${classPath.iterator.mkString("[", ", ", "]")}" )) } @@ -68,7 +68,7 @@ trait ZincWorkerUtil { def scalaJSBinaryVersion(scalaJSVersion: String): String = scalaJSVersion match { case _ if scalaJSVersion.startsWith("0.6.") => - throw new Exception("Scala.js 0.6 is not supported") + throw Result.Failure("Scala.js 0.6 is not supported") case ScalaJSFullVersion(major, minor, patch, suffix) => if (suffix != null && minor == "0" && patch == "0") s"$major.$minor$suffix" @@ -78,7 +78,7 @@ trait ZincWorkerUtil { def scalaJSWorkerVersion(scalaJSVersion: String): String = scalaJSVersion match { case _ if scalaJSVersion.startsWith("0.6.") => - throw new Exception("Scala.js 0.6 is not supported") + throw Result.Failure("Scala.js 0.6 is not supported") case ScalaJSFullVersion(major, _, _, _) => major } diff --git a/scalalib/src/mill/scalalib/CrossModuleBase.scala b/scalalib/src/mill/scalalib/CrossModuleBase.scala index 26173331f06..ff1c6d50df4 100644 --- a/scalalib/src/mill/scalalib/CrossModuleBase.scala +++ b/scalalib/src/mill/scalalib/CrossModuleBase.scala @@ -1,6 +1,7 @@ package mill.scalalib import mill.T +import mill.api.Result import mill.define.Cross import mill.define.Cross.Resolver import mill.scalalib.api.ZincWorkerUtil @@ -31,7 +32,7 @@ trait CrossModuleBase extends ScalaModule with Cross.Module[String] { ) .collectFirst { case x => x } .getOrElse( - throw new Exception( + throw Result.Failure( s"Unable to find compatible cross version between $crossScalaVersion and " + c.crossModules.map(_.crossScalaVersion).mkString(",") ) diff --git a/scalalib/src/mill/scalalib/Dep.scala b/scalalib/src/mill/scalalib/Dep.scala index 2e37bae96bb..76b77baf1ad 100644 --- a/scalalib/src/mill/scalalib/Dep.scala +++ b/scalalib/src/mill/scalalib/Dep.scala @@ -1,12 +1,12 @@ package mill.scalalib -import upickle.default.{macroRW, ReadWriter => RW} +import coursier.core.{Configuration, Dependency} +import mill.api.Result import mill.scalalib.CrossVersion._ -import coursier.core.Dependency import mill.scalalib.api.ZincWorkerUtil +import upickle.default.{macroRW, ReadWriter => RW} import scala.annotation.unused -import coursier.core.Configuration case class Dep(dep: coursier.Dependency, cross: CrossVersion, force: Boolean) { require( @@ -110,8 +110,8 @@ object Dep { s.split('=') match { case Array("classifier", v) => as.withClassifier(coursier.Classifier(v)) case Array("type", v) => as.withType(coursier.Type(v)) - case Array(k, v) => throw new Exception(s"Unrecognized attribute: [$s]") - case _ => throw new Exception(s"Unable to parse attribute specifier: [$s]") + case Array(k, v) => throw Result.Failure(s"Unrecognized attribute: [$s]") + case _ => throw Result.Failure(s"Unable to parse attribute specifier: [$s]") } } (module.split(':') match { @@ -121,7 +121,7 @@ object Dep { case Array(a, "", b, "", c) => Dep(a, b, c, cross = Binary(platformed = true)) case Array(a, "", "", b, c) => Dep(a, b, c, cross = Full(platformed = false)) case Array(a, "", "", b, "", c) => Dep(a, b, c, cross = Full(platformed = true)) - case _ => throw new Exception(s"Unable to parse signature: [$signature]") + case _ => throw Result.Failure(s"Unable to parse signature: [$signature]") }).configure(attributes = attributes) } def apply( diff --git a/scalalib/src/mill/scalalib/PublishModule.scala b/scalalib/src/mill/scalalib/PublishModule.scala index edc92dbdeab..4700f61db6f 100644 --- a/scalalib/src/mill/scalalib/PublishModule.scala +++ b/scalalib/src/mill/scalalib/PublishModule.scala @@ -20,7 +20,7 @@ trait PublishModule extends JavaModule { outer => override def moduleDeps: Seq[PublishModule] = super.moduleDeps.map { case m: PublishModule => m case other => - throw new Exception( + throw Result.Failure( s"PublishModule moduleDeps need to be also PublishModules. $other is not a PublishModule" ) } diff --git a/scalalib/src/mill/scalalib/ZincWorkerModule.scala b/scalalib/src/mill/scalalib/ZincWorkerModule.scala index 0ce66219da3..fbf42311b62 100644 --- a/scalalib/src/mill/scalalib/ZincWorkerModule.scala +++ b/scalalib/src/mill/scalalib/ZincWorkerModule.scala @@ -76,7 +76,7 @@ trait ZincWorkerModule extends mill.Module with OfflineSupportModule { self: Cou scalaCompilerBridgeJar(x, y, repositoriesTask()) .asSuccess .getOrElse( - throw new Exception(s"Failed to load compiler bridge for $x $y") + throw Result.Failure(s"Failed to load compiler bridge for $x $y") ) .value )), diff --git a/scalalib/src/mill/scalalib/publish/SonatypeHttpApi.scala b/scalalib/src/mill/scalalib/publish/SonatypeHttpApi.scala index d6211df794c..dbd4c575683 100644 --- a/scalalib/src/mill/scalalib/publish/SonatypeHttpApi.scala +++ b/scalalib/src/mill/scalalib/publish/SonatypeHttpApi.scala @@ -5,10 +5,8 @@ import java.util.Base64 import scala.annotation.tailrec import scala.concurrent.duration._ +import mill.api.Result import mill.main.BuildInfo -import requests.BaseSession -import ujson.ParseException -import requests.Session class SonatypeHttpApi( uri: String, @@ -16,7 +14,7 @@ class SonatypeHttpApi( readTimeout: Int, connectTimeout: Int ) { - val http: Session = requests.Session( + val http: requests.Session = requests.Session( readTimeout = readTimeout, connectTimeout = connectTimeout, maxRedirects = 0, @@ -29,7 +27,9 @@ class SonatypeHttpApi( "Authorization" -> s"Basic $base64Creds", "Accept" -> "application/json", "Content-Type" -> "application/json", - "User-Agent" -> s"mill-${BuildInfo.millVersion}${BaseSession.defaultHeaders.get("User-Agent").map(" (" + _ + ")").getOrElse("")}" + "User-Agent" -> s"mill-${BuildInfo.millVersion}${requests.BaseSession.defaultHeaders.get( + "User-Agent" + ).map(" (" + _ + ")").getOrElse("")}" ) // https://oss.sonatype.org/nexus-staging-plugin/default/docs/path__staging_profiles.html @@ -42,7 +42,7 @@ class SonatypeHttpApi( ) if (!response.is2xx) { - throw new Exception(s"$uri/staging/profiles returned ${response.statusCode}") + throw Result.Failure(s"$uri/staging/profiles returned ${response.statusCode}") } val resourceUri = @@ -67,7 +67,7 @@ class SonatypeHttpApi( try { ujson.read(response.text())("type").str } catch { - case e: ParseException => + case e: ujson.ParseException => throw new RuntimeException( s"Could not parse HTTP response. ${e.getMessage()}" + "\n" + s"Raw response: ${response}", e