Skip to content

Commit

Permalink
NIT Refactor ElementsUtils
Browse files Browse the repository at this point in the history
  - convert functions to extensions
  - other Scala 3 syntax changes
  - formatting fixes
  • Loading branch information
Gedochao committed Nov 15, 2022
1 parent 254a3da commit 5b8f760
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 93 deletions.
3 changes: 2 additions & 1 deletion modules/build/src/main/scala/scala/build/CrossSources.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import scala.build.EitherCps.{either, value}
import scala.build.Ops.*
import scala.build.Positioned
import scala.build.errors.{BuildException, CompositeBuildException, MalformedDirectiveError}
import scala.build.input.ElementsUtils.*
import scala.build.input.*
import scala.build.options.{
BuildOptions,
Expand Down Expand Up @@ -236,7 +237,7 @@ object CrossSources {
lazy val dir = sourcePath / os.up
lazy val subPath = sourcePath.subRelativeTo(dir)
if (os.isDir(sourcePath))
Right(InputsUtil.singleFilesFromDirectory(Directory(sourcePath), enableMarkdown))
Right(Directory(sourcePath).singleFilesFromDirectory(enableMarkdown))
else if (sourcePath == os.sub / "project.scala")
Right(Seq(ProjectScalaFile(dir, subPath)))
else if (sourcePath.ext == "scala") Right(Seq(SourceScalaFile(dir, subPath)))
Expand Down
80 changes: 80 additions & 0 deletions modules/build/src/main/scala/scala/build/input/ElementsUtils.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package scala.build.input

import java.math.BigInteger
import java.nio.charset.StandardCharsets
import java.security.MessageDigest

import scala.build.Directories

object ElementsUtils {
extension (d: Directory) {
def singleFilesFromDirectory(enableMarkdown: Boolean): Seq[SingleFile] = {
import Ordering.Implicits.seqOrdering
os.walk.stream(d.path, skip = _.last.startsWith("."))
.filter(os.isFile(_))
.collect {
case p if p.last.endsWith(".java") =>
JavaFile(d.path, p.subRelativeTo(d.path))
case p if p.last == "project.scala" =>
ProjectScalaFile(d.path, p.subRelativeTo(d.path))
case p if p.last.endsWith(".scala") =>
SourceScalaFile(d.path, p.subRelativeTo(d.path))
case p if p.last.endsWith(".sc") =>
Script(d.path, p.subRelativeTo(d.path))
case p if p.last.endsWith(".c") || p.last.endsWith(".h") =>
CFile(d.path, p.subRelativeTo(d.path))
case p if p.last.endsWith(".md") && enableMarkdown =>
MarkdownFile(d.path, p.subRelativeTo(d.path))
}
.toVector
.sortBy(_.subPath.segments)
}

def configFile: Seq[ProjectScalaFile] =
if (os.exists(d.path / "project.scala"))
Seq(ProjectScalaFile(d.path, os.sub / "project.scala"))
else Nil
}

extension (elements: Seq[Element]) {
def projectSettingsFiles: Seq[ProjectScalaFile] =
elements.flatMap {
case f: ProjectScalaFile => Seq(f)
case d: Directory => d.configFile
case _ => Nil
}.distinct

def inputsHash: String = {
def bytes(s: String): Array[Byte] = s.getBytes(StandardCharsets.UTF_8)

val it = elements.iterator.flatMap {
case elem: OnDisk =>
val prefix = elem match {
case _: Directory => "dir:"
case _: ResourceDirectory => "resource-dir:"
case _: JavaFile => "java:"
case _: ProjectScalaFile => "config:"
case _: SourceScalaFile => "scala:"
case _: CFile => "c:"
case _: Script => "sc:"
case _: MarkdownFile => "md:"
}
Iterator(prefix, elem.path.toString, "\n").map(bytes)
case v: Virtual =>
Iterator(bytes("virtual:"), v.content, bytes(v.source), bytes("\n"))
}
val md = MessageDigest.getInstance("SHA-1")
it.foreach(md.update)
val digest = md.digest()
val calculatedSum = new BigInteger(1, digest)
String.format(s"%040x", calculatedSum).take(10)
}

def homeWorkspace(directories: Directories): os.Path = {
val hash0 = elements.inputsHash
val dir = directories.virtualProjectsDir / hash0.take(2) / s"project-${hash0.drop(2)}"
os.makeDir.all(dir)
dir
}
}
}
20 changes: 9 additions & 11 deletions modules/build/src/main/scala/scala/build/input/Inputs.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import java.security.MessageDigest
import scala.annotation.tailrec
import scala.build.Directories
import scala.build.errors.{BuildException, InputsException}
import scala.build.input.ElementsUtils.*
import scala.build.internal.Constants
import scala.build.internal.zip.WrappedZipInputStream
import scala.build.options.Scope
Expand All @@ -32,7 +33,7 @@ final case class Inputs(
def singleFiles(): Seq[SingleFile] =
elements.flatMap {
case f: SingleFile => Seq(f)
case d: Directory => InputsUtil.singleFilesFromDirectory(d, enableMarkdown)
case d: Directory => d.singleFilesFromDirectory(enableMarkdown)
case _: ResourceDirectory => Nil
case _: Virtual => Nil
}
Expand All @@ -44,22 +45,19 @@ final case class Inputs(

def virtualSourceFiles(): Seq[Virtual] =
elements.flatMap {
case v: Virtual =>
Seq(v)
case _ =>
Nil
case v: Virtual => Seq(v)
case _ => Nil
}

def flattened(): Seq[SingleElement] =
elements.flatMap {
case f: SingleFile => Seq(f)
case d: Directory => InputsUtil.singleFilesFromDirectory(d, enableMarkdown)
case d: Directory => d.singleFilesFromDirectory(enableMarkdown)
case _: ResourceDirectory => Nil
case v: Virtual => Seq(v)
}

private lazy val inputsHash: String =
InputsUtil.inputsHash(elements)
private lazy val inputsHash: String = elements.inputsHash
lazy val projectName: String = {
val needsSuffix = mayAppendHash && (elements match {
case Seq(d: Directory) => d.path != workspace
Expand All @@ -82,7 +80,7 @@ final case class Inputs(

private def inHomeDir(directories: Directories): Inputs =
copy(
workspace = InputsUtil.homeWorkspace(elements, directories),
workspace = elements.homeWorkspace(directories),
mayAppendHash = false,
workspaceOrigin = Some(WorkspaceOrigin.HomeDir)
)
Expand Down Expand Up @@ -111,7 +109,7 @@ final case class Inputs(
case elem: OnDisk =>
val content = elem match {
case dirInput: Directory =>
Seq("dir:") ++ InputsUtil.singleFilesFromDirectory(dirInput, enableMarkdown)
Seq("dir:") ++ dirInput.singleFilesFromDirectory(enableMarkdown)
.map(file => s"${file.path}:" + os.read(file.path))
case _ => Seq(os.read(elem.path))
}
Expand Down Expand Up @@ -148,7 +146,7 @@ object Inputs {
assert(extraClasspathWasPassed || validElems.nonEmpty)

val (inferredWorkspace, inferredNeedsHash, workspaceOrigin) = {
val settingsFiles = InputsUtil.projectSettingsFiles(validElems)
val settingsFiles = validElems.projectSettingsFiles
val dirsAndFiles = validElems.collect {
case d: Directory => d
case f: SourceFile => f
Expand Down
79 changes: 0 additions & 79 deletions modules/build/src/main/scala/scala/build/input/InputsUtil.scala

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ package scala.build.tests
import com.eed3si9n.expecty.Expecty.expect

import scala.build.Build
import scala.build.input.{Inputs, InputsUtil}
import scala.build.input.Inputs
import scala.build.input.ElementsUtils.*
import scala.build.options.{BuildOptions, InternalOptions, MaybeScalaVersion}
import scala.build.tests.util.BloopServer
import scala.build.{BuildThreads, Directories, LocalRepo}
Expand Down Expand Up @@ -101,7 +102,7 @@ class InputsTests extends munit.FunSuite {
testInputs.withBuild(buildOptions, buildThreads, bloopConfigOpt) {
(root, inputs, _) =>
assert(os.exists(root / Constants.workspaceDirName))
assert(InputsUtil.projectSettingsFiles(inputs.elements).length == 1)
assert(inputs.elements.projectSettingsFiles.length == 1)
}
}
}

0 comments on commit 5b8f760

Please sign in to comment.