Skip to content

Commit 851ff7e

Browse files
Merge pull request #573 from alexarchambault/dot-scala-rights
More strict workspace dir rights checks, rename it from .scala to .scala-build
2 parents b0cd726 + 4ad1182 commit 851ff7e

File tree

15 files changed

+55
-31
lines changed

15 files changed

+55
-31
lines changed

build.sc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import $file.project.settings, settings.{
1313
ScalaCliCrossSbtModule,
1414
ScalaCliScalafixModule,
1515
localRepoResourcePath,
16-
platformExecutableJarExtension
16+
platformExecutableJarExtension,
17+
workspaceDirName
1718
}
1819
import $file.project.deps, deps.customRepositories
1920

@@ -265,6 +266,8 @@ class Build(val crossScalaVersion: String)
265266
| def defaultScalaVersion = "${Scala.defaultUser}"
266267
| def defaultScala212Version = "${Scala.scala212}"
267268
| def defaultScala213Version = "${Scala.scala213}"
269+
|
270+
| def workspaceDirName = "$workspaceDirName"
268271
|}
269272
|""".stripMargin
270273
if (!os.isFile(dest) || os.read(dest) != code)
@@ -433,6 +436,7 @@ trait CliIntegrationBase extends SbtModule with ScalaCliPublishModule with HasTe
433436
| def dockerAlpineTestImage = "${Docker.alpineTestImage}"
434437
| def mostlyStaticDockerfile = "${mostlyStaticDockerfile.toString.replace("\\", "\\\\")}"
435438
| def cs = "${settings.cs().replace("\\", "\\\\")}"
439+
| def workspaceDirName = "$workspaceDirName"
436440
|}
437441
|""".stripMargin
438442
if (!os.isFile(dest) || os.read(dest) != code)
@@ -443,10 +447,10 @@ trait CliIntegrationBase extends SbtModule with ScalaCliPublishModule with HasTe
443447

444448
def test(args: String*) = T.command {
445449
val res = super.test(args: _*)()
446-
val dotScalaInRoot = os.pwd / ".scala"
450+
val dotScalaInRoot = os.pwd / workspaceDirName
447451
assert(
448452
!os.isDir(dotScalaInRoot),
449-
s"Expected .scala ($dotScalaInRoot) not to have been created"
453+
s"Expected $workspaceDirName ($dotScalaInRoot) not to have been created"
450454
)
451455
res
452456
}

modules/bloop-rifle/src/main/scala/scala/build/bloop/BloopServer.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,10 @@ object BloopServer {
153153
val bloopInfo = ensureBloopRunning(config, threads.startServerChecks, logger)
154154

155155
logger.debug("Opening BSP connection with bloop")
156-
Files.createDirectories(workspace.resolve(".scala/.bloop"))
156+
Files.createDirectories(workspace.resolve(".bloop"))
157157
val conn = BloopRifle.bsp(
158158
config,
159-
workspace.resolve(".scala"),
159+
workspace,
160160
logger
161161
)
162162
logger.debug(s"Bloop BSP connection waiting at ${conn.address}")
@@ -207,7 +207,7 @@ object BloopServer {
207207
clientName,
208208
clientVersion,
209209
Constants.bspVersion,
210-
workspace.resolve(".scala").toUri.toASCIIString,
210+
workspace.toUri.toASCIIString,
211211
new bsp4j.BuildClientCapabilities(List("scala", "java").asJava)
212212
)
213213
val bloopExtraParams = new BloopExtraBuildParams

modules/build/src/main/scala/scala/build/Build.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ object Build {
272272
resourceFilePath <- os.walk(resourceDirPath).filter(os.isFile(_))
273273
relativeResourcePath = resourceFilePath.relativeTo(resourceDirPath)
274274
// dismiss files generated by scala-cli
275-
if !relativeResourcePath.startsWith(os.rel / ".scala")
275+
if !relativeResourcePath.startsWith(os.rel / Constants.workspaceDirName)
276276
} {
277277
val destPath = b.output / relativeResourcePath
278278
os.copy(
@@ -335,7 +335,7 @@ object Build {
335335
}
336336

337337
def classesRootDir(root: os.Path, projectName: String): os.Path =
338-
root / ".scala" / projectName / "classes"
338+
root / Constants.workspaceDirName / projectName / "classes"
339339
def classesDir(root: os.Path, projectName: String, scope: Scope): os.Path =
340340
classesRootDir(root, projectName) / scope.name
341341

@@ -380,7 +380,7 @@ object Build {
380380
bloopConfig,
381381
"scala-cli",
382382
Constants.version,
383-
inputs.workspace.toNIO,
383+
(inputs.workspace / Constants.workspaceDirName).toNIO,
384384
classesDir0.toNIO,
385385
buildClient,
386386
threads.bloop,
@@ -443,7 +443,7 @@ object Build {
443443
bloopConfig,
444444
"scala-cli",
445445
Constants.version,
446-
inputs.workspace.toNIO,
446+
(inputs.workspace / Constants.workspaceDirName).toNIO,
447447
classesDir0.toNIO,
448448
buildClient,
449449
threads.bloop,
@@ -610,7 +610,7 @@ object Build {
610610
value(validate(logger, options))
611611

612612
val project = Project(
613-
directory = inputs.workspace / ".scala",
613+
directory = inputs.workspace / Constants.workspaceDirName,
614614
workspace = inputs.workspace,
615615
classesDir = classesDir0,
616616
scalaCompiler = scalaCompiler,
@@ -868,7 +868,7 @@ object Build {
868868
bloopServer: bloop.BloopServer
869869
): Either[BuildException, Option[Build]] = either {
870870
val jmhProjectName = inputs.projectName + "_jmh"
871-
val jmhOutputDir = inputs.workspace / ".scala" / jmhProjectName
871+
val jmhOutputDir = inputs.workspace / Constants.workspaceDirName / jmhProjectName
872872
os.remove.all(jmhOutputDir)
873873
val jmhSourceDir = jmhOutputDir / "sources"
874874
val jmhResourceDir = jmhOutputDir / "resources"

modules/build/src/main/scala/scala/build/Inputs.scala

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import java.security.MessageDigest
77
import java.util.zip.{ZipEntry, ZipInputStream}
88

99
import scala.annotation.tailrec
10+
import scala.build.internal.Constants
1011
import scala.build.options.Scope
1112
import scala.build.preprocessing.ScopePath
13+
import scala.util.Properties
1214
import scala.util.matching.Regex
1315

1416
final case class Inputs(
@@ -103,7 +105,7 @@ final case class Inputs(
103105
else copy(elements = elements ++ extraElements)
104106

105107
def generatedSrcRoot(scope: Scope): os.Path =
106-
workspace / ".scala" / projectName / "src_generated" / scope.name
108+
workspace / Constants.workspaceDirName / projectName / "src_generated" / scope.name
107109

108110
private def inHomeDir(directories: Directories): Inputs =
109111
copy(
@@ -118,9 +120,15 @@ final case class Inputs(
118120
if (os.exists(p)) Some(p)
119121
else if (p.segmentCount <= 0) None
120122
else existingParent(p / os.up)
123+
def reallyOwnedByUser(p: os.Path): Boolean =
124+
if (Properties.isWin)
125+
p.toIO.canWrite() // Wondering if there's a better way to do that…
126+
else
127+
os.owner(p) == os.owner(os.home) &&
128+
p.toIO.canWrite()
121129
val canWrite = existingParent(workspace)
122-
.map(_.toIO.canWrite()) // Wondering if there's a better way to do that…
123-
.getOrElse(true)
130+
.map(reallyOwnedByUser)
131+
.getOrElse(false)
124132
if (canWrite) this
125133
else inHomeDir(directories)
126134
}

modules/build/src/main/scala/scala/build/bsp/BspImpl.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ final class BspImpl(
317317
bloopRifleConfig,
318318
"scala-cli",
319319
Constants.version,
320-
inputs.workspace.toNIO,
320+
(inputs.workspace / Constants.workspaceDirName).toNIO,
321321
classesDir.toNIO,
322322
localClient,
323323
threads.buildThreads.bloop,

modules/build/src/main/scala/scala/build/bsp/HasGeneratedSources.scala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package scala.build.bsp
33
import ch.epfl.scala.{bsp4j => b}
44

55
import scala.build.GeneratedSource
6+
import scala.build.internal.Constants
67
import scala.build.options.Scope
78

89
trait HasGeneratedSources {
@@ -59,6 +60,13 @@ object HasGeneratedSources {
5960
var targetUriOpt: Option[String] = None
6061
) {
6162
targetUriOpt =
62-
Some((bloopWorkspace / ".scala").toIO.toURI.toASCIIString.stripSuffix("/") + "/?id=" + name)
63+
Some(
64+
(bloopWorkspace / Constants.workspaceDirName)
65+
.toIO
66+
.toURI
67+
.toASCIIString
68+
.stripSuffix("/") +
69+
"/?id=" + name
70+
)
6371
}
6472
}

modules/build/src/main/scala/scala/build/options/ScalaNativeOptions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ final case class ScalaNativeOptions(
2121
) {
2222

2323
def nativeWorkDir(root: os.Path, projectName: String): os.Path =
24-
root / ".scala" / projectName / "native"
24+
root / Constants.workspaceDirName / projectName / "native"
2525

2626
def finalVersion = version.map(_.trim).filter(_.nonEmpty).getOrElse(Constants.scalaNativeVersion)
2727

modules/cli/src/main/scala/scala/cli/ScalaCli.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import java.io.{ByteArrayOutputStream, PrintStream}
88
import java.nio.charset.StandardCharsets
99
import java.nio.file.InvalidPathException
1010

11+
import scala.build.internal.Constants
1112
import scala.cli.commands._
1213
import scala.cli.internal.Argv0
1314
import scala.cli.launcher.{LauncherCli, LauncherOptions}
@@ -117,7 +118,7 @@ object ScalaCli extends CommandsEntryPoint {
117118
catch {
118119
case e: Throwable if !isCI =>
119120
val workspace = CurrentParams.workspaceOpt.getOrElse(os.pwd)
120-
val dir = workspace / ".scala" / "stacktraces"
121+
val dir = workspace / Constants.workspaceDirName / "stacktraces"
121122
os.makeDir.all(dir)
122123
import java.time.Instant
123124

modules/cli/src/main/scala/scala/cli/commands/Clean.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package scala.cli.commands
22

33
import caseapp._
44

5+
import scala.build.internal.Constants
56
import scala.build.{Inputs, Os}
67
import scala.cli.CurrentParams
78

@@ -21,7 +22,7 @@ object Clean extends ScalaCommand[CleanOptions] {
2122
case Right(i) => i
2223
}
2324
CurrentParams.workspaceOpt = Some(inputs.workspace)
24-
val workDir = inputs.workspace / ".scala"
25+
val workDir = inputs.workspace / Constants.workspaceDirName
2526
val (_, bspEntry) = options.bspFile.bspDetails(inputs.workspace)
2627

2728
val logger = options.logging.logger

modules/cli/src/main/scala/scala/cli/commands/SetupIde.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ object SetupIde extends ScalaCommand[SetupIdeOptions] {
9292
value(downloadDeps(inputs, options.buildOptions, logger))
9393

9494
val (bspName, bspJsonDestination) = options.bspFile.bspDetails(inputs.workspace)
95-
val scalaCliBspJsonDestination = inputs.workspace / ".scala" / "ide-options.json"
95+
val scalaCliBspJsonDestination =
96+
inputs.workspace / Constants.workspaceDirName / "ide-options.json"
9697

9798
// Ensure the path to the CLI is absolute
9899
val absolutePathToScalaCli: String = {

0 commit comments

Comments
 (0)