[2.x] feat: repositories_force support (#8761)

The launcher (1.6.0+) sets override from repository-override and passes it
via isOverrideRepositories(). No need to duplicate the file check in sbt.
This commit is contained in:
bitloi 2026-02-20 01:52:59 -05:00 committed by GitHub
parent b634e1b507
commit c045c72d6d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 39 additions and 20 deletions

View File

@ -115,7 +115,7 @@ jobs:
run: |
rm -rf "$HOME/.sbt/scripted/" || true
rm -rf "$HOME/.ivy2/local" || true
rm -r $(find $HOME/.sbt/boot -name "*-SNAPSHOT") || true
find "$HOME/.sbt/boot" -name "*-SNAPSHOT" -exec rm -rf {} + 2>/dev/null || true
- name: Publish local Zinc
if: ${{ matrix.jobtype == 6 }}
shell: bash
@ -160,7 +160,7 @@ jobs:
if: ${{ matrix.jobtype == 4 }}
shell: bash
run: |
# ./sbt -v "repoOverrideTest:scripted dependency-management/*"
./sbt -v "repoOverrideTest:scripted force-proxy-repos-file/*"
./sbt -v "scripted source-dependencies/*"
- name: Build and test (5)
if: ${{ matrix.jobtype == 5 }}
@ -178,7 +178,7 @@ jobs:
# sbt -v -Dsbt.build.version=${BUILD_VERSION} +publishLocal
# cd ../
# sbt -Dsbtzinc.path=$HOME/work/sbt/sbt/zinc -Dsbt.build.version=$BUILD_VERSION -Dsbt.build.fatal=false "+lowerUtils/publishLocal; {zinc}/publishLocal; upperModules/publishLocal"
# rm -r $(find $HOME/.sbt/boot -name "*-SNAPSHOT") || true
# find "$HOME/.sbt/boot" -name "*-SNAPSHOT" -exec rm -rf {} + 2>/dev/null || true
# sbt -v -Dsbt.version=$BUILD_VERSION "++$SCALA_213; all $UTIL_TESTS; ++$SCALA_212; all $UTIL_TESTS; scripted actions/* source-dependencies/*1of3 dependency-management/*1of4 java/*"
- name: Scripted (tests)
if: ${{ matrix.jobtype == 7 }}

View File

@ -51,7 +51,7 @@ jobs:
cd ../
sbt -Dsbtzinc.path=$HOME/work/sbt/sbt/zinc -Dsbt.build.fatal=false "+lowerUtils/publish; {zinc}/publish; upperModules/publish; bundledLauncherProj/publish"
rm -rf "$HOME/.ivy2/local" || true
rm -r $(find $HOME/.sbt/boot -name "*-SNAPSHOT") || true
find "$HOME/.sbt/boot" -name "*-SNAPSHOT" -exec rm -rf {} + 2>/dev/null || true
find $HOME/Library/Caches/Coursier/v1 -name "ivydata-*.properties" -delete || true
find $HOME/.ivy2/cache -name "ivydata-*.properties" -delete || true
find $HOME/.cache/coursier/v1 -name "ivydata-*.properties" -delete || true

View File

@ -1044,9 +1044,7 @@ def otherRootSettings =
scriptedLaunchOpts := List(
"-Xmx1500M",
"-Xms512M",
"-server",
"-Dsbt.override.build.repos=true",
s"""-Dsbt.repository.config=${scriptedSource.value / "repo.config"}"""
"-server"
) :::
(sys.props.get("sbt.ivy.home") match {
case Some(home) => List(s"-Dsbt.ivy.home=$home")

View File

@ -25,5 +25,5 @@
[ivy]
ivy-home: ${sbt.ivy.home-${user.home}/.ivy2/}
checksums: ${sbt.checksums-sha1,md5}
override-build-repos: ${sbt.override.build.repos-false}
repository-override: ${sbt.repository.override-${sbt.global.base-${user.home}/.sbt}/repositories_force}
repository-config: ${sbt.repository.config-${sbt.global.base-${user.home}/.sbt}/repositories}

View File

@ -3048,7 +3048,7 @@ object Classpaths {
scmInfo.value,
developers.value.toVector
),
overrideBuildResolvers := appConfiguration(isOverrideRepositories).value,
overrideBuildResolvers := appConfiguration(Classpaths.shouldOverrideBuildResolvers).value,
externalResolvers := Def.uncached(
(
externalResolvers.?.value,
@ -4509,6 +4509,9 @@ object Classpaths {
try app.provider.scalaProvider.launcher.isOverrideRepositories
catch { case _: NoSuchMethodError => false }
def shouldOverrideBuildResolvers(app: xsbti.AppConfiguration): Boolean =
isOverrideRepositories(app) || SysProp.getOrFalse("sbt.override.build.repos")
/** Loads the `appRepositories` configured for this launcher, if supported. */
def appRepositories(app: xsbti.AppConfiguration): Option[Vector[Resolver]] =
try {

View File

@ -17,7 +17,7 @@ object Dependencies {
private val sbtIO = "org.scala-sbt" %% "io" % ioVersion
val launcherVersion = "1.5.2"
val launcherVersion = "1.6.0"
val launcherInterface = "org.scala-sbt" % "launcher-interface" % launcherVersion
val rawLauncher = "org.scala-sbt" % "launcher" % launcherVersion
val testInterface = "org.scala-sbt" % "test-interface" % "1.0"

View File

@ -1,9 +0,0 @@
lazy val check = taskKey[Unit]("")
lazy val root = (project in file(".")).settings(
autoScalaLibrary := false,
check := {
val ar = appResolvers.value.get
assert(!(ar exists { _.name == "public" }))
}
)

View File

@ -0,0 +1,8 @@
lazy val check = taskKey[Unit]("Verifies overrideBuildResolvers is true when repositories_force exists")
lazy val root = (project in file(".")).settings(
check := {
val overrideOn = overrideBuildResolvers.value
assert(overrideOn, "overrideBuildResolvers should be true when global/repositories_force exists")
}
)

View File

@ -0,0 +1,3 @@
[repositories]
local
maven-central

View File

@ -0,0 +1,4 @@
# Test for #1870: forcing proxy repos via ~/.sbt/repositories_force.
# repoOverrideTest runs with launcher; -Dsbt.global.base=<testDir>/global.
# Launcher uses repository-override (repositories_force), so override is enabled.
> check

View File

@ -419,6 +419,14 @@ public class ScriptedLauncher {
@Override
public boolean isOverrideRepositories() {
try {
String globalBase = System.getProperty("sbt.global.base");
if (globalBase != null) {
File reposForce = new File(globalBase, "repositories_force");
return reposForce.exists();
}
} catch (SecurityException ignored) {
}
return false;
}

View File

@ -230,6 +230,11 @@ final class ScriptedTests(
groupedTests.map { case ((group, name), originalDir) =>
val label = s"$group/$name"
log.info(s"Running $label")
val targetGlobal = new File(tempTestDir, "global")
val reposForce = new File(targetGlobal, "repositories_force")
if (reposForce.exists()) IO.delete(reposForce)
val repos = new File(targetGlobal, "repositories")
if (repos.exists()) IO.delete(repos)
// Copy test's contents and reload the sbt instance to pick them up
IO.copyDirectory(originalDir, tempTestDir)