From 868196e6522f4fa67f038ab0d99fb18e661c4ac7 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Mon, 5 Mar 2012 13:40:17 -0500 Subject: [PATCH] delete empty parent directories of deleted class files. fixes #387 --- compile/inc/Incremental.scala | 2 +- .../empty-package/changes/Define1.scala | 3 +++ .../empty-package/changes/Define2.scala | 3 +++ .../empty-package/changes/Use.scala | 7 +++++++ .../source-dependencies/empty-package/test | 6 ++++++ util/io/IO.scala | 19 +++++++++++++++++++ 6 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 sbt/src/sbt-test/source-dependencies/empty-package/changes/Define1.scala create mode 100644 sbt/src/sbt-test/source-dependencies/empty-package/changes/Define2.scala create mode 100644 sbt/src/sbt-test/source-dependencies/empty-package/changes/Use.scala create mode 100644 sbt/src/sbt-test/source-dependencies/empty-package/test diff --git a/compile/inc/Incremental.scala b/compile/inc/Incremental.scala index 4c35b6b6a..60fe84d69 100644 --- a/compile/inc/Incremental.scala +++ b/compile/inc/Incremental.scala @@ -143,7 +143,7 @@ object Incremental def prune(invalidatedSrcs: Set[File], previous: Analysis): Analysis = { - IO.delete( invalidatedSrcs.flatMap(previous.relations.products) ) + IO.deleteFilesEmptyDirs( invalidatedSrcs.flatMap(previous.relations.products) ) previous -- invalidatedSrcs } diff --git a/sbt/src/sbt-test/source-dependencies/empty-package/changes/Define1.scala b/sbt/src/sbt-test/source-dependencies/empty-package/changes/Define1.scala new file mode 100644 index 000000000..9317a8425 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/empty-package/changes/Define1.scala @@ -0,0 +1,3 @@ +package a.pkgName + +object Test diff --git a/sbt/src/sbt-test/source-dependencies/empty-package/changes/Define2.scala b/sbt/src/sbt-test/source-dependencies/empty-package/changes/Define2.scala new file mode 100644 index 000000000..ed2d7ae8a --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/empty-package/changes/Define2.scala @@ -0,0 +1,3 @@ +package pkgName + +object Test diff --git a/sbt/src/sbt-test/source-dependencies/empty-package/changes/Use.scala b/sbt/src/sbt-test/source-dependencies/empty-package/changes/Use.scala new file mode 100644 index 000000000..b4d87c711 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/empty-package/changes/Use.scala @@ -0,0 +1,7 @@ +package a + +import pkgName.Test + +object Use { + val x = Test +} diff --git a/sbt/src/sbt-test/source-dependencies/empty-package/test b/sbt/src/sbt-test/source-dependencies/empty-package/test new file mode 100644 index 000000000..1577ef521 --- /dev/null +++ b/sbt/src/sbt-test/source-dependencies/empty-package/test @@ -0,0 +1,6 @@ +$ copy-file changes/Define1.scala Define.scala +$ copy-file changes/Use.scala Use.scala +> compile + +$ copy-file changes/Define2.scala Define.scala +> compile diff --git a/util/io/IO.scala b/util/io/IO.scala index eb478333b..1484b7ed2 100644 --- a/util/io/IO.scala +++ b/util/io/IO.scala @@ -304,6 +304,25 @@ object IO /** Deletes each file or directory (recursively) in `files`.*/ def delete(files: Iterable[File]): Unit = files.foreach(delete) + /** Deletes each file or directory in `files` recursively. Any empty parent directories are deleted, recursively.*/ + def deleteFilesEmptyDirs(files: Iterable[File]): Unit = + { + def isEmptyDirectory(dir: File) = dir.isDirectory && listFiles(dir).isEmpty + def parents(fs: Set[File]) = fs.map(_.getParentFile) + def deleteEmpty(dirs: Set[File]) + { + val empty = dirs filter isEmptyDirectory + if(empty.nonEmpty) // looks funny, but this is true if at least one of `dirs` is an empty directory + { + empty foreach { _.delete() } + deleteEmpty(parents(empty)) + } + } + + delete(files) + deleteEmpty(parents(files.toSet)) + } + /** Deletes `file`, recursively if it is a directory. */ def delete(file: File) {