Skip to content

Commit

Permalink
GitOps: change to operate on multiple dirs
Browse files Browse the repository at this point in the history
  • Loading branch information
kitbellew committed Nov 27, 2021
1 parent 323f3a3 commit 216e339
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,18 @@ object GitOps {
files: Seq[AbsoluteFile],
respectProjectFilters: Boolean,
matches: AbsoluteFile => Boolean
)(listDir: AbsoluteFile => Seq[AbsoluteFile]): Seq[AbsoluteFile] =
files.flatMap {
case d if d.isDirectory => listDir(d).filter(matches)
)(listDir: Seq[AbsoluteFile] => Seq[AbsoluteFile]): Seq[AbsoluteFile] = {
val matchingFiles = Seq.newBuilder[AbsoluteFile]
val dirs = Seq.newBuilder[AbsoluteFile]
files.foreach { x =>
if (x.isDirectory) dirs += x
// DESNOTE(2017-05-19, pjrt): A plain, fully passed file will (try to) be
// formatted regardless of what it is or where it is.
// NB: Unless respectProjectFilters is also specified.
case f if respectProjectFilters && !matches(f) => Seq.empty
case f => Seq(f)
else if (!respectProjectFilters || matches(x)) matchingFiles += x
}
matchingFiles.result() ++ listDir(dirs.result()).filter(matches)
}

implicit class Implicit(obj: GitOps) {

Expand All @@ -54,21 +57,23 @@ object GitOps {
respectProjectFilters: Boolean,
matches: AbsoluteFile => Boolean
): Seq[AbsoluteFile] =
getMatchingFiles(files, respectProjectFilters, matches)(_.listFiles)
getMatchingFiles(files, respectProjectFilters, matches)(
_.flatMap(_.listFiles)
)

def getDiffFiles(
branch: String,
matches: AbsoluteFile => Boolean
): Seq[AbsoluteFile] =
obj.diff(branch, None).filter(matches)
obj.diff(branch).filter(matches)

def getDiffFiles(
branch: String,
respectProjectFilters: Boolean,
matches: AbsoluteFile => Boolean
)(files: Seq[AbsoluteFile]): Seq[AbsoluteFile] =
getMatchingFiles(files, respectProjectFilters, matches)(x =>
obj.diff(branch, Some(x))
obj.diff(branch, x: _*)
)

def getDiffFiles(
Expand All @@ -82,17 +87,17 @@ object GitOps {
)

def getChangedFiles(matches: AbsoluteFile => Boolean): Seq[AbsoluteFile] =
obj.status.filter(matches)
obj.status().filter(matches)

}

}

trait GitOps {
val workingDirectory: AbsoluteFile
def status: Seq[AbsoluteFile]
def diff(branch: String, cwd: Option[AbsoluteFile]): Seq[AbsoluteFile]
def lsTree(dir: AbsoluteFile): Seq[AbsoluteFile]
def status(dir: AbsoluteFile*): Seq[AbsoluteFile]
def diff(branch: String, dir: AbsoluteFile*): Seq[AbsoluteFile]
def lsTree(dir: AbsoluteFile*): Seq[AbsoluteFile]
def rootDir: Option[AbsoluteFile]
}

Expand All @@ -113,8 +118,8 @@ private class GitOpsImpl(val workingDirectory: AbsoluteFile) extends GitOps {
)
}

override def lsTree(dir: AbsoluteFile): Seq[AbsoluteFile] = {
val cmd = Seq("git", "ls-files", "--full-name", dir.toString())
override def lsTree(dir: AbsoluteFile*): Seq[AbsoluteFile] = {
val cmd = Seq("git", "ls-files", "--full-name") ++ dir.map(_.toString())
rootDir.fold(Seq.empty[AbsoluteFile]) { rtDir =>
exec(cmd)
.map(_.map(rtDir.join).filter(_.isRegularFile))
Expand All @@ -131,20 +136,18 @@ private class GitOpsImpl(val workingDirectory: AbsoluteFile) extends GitOps {
} yield file
}

override def diff(
branch: String,
cwd: Option[AbsoluteFile]
): Seq[AbsoluteFile] = {
override def diff(branch: String, dir: AbsoluteFile*): Seq[AbsoluteFile] = {
val cmd = Seq("git", "diff", "--name-only", "--diff-filter=d", branch) ++
cwd.map(x => Seq("--", x.toString())).getOrElse(Seq.empty)
(if (dir.isEmpty) Seq.empty else "--" +: dir.map(_.toString()))
for {
root <- rootDir.toSeq
path <- exec(cmd).getOrElse(Seq.empty)
} yield root.join(path)
}

override def status: Seq[AbsoluteFile] = {
val cmd = Seq("git", "status", "--porcelain")
override def status(dir: AbsoluteFile*): Seq[AbsoluteFile] = {
val cmd = Seq("git", "status", "--porcelain") ++
(if (dir.isEmpty) Seq.empty else "--" +: dir.map(_.toString()))
for {
root <- rootDir.toSeq
statusLine <- exec(cmd).getOrElse(Seq.empty)
Expand Down
12 changes: 5 additions & 7 deletions scalafmt-tests/src/test/scala/org/scalafmt/cli/FakeGitOps.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@ import org.scalafmt.sysops.{AbsoluteFile, GitOps}

class FakeGitOps(root: AbsoluteFile) extends GitOps {
override val workingDirectory: AbsoluteFile = root
override def lsTree(dir: AbsoluteFile): Seq[AbsoluteFile] = dir.listFiles
override def lsTree(dir: AbsoluteFile*): Seq[AbsoluteFile] =
dir.flatMap(_.listFiles)
override def rootDir: Option[AbsoluteFile] = Some(root)
override def status: Seq[AbsoluteFile] = lsTree(root)
override def diff(
branch: String,
cwd: Option[AbsoluteFile]
): Seq[AbsoluteFile] =
lsTree(cwd.getOrElse(root))
override def status(dir: AbsoluteFile*): Seq[AbsoluteFile] = lsTree(root)
override def diff(branch: String, dir: AbsoluteFile*): Seq[AbsoluteFile] =
lsTree(dir: _*)
}
53 changes: 50 additions & 3 deletions scalafmt-tests/src/test/scala/org/scalafmt/sysops/GitOpsTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -162,13 +162,13 @@ class GitOpsTest extends FunSuite {
def diff(br: String, cwd: AbsoluteFile*)(implicit
ops: GitOpsImpl
): Seq[AbsoluteFile] =
ops.diff(br, cwd.headOption)
ops.diff(br, cwd: _*)

def diff(cwd: AbsoluteFile*)(implicit ops: GitOpsImpl): Seq[AbsoluteFile] =
diff("HEAD", cwd: _*)

def status()(implicit ops: GitOpsImpl): Seq[AbsoluteFile] =
ops.status
def status(cwd: AbsoluteFile*)(implicit ops: GitOpsImpl): Seq[AbsoluteFile] =
ops.status(cwd: _*)

// diff
test("diff should return modified committed files") {
Expand All @@ -179,6 +179,22 @@ class GitOpsTest extends FunSuite {
assert(diff().toSet == Set(f))
}

test("diff should return modified files from specific subdirs") {
val d1 = mkDir()
val d2 = mkDir()
val d3 = mkDir()

val f0 = touch()
val f1 = touch(dir = d1)
val f2 = touch(dir = d2)
val f3 = touch(dir = d3)

add(f0, f1, f2, f3)
assertEquals(diff(d1, d2).toSet, Set(f1, f2))
assertEquals(diff().toSet, Set(f0, f1, f2, f3))
assertEquals(diff(path).toSet, Set(f0, f1, f2, f3))
}

test("#1000: diff should not return git deleted files") {
val f = touch()
add(f)
Expand Down Expand Up @@ -259,6 +275,22 @@ class GitOpsTest extends FunSuite {
assert(status().toSet == Set(f1))
}

test("status should return modified files from specific subdirs") {
val d1 = mkDir()
val d2 = mkDir()
val d3 = mkDir()

val f0 = touch()
val f1 = touch(dir = d1)
val f2 = touch(dir = d2)
val f3 = touch(dir = d3)

add(f0, f1, f2, f3)
assertEquals(status(d1, d2).toSet, Set(f1, f2))
assertEquals(status().toSet, Set(f0, f1, f2, f3))
assertEquals(status(path).toSet, Set(f0, f1, f2, f3))
}

test("status should return moved") {
val f = touch()
add(f)
Expand Down Expand Up @@ -287,6 +319,21 @@ class GitOpsTest extends FunSuite {
assert(status().toSet == Set(f))
}

test("lsTree should return files from specific subdirs") {
val d1 = mkDir()
val d2 = mkDir()
val d3 = mkDir()

val f1 = touch(dir = d1)
val f2 = touch(dir = d2)
val f3 = touch(dir = d3)

add(f1, f2, f3)
assertEquals(ops.lsTree(d1, d2).toSet, Set(f1, f2))
assertEquals(ops.lsTree().toSet, Set(initFile, f1, f2, f3))
assertEquals(ops.lsTree(path).toSet, Set(initFile, f1, f2, f3))
}

}

private object GitOpsTest {
Expand Down

0 comments on commit 216e339

Please sign in to comment.