From 8daa6d32793da35d5d6244e3cdc5773876248d65 Mon Sep 17 00:00:00 2001 From: Eugene Vigdorchik Date: Tue, 31 Jan 2012 19:12:52 +0400 Subject: [PATCH 1/3] Keep project selection upon reload. --- main/Load.scala | 11 ++++++++--- main/Main.scala | 4 ++-- .../sbt-test/actions/reload/project/TestProject.scala | 11 +++++++++++ sbt/src/sbt-test/actions/reload/test | 5 +++++ 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100755 sbt/src/sbt-test/actions/reload/project/TestProject.scala create mode 100755 sbt/src/sbt-test/actions/reload/test diff --git a/main/Load.scala b/main/Load.scala index bc6bbc39f..7f7bc5f69 100644 --- a/main/Load.scala +++ b/main/Load.scala @@ -533,13 +533,18 @@ object Load } } + def initialSession(structure: BuildStructure, rootEval: () => Eval, s: State): SessionSettings = { + val current = s get Keys.sessionSettings map (_.currentProject) + new SessionSettings(structure.root, projectMap(structure.units, current), structure.settings, Map.empty, Nil, rootEval) + } + def initialSession(structure: BuildStructure, rootEval: () => Eval): SessionSettings = - new SessionSettings(structure.root, rootProjectMap(structure.units), structure.settings, Map.empty, Nil, rootEval) + new SessionSettings(structure.root, projectMap(structure.units, None), structure.settings, Map.empty, Nil, rootEval) - def rootProjectMap(units: Map[URI, LoadedBuildUnit]): Map[URI, String] = + def projectMap(units: Map[URI, LoadedBuildUnit], current: Option[Map[URI, String]]): Map[URI, String] = { val getRoot = getRootProject(units) - units.keys.map(uri => (uri, getRoot(uri))).toMap + units.keys.map(uri => (uri, current.flatMap(_ get uri) getOrElse getRoot(uri))).toMap } def defaultEvalOptions: Seq[String] = Nil diff --git a/main/Main.scala b/main/Main.scala index 70d67ce5a..475e5db7c 100644 --- a/main/Main.scala +++ b/main/Main.scala @@ -335,8 +335,8 @@ object BuiltinCommands val (s, base) = Project.loadAction(SessionVar.clear(s0), action) IO.createDirectory(base) val (eval, structure) = Load.defaultLoad(s, base, logger(s)) - val session = Load.initialSession(structure, eval) + val session = Load.initialSession(structure, eval, s0) SessionSettings.checkSession(session, s) Project.setProject(session, structure, s) } -} \ No newline at end of file +} diff --git a/sbt/src/sbt-test/actions/reload/project/TestProject.scala b/sbt/src/sbt-test/actions/reload/project/TestProject.scala new file mode 100755 index 000000000..a3e374fdd --- /dev/null +++ b/sbt/src/sbt-test/actions/reload/project/TestProject.scala @@ -0,0 +1,11 @@ +import sbt._ + +object TestBuild extends Build +{ + lazy val root = Project("root", file("."), aggregate = Seq(sub)) settings( + TaskKey[Unit]("f") := error("f") + ) + lazy val sub = Project("sub", file("sub")) settings( + TaskKey[Unit]("f") := {} + ) +} diff --git a/sbt/src/sbt-test/actions/reload/test b/sbt/src/sbt-test/actions/reload/test new file mode 100755 index 000000000..ff2855d59 --- /dev/null +++ b/sbt/src/sbt-test/actions/reload/test @@ -0,0 +1,5 @@ +-> f +> project sub +> f +> reload +> f \ No newline at end of file From 0dafd5ef26e9ea5ce50d0436a5169ae6da64edb3 Mon Sep 17 00:00:00 2001 From: Eugene Vigdorchik Date: Tue, 31 Jan 2012 21:15:18 +0400 Subject: [PATCH 2/3] Check for the case the project doesn't exist after reload. --- main/Load.scala | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) mode change 100644 => 100755 main/Load.scala diff --git a/main/Load.scala b/main/Load.scala old mode 100644 new mode 100755 index 7f7bc5f69..7c5c92b94 --- a/main/Load.scala +++ b/main/Load.scala @@ -534,17 +534,23 @@ object Load } def initialSession(structure: BuildStructure, rootEval: () => Eval, s: State): SessionSettings = { - val current = s get Keys.sessionSettings map (_.currentProject) - new SessionSettings(structure.root, projectMap(structure.units, current), structure.settings, Map.empty, Nil, rootEval) + val current = s get Keys.sessionSettings map (_.currentProject) getOrElse Map.empty + new SessionSettings(structure.root, projectMap(structure, current), structure.settings, Map.empty, Nil, rootEval) } def initialSession(structure: BuildStructure, rootEval: () => Eval): SessionSettings = - new SessionSettings(structure.root, projectMap(structure.units, None), structure.settings, Map.empty, Nil, rootEval) + new SessionSettings(structure.root, projectMap(structure, Map.empty), structure.settings, Map.empty, Nil, rootEval) - def projectMap(units: Map[URI, LoadedBuildUnit], current: Option[Map[URI, String]]): Map[URI, String] = + def projectMap(structure: BuildStructure, current: Map[URI, String]): Map[URI, String] = { + val units = structure.units val getRoot = getRootProject(units) - units.keys.map(uri => (uri, current.flatMap(_ get uri) getOrElse getRoot(uri))).toMap + def project(uri: URI) = { + current get uri map { + p => if (structure allProjects uri map (_.id) contains p) p else getRoot(uri) + } getOrElse getRoot(uri) + } + units.keys.map(uri => (uri, project(uri))).toMap } def defaultEvalOptions: Seq[String] = Nil From 33ec1c419dcce50aabc27403a61e7b2007176bbc Mon Sep 17 00:00:00 2001 From: Eugene Vigdorchik Date: Thu, 2 Feb 2012 17:15:14 +0400 Subject: [PATCH 3/3] Remember current URI + more tests. Review by @harrah --- main/Load.scala | 10 ++++++---- sbt/src/sbt-test/actions/reload/changes/Build1.scala | 8 ++++++++ sbt/src/sbt-test/actions/reload/changes/Build2.scala | 6 ++++++ sbt/src/sbt-test/actions/reload/test | 10 +++++++++- 4 files changed, 29 insertions(+), 5 deletions(-) create mode 100755 sbt/src/sbt-test/actions/reload/changes/Build1.scala create mode 100755 sbt/src/sbt-test/actions/reload/changes/Build2.scala diff --git a/main/Load.scala b/main/Load.scala index 7c5c92b94..164690eeb 100755 --- a/main/Load.scala +++ b/main/Load.scala @@ -534,8 +534,10 @@ object Load } def initialSession(structure: BuildStructure, rootEval: () => Eval, s: State): SessionSettings = { - val current = s get Keys.sessionSettings map (_.currentProject) getOrElse Map.empty - new SessionSettings(structure.root, projectMap(structure, current), structure.settings, Map.empty, Nil, rootEval) + val session = s get Keys.sessionSettings + val currentProject = session map (_.currentProject) getOrElse Map.empty + val currentBuild = session map (_.currentBuild) filter (uri => structure.units.keys exists (uri ==)) getOrElse structure.root + new SessionSettings(currentBuild, projectMap(structure, currentProject), structure.settings, Map.empty, Nil, rootEval) } def initialSession(structure: BuildStructure, rootEval: () => Eval): SessionSettings = @@ -546,8 +548,8 @@ object Load val units = structure.units val getRoot = getRootProject(units) def project(uri: URI) = { - current get uri map { - p => if (structure allProjects uri map (_.id) contains p) p else getRoot(uri) + current get uri filter { + p => structure allProjects uri map (_.id) contains p } getOrElse getRoot(uri) } units.keys.map(uri => (uri, project(uri))).toMap diff --git a/sbt/src/sbt-test/actions/reload/changes/Build1.scala b/sbt/src/sbt-test/actions/reload/changes/Build1.scala new file mode 100755 index 000000000..3c64e0b09 --- /dev/null +++ b/sbt/src/sbt-test/actions/reload/changes/Build1.scala @@ -0,0 +1,8 @@ +import sbt._ + +object Build1 extends Build +{ + lazy val root1 = Project("root1", file("root1")) settings( + TaskKey[Unit]("g") := {} + ) +} diff --git a/sbt/src/sbt-test/actions/reload/changes/Build2.scala b/sbt/src/sbt-test/actions/reload/changes/Build2.scala new file mode 100755 index 000000000..ed474650c --- /dev/null +++ b/sbt/src/sbt-test/actions/reload/changes/Build2.scala @@ -0,0 +1,6 @@ +import sbt._ + +object Build2 extends Build +{ + lazy val root2 = Project("root2", file("root2")) +} diff --git a/sbt/src/sbt-test/actions/reload/test b/sbt/src/sbt-test/actions/reload/test index ff2855d59..2b3c2008a 100755 --- a/sbt/src/sbt-test/actions/reload/test +++ b/sbt/src/sbt-test/actions/reload/test @@ -2,4 +2,12 @@ > project sub > f > reload -> f \ No newline at end of file +> f +$ copy-file changes/Build1.scala project/TestProject.scala +> reload +-> f +> g +# The current URI should be kept +$ copy-file changes/Build2.scala project/First.scala +> reload +> g \ No newline at end of file