Skip to content

Commit 77e035e

Browse files
committed
Merge branch 'main' into version-scheme-label
2 parents 4320a92 + d0929fe commit 77e035e

File tree

23 files changed

+256
-89
lines changed

23 files changed

+256
-89
lines changed

.scalafmt.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version = 3.6.1
1+
version = 3.7.0
22
runner.dialect = scala213
33
assumeStandardLibraryStripMargin = true
44
align.openParenCallSite = false

build.sbt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ lazy val dockerSettings = Def.settings(
348348
Cmd("RUN", "apk --no-cache add bash git ca-certificates curl maven openssh nodejs npm"),
349349
Cmd("RUN", s"wget $sbtUrl && tar -xf $sbtTgz && rm -f $sbtTgz"),
350350
Cmd("RUN", s"curl -L $millUrl > $millBin && chmod +x $millBin"),
351+
Cmd("RUN", "curl -sSLf https://virtuslab.github.io/scala-cli-packages/scala-setup.sh | sh"),
351352
Cmd("RUN", s"curl -L https://git.io/coursier-cli > $coursierBin && chmod +x $coursierBin"),
352353
Cmd("RUN", s"$coursierBin install --install-dir $binDir scalafix scalafmt"),
353354
Cmd("RUN", "npm install --global yarn")

modules/core/src/main/scala/org/scalasteward/core/application/Cli.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,8 @@ object Cli {
290290
"The Azure organization (required when --forge-type is azure-repos)"
291291
).orNone
292292

293-
private val azureReposConfig: Opts[AzureReposConfig] =
294-
azureReposOrganization.map(AzureReposConfig.apply)
293+
private val azureReposCfg: Opts[AzureReposCfg] =
294+
azureReposOrganization.map(AzureReposCfg.apply)
295295

296296
private val refreshBackoffPeriod: Opts[FiniteDuration] = {
297297
val default = 0.days
@@ -338,7 +338,7 @@ object Cli {
338338
bitbucketCfg,
339339
bitbucketServerCfg,
340340
gitLabCfg,
341-
azureReposConfig,
341+
azureReposCfg,
342342
gitHubApp,
343343
urlCheckerTestUrls,
344344
defaultMavenRepo,

modules/core/src/main/scala/org/scalasteward/core/application/Config.scala

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ final case class Config(
6565
bitbucketCfg: BitbucketCfg,
6666
bitbucketServerCfg: BitbucketServerCfg,
6767
gitLabCfg: GitLabCfg,
68-
azureReposConfig: AzureReposConfig,
68+
azureReposCfg: AzureReposCfg,
6969
githubApp: Option[GitHubApp],
7070
urlCheckerTestUrls: Nel[Uri],
7171
defaultResolver: Resolver,
@@ -84,6 +84,15 @@ final case class Config(
8484
prompt = s"Password for '$urlWithUser': "
8585
password <- processAlg.exec(Nel.of(gitCfg.gitAskPass.pathAsString, prompt), rootDir)
8686
} yield AuthenticatedUser(forgeCfg.login, password.mkString.trim)
87+
88+
def forgeSpecificCfg: ForgeSpecificCfg =
89+
forgeCfg.tpe match {
90+
case ForgeType.AzureRepos => azureReposCfg
91+
case ForgeType.Bitbucket => bitbucketCfg
92+
case ForgeType.BitbucketServer => bitbucketServerCfg
93+
case ForgeType.GitHub => GitHubCfg()
94+
case ForgeType.GitLab => gitLabCfg
95+
}
8796
}
8897

8998
object Config {
@@ -129,22 +138,27 @@ object Config {
129138
disableDefaults: Boolean
130139
)
131140

132-
final case class BitbucketServerCfg(
133-
useDefaultReviewers: Boolean
134-
)
141+
sealed trait ForgeSpecificCfg extends Product with Serializable
142+
143+
final case class AzureReposCfg(
144+
organization: Option[String]
145+
) extends ForgeSpecificCfg
135146

136147
final case class BitbucketCfg(
137148
useDefaultReviewers: Boolean
138-
)
149+
) extends ForgeSpecificCfg
150+
151+
final case class BitbucketServerCfg(
152+
useDefaultReviewers: Boolean
153+
) extends ForgeSpecificCfg
154+
155+
final case class GitHubCfg(
156+
) extends ForgeSpecificCfg
139157

140158
final case class GitLabCfg(
141159
mergeWhenPipelineSucceeds: Boolean,
142160
requiredReviewers: Option[Int]
143-
)
144-
145-
final case class AzureReposConfig(
146-
organization: Option[String]
147-
)
161+
) extends ForgeSpecificCfg
148162

149163
sealed trait StewardUsage
150164
object StewardUsage {

modules/core/src/main/scala/org/scalasteward/core/application/Context.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import org.scalasteward.core.buildtool.BuildToolDispatcher
3030
import org.scalasteward.core.buildtool.maven.MavenAlg
3131
import org.scalasteward.core.buildtool.mill.MillAlg
3232
import org.scalasteward.core.buildtool.sbt.SbtAlg
33+
import org.scalasteward.core.buildtool.scalacli.ScalaCliAlg
3334
import org.scalasteward.core.client.ClientConfiguration
3435
import org.scalasteward.core.coursier.{CoursierAlg, VersionsCache}
3536
import org.scalasteward.core.data.Repo
@@ -75,6 +76,7 @@ final class Context[F[_]](implicit
7576
val repoCacheAlg: RepoCacheAlg[F],
7677
val repoConfigAlg: RepoConfigAlg[F],
7778
val sbtAlg: SbtAlg[F],
79+
val scalaCliAlg: ScalaCliAlg[F],
7880
val scalafixMigrationsFinder: ScalafixMigrationsFinder,
7981
val scalafixMigrationsLoader: ScalafixMigrationsLoader[F],
8082
val scalafmtAlg: ScalafmtAlg[F],
@@ -206,7 +208,8 @@ object Context {
206208
implicit val httpJsonClient: HttpJsonClient[F] = new HttpJsonClient[F]
207209
implicit val repoCacheRepository: RepoCacheRepository[F] =
208210
new RepoCacheRepository[F](repoCacheStore)
209-
implicit val forgeApiAlg: ForgeApiAlg[F] = ForgeSelection.forgeApiAlg[F](config, forgeUser)
211+
implicit val forgeApiAlg: ForgeApiAlg[F] =
212+
ForgeSelection.forgeApiAlg[F](config.forgeCfg, config.forgeSpecificCfg, forgeUser)
210213
implicit val forgeRepoAlg: ForgeRepoAlg[F] = new ForgeRepoAlg[F](config)
211214
implicit val updateInfoUrlFinder: UpdateInfoUrlFinder[F] =
212215
new UpdateInfoUrlFinder[F](config.forgeCfg)
@@ -221,6 +224,7 @@ object Context {
221224
implicit val updateAlg: UpdateAlg[F] = new UpdateAlg[F]
222225
implicit val mavenAlg: MavenAlg[F] = new MavenAlg[F](config)
223226
implicit val sbtAlg: SbtAlg[F] = new SbtAlg[F](config)
227+
implicit val scalaCliAlg: ScalaCliAlg[F] = new ScalaCliAlg[F]
224228
implicit val millAlg: MillAlg[F] = new MillAlg[F]
225229
implicit val buildToolDispatcher: BuildToolDispatcher[F] = new BuildToolDispatcher[F]
226230
implicit val refreshErrorAlg: RefreshErrorAlg[F] =

modules/core/src/main/scala/org/scalasteward/core/buildtool/BuildToolDispatcher.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import cats.syntax.all._
2121
import org.scalasteward.core.buildtool.maven.MavenAlg
2222
import org.scalasteward.core.buildtool.mill.MillAlg
2323
import org.scalasteward.core.buildtool.sbt.SbtAlg
24+
import org.scalasteward.core.buildtool.scalacli.ScalaCliAlg
2425
import org.scalasteward.core.data.{Repo, Scope}
2526
import org.scalasteward.core.edit.scalafix.ScalafixMigration
2627
import org.scalasteward.core.repoconfig.RepoConfig
@@ -32,6 +33,7 @@ final class BuildToolDispatcher[F[_]](implicit
3233
mavenAlg: MavenAlg[F],
3334
millAlg: MillAlg[F],
3435
sbtAlg: SbtAlg[F],
36+
scalaCliAlg: ScalaCliAlg[F],
3537
scalafmtAlg: ScalafmtAlg[F],
3638
F: Monad[F]
3739
) {
@@ -54,7 +56,7 @@ final class BuildToolDispatcher[F[_]](implicit
5456
private def getBuildRoots(repo: Repo, repoConfig: RepoConfig): List[BuildRoot] =
5557
repoConfig.buildRootsOrDefault.map(buildRootCfg => BuildRoot(repo, buildRootCfg.relativePath))
5658

57-
private val allBuildTools = List(mavenAlg, millAlg, sbtAlg)
59+
private val allBuildTools = List(mavenAlg, millAlg, sbtAlg, scalaCliAlg)
5860
private val fallbackBuildTool = List(sbtAlg)
5961

6062
private def findBuildTools(buildRoot: BuildRoot): F[(BuildRoot, List[BuildToolAlg[F]])] =

modules/core/src/main/scala/org/scalasteward/core/buildtool/maven/MavenAlg.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ final class MavenAlg[F[_]](config: Config)(implicit
5858

5959
override def runMigration(buildRoot: BuildRoot, migration: ScalafixMigration): F[Unit] =
6060
logger.warn(
61-
"Scalafix migrations are currently not supported in Maven projects, see https://github.com/scala-steward-org/scala-steward/issues/2839 for details"
61+
s"Scalafix migrations are currently not supported in $name projects, see https://github.com/scala-steward-org/scala-steward/issues/2839 for details"
6262
)
6363

6464
private def exec(command: Nel[String], repoDir: File): F[List[String]] =

modules/core/src/main/scala/org/scalasteward/core/buildtool/mill/MillAlg.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import cats.effect.MonadCancelThrow
2121
import cats.syntax.all._
2222
import org.scalasteward.core.buildtool.mill.MillAlg._
2323
import org.scalasteward.core.buildtool.{BuildRoot, BuildToolAlg}
24-
import org.scalasteward.core.data.Scope.Dependencies
2524
import org.scalasteward.core.data._
2625
import org.scalasteward.core.edit.scalafix.ScalafixMigration
2726
import org.scalasteward.core.io.{FileAlg, ProcessAlg, WorkspaceAlg}
@@ -42,7 +41,7 @@ final class MillAlg[F[_]](implicit
4241
.buildRootDir(buildRoot)
4342
.flatMap(buildRootDir => fileAlg.isRegularFile(buildRootDir / "build.sc"))
4443

45-
override def getDependencies(buildRoot: BuildRoot): F[List[Dependencies]] =
44+
override def getDependencies(buildRoot: BuildRoot): F[List[Scope.Dependencies]] =
4645
for {
4746
buildRootDir <- workspaceAlg.buildRootDir(buildRoot)
4847
predef = buildRootDir / "scala-steward.sc"
@@ -66,7 +65,7 @@ final class MillAlg[F[_]](implicit
6665

6766
override def runMigration(buildRoot: BuildRoot, migration: ScalafixMigration): F[Unit] =
6867
logger.warn(
69-
"Scalafix migrations are currently not supported in Mill projects, see https://github.com/scala-steward-org/scala-steward/issues/2838 for details"
68+
s"Scalafix migrations are currently not supported in $name projects, see https://github.com/scala-steward-org/scala-steward/issues/2838 for details"
7069
)
7170

7271
private def getMillVersion(buildRootDir: File): F[Option[Version]] =
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright 2018-2023 Scala Steward contributors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.scalasteward.core.buildtool.scalacli
18+
19+
import cats.Monad
20+
import cats.syntax.all._
21+
import org.scalasteward.core.buildtool.sbt.SbtAlg
22+
import org.scalasteward.core.buildtool.{BuildRoot, BuildToolAlg}
23+
import org.scalasteward.core.data.Scope
24+
import org.scalasteward.core.edit.scalafix.ScalafixMigration
25+
import org.scalasteward.core.git.GitAlg
26+
import org.scalasteward.core.io.{FileAlg, ProcessAlg, WorkspaceAlg}
27+
import org.scalasteward.core.util.Nel
28+
import org.typelevel.log4cats.Logger
29+
30+
final class ScalaCliAlg[F[_]](implicit
31+
fileAlg: FileAlg[F],
32+
gitAlg: GitAlg[F],
33+
logger: Logger[F],
34+
processAlg: ProcessAlg[F],
35+
sbtAlg: SbtAlg[F],
36+
workspaceAlg: WorkspaceAlg[F],
37+
F: Monad[F]
38+
) extends BuildToolAlg[F] {
39+
override def name: String = "Scala CLI"
40+
41+
override def containsBuild(buildRoot: BuildRoot): F[Boolean] = {
42+
val buildRootPath = buildRoot.relativePath.dropWhile(Set('.', '/'))
43+
gitAlg
44+
.findFilesContaining(buildRoot.repo, "//> using lib ")
45+
.map(_.exists(_.startsWith(buildRootPath)))
46+
}
47+
48+
override def getDependencies(buildRoot: BuildRoot): F[List[Scope.Dependencies]] =
49+
for {
50+
buildRootDir <- workspaceAlg.buildRootDir(buildRoot)
51+
exportDir = "tmp-sbt-build-for-scala-steward"
52+
exportCmd =
53+
Nel.of("scala-cli", "export", "--sbt", "--output", exportDir, buildRootDir.pathAsString)
54+
_ <- processAlg.execSandboxed(exportCmd, buildRootDir)
55+
exportBuildRoot = buildRoot.copy(relativePath = buildRoot.relativePath + s"/$exportDir")
56+
dependencies <- sbtAlg.getDependencies(exportBuildRoot)
57+
_ <- fileAlg.deleteForce(buildRootDir / exportDir)
58+
} yield dependencies
59+
60+
override def runMigration(buildRoot: BuildRoot, migration: ScalafixMigration): F[Unit] =
61+
logger.warn(
62+
s"Scalafix migrations are currently not supported in $name projects, see https://github.com/VirtusLab/scala-cli/issues/647 for details"
63+
)
64+
}

modules/core/src/main/scala/org/scalasteward/core/edit/update/ModulePositionScanner.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,13 @@ object ModulePositionScanner {
7272
mavenDependencyRegex(dependency).findAllIn(fileData.content).matchData.map { m =>
7373
val groupId = Substring.Position.fromMatch(fileData.path, m, dependency.groupId.value)
7474
val artifactId = Substring.Position.fromMatch(fileData.path, m, dependency.artifactId.name)
75-
val version = Substring.Position.fromMatch(fileData.path, m, m.group(1))
75+
val version = Substring.Position.fromMatch(fileData.path, m, m.group(2))
7676
ModulePosition(groupId, artifactId, version)
7777
}
7878

7979
private def mavenDependencyRegex(dependency: Dependency): Regex = {
8080
val g = Regex.quote(dependency.groupId.value)
8181
val a = Regex.quote(dependency.artifactId.name)
82-
raw"""<groupId>$g</groupId>\s*<artifactId>$a</artifactId>\s*<version>(.*)</version>""".r
82+
raw"""<groupId>$g</groupId>\s*<artifactId>$a(|_[^<]+)</artifactId>\s*<version>(.*)</version>""".r
8383
}
8484
}

0 commit comments

Comments
 (0)