From ee6b674966cf667207bb85cb0646e305e259377a Mon Sep 17 00:00:00 2001 From: Josh Suereth Date: Tue, 11 Mar 2014 11:44:00 -0400 Subject: [PATCH 1/5] Add introduction to the setting system. --- src/sphinx/Architecture/Core-Principles.rst | 61 +++++++++++++++++- .../Architecture/overview-setting-example.png | Bin 0 -> 29366 bytes 2 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 src/sphinx/Architecture/overview-setting-example.png diff --git a/src/sphinx/Architecture/Core-Principles.rst b/src/sphinx/Architecture/Core-Principles.rst index 2f101c6ee..843828468 100644 --- a/src/sphinx/Architecture/Core-Principles.rst +++ b/src/sphinx/Architecture/Core-Principles.rst @@ -63,8 +63,63 @@ done through the ``Setting[_]`` sequence. Introduction to Settings ======================== -TODO - Discuss ``Setting[_]`` +A Setting represents the means of constructing the value of one particular ``AttributeKey[_]`` in the ``AttributeMap`` of build state. A setting consists of two pieces: -TODO - Transition into ``Task[_]`` +1. The ``AttributeKey[T]`` where the value of the setting should be assigned. +2. An ``Intialize[T]`` object which is able to construct the value for this setting. -TODO - Transition into ``InputTask[_]`` \ No newline at end of file +Sbt's intiialization time is basically just taking a sequence of these ``Setting[_]`` objects and running their initialization objects and then storing the value into the ``AttributeMap``. This means overwriting an exisitng value at a key is as easy as appending a +``Setting[_]`` to the end of the sequence which does so. + +Where it gets interesting is that ``Initialize[T]`` can depend on other ``AttributeKey[_]``s in the build state. Each ``Initialize[_]`` +can pull values from any ``AttributeKey[_]`` in the build state's ``AttributeMap`` to compute its value. Sbt ensures a few things +when it comes to ``Initialize[_]`` dependencies: + +1. There can be no circular dependencies +2. If one ``Initialize[_]`` depends on another ``Initialize[_]`` key, then *all* associated ``Initialize[_]`` blocks for that key must + have run before we load the value. + +The above image shows a bit of what's expLet's look at what gets stored for the setting :: + + normalizedName := normalize(name.value) + + + +.. Note: This image comes from a google drawing: https://docs.google.com/a/typesafe.com/drawings/d/1hvE89XVrQiXdSBsgaQgQGTmcO44EBZPg4_0WxKXU7Pw/edit +.. Feel free to request access to modify as appropriate. + +.. image:: overview-setting-example.png + + +Here, a ``Setting[_]`` is constructed that understands it depends on the value in the ``name`` AttributeKey. Its intiialize block first grabs the value of the ``name`` key, then runs the function normalize on it to compute its value. + +This represents the core mechanism of how to construct sbt's build state. Conceptually, at some point we have a graph of dependencies +and initialization functions which we can use to construct the first build state. Once this is completed, we can then start to process +user requests. + + + +Introduction to Tasks +===================== + +The next layer in sbt is around these user request, or tasks. When a user configures a build, they are defining a set of repeatable +tasks that they can run on their project. Things like ``compile`` or ``test``. These tasks *also* have a dependency graph, where +e.g. the ``test`` task requires that ``compile`` has run before it can successfully execute. + +Sbt's defines a class ``Task[T]``. The ``T`` type parameter represents the type of data returned by a task. Remember the tenenats of +sbt? "All things have types" and "Dependencies are explicit" both hold true for tasks. Sbt promotes a style of task dependencies that +is closer to functional programming: Return data for your users rather than using shared mutable state. + +Most build tools communciate over the filesystem, and indeed sbt, by necessity, does some of this. However, for stable parallelization it is far better to keep tasks isolated on the filesystem and communicate directly through types. + +Similarly to how a ``Setting[_]`` stores both dependencies and an initialization function, a ``Task[_]`` stores both its +``Task[_]``dependencies and its behavior (a function). + + + + +TODO - More on ``Task[_]`` + +TODO - Transition into ``InputTask[_]``, rehash Command + +TODO - Tansition into Scope. \ No newline at end of file diff --git a/src/sphinx/Architecture/overview-setting-example.png b/src/sphinx/Architecture/overview-setting-example.png new file mode 100644 index 0000000000000000000000000000000000000000..f5bbcb2090dae99decd255775bd61f9781214f56 GIT binary patch literal 29366 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 literal 0 HcmV?d00001 From 152e04bc05c92d7a3431202d006ec362d530c8b2 Mon Sep 17 00:00:00 2001 From: Josh Suereth Date: Tue, 11 Mar 2014 12:47:42 -0400 Subject: [PATCH 2/5] Fix spelling issues in architecture document. --- src/sphinx/Architecture/Core-Principles.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/sphinx/Architecture/Core-Principles.rst b/src/sphinx/Architecture/Core-Principles.rst index 843828468..a90a0b73c 100644 --- a/src/sphinx/Architecture/Core-Principles.rst +++ b/src/sphinx/Architecture/Core-Principles.rst @@ -60,15 +60,15 @@ the AttributeMap, we first need to construct one of these keys. Let's look at t Now that there's a definition of what build state is, there needs to be a way to dynamically construct it. In sbt, this is done through the ``Setting[_]`` sequence. -Introduction to Settings -======================== +Settings Architecture +===================== A Setting represents the means of constructing the value of one particular ``AttributeKey[_]`` in the ``AttributeMap`` of build state. A setting consists of two pieces: 1. The ``AttributeKey[T]`` where the value of the setting should be assigned. -2. An ``Intialize[T]`` object which is able to construct the value for this setting. +2. An ``Initialize[T]`` object which is able to construct the value for this setting. -Sbt's intiialization time is basically just taking a sequence of these ``Setting[_]`` objects and running their initialization objects and then storing the value into the ``AttributeMap``. This means overwriting an exisitng value at a key is as easy as appending a +Sbt's initialization time is basically just taking a sequence of these ``Setting[_]`` objects and running their initialization objects and then storing the value into the ``AttributeMap``. This means overwriting an exisitng value at a key is as easy as appending a ``Setting[_]`` to the end of the sequence which does so. Where it gets interesting is that ``Initialize[T]`` can depend on other ``AttributeKey[_]``s in the build state. Each ``Initialize[_]`` @@ -79,7 +79,7 @@ when it comes to ``Initialize[_]`` dependencies: 2. If one ``Initialize[_]`` depends on another ``Initialize[_]`` key, then *all* associated ``Initialize[_]`` blocks for that key must have run before we load the value. -The above image shows a bit of what's expLet's look at what gets stored for the setting :: +Let's look at what gets stored for the setting :: normalizedName := normalize(name.value) @@ -91,7 +91,7 @@ The above image shows a bit of what's expLet's look at what gets stored for the .. image:: overview-setting-example.png -Here, a ``Setting[_]`` is constructed that understands it depends on the value in the ``name`` AttributeKey. Its intiialize block first grabs the value of the ``name`` key, then runs the function normalize on it to compute its value. +Here, a ``Setting[_]`` is constructed that understands it depends on the value in the ``name`` AttributeKey. Its initialize block first grabs the value of the ``name`` key, then runs the function normalize on it to compute its value. This represents the core mechanism of how to construct sbt's build state. Conceptually, at some point we have a graph of dependencies and initialization functions which we can use to construct the first build state. Once this is completed, we can then start to process @@ -99,14 +99,14 @@ user requests. -Introduction to Tasks -===================== +Task Architecture +================= The next layer in sbt is around these user request, or tasks. When a user configures a build, they are defining a set of repeatable tasks that they can run on their project. Things like ``compile`` or ``test``. These tasks *also* have a dependency graph, where e.g. the ``test`` task requires that ``compile`` has run before it can successfully execute. -Sbt's defines a class ``Task[T]``. The ``T`` type parameter represents the type of data returned by a task. Remember the tenenats of +Sbt's defines a class ``Task[T]``. The ``T`` type parameter represents the type of data returned by a task. Remember the tenets of sbt? "All things have types" and "Dependencies are explicit" both hold true for tasks. Sbt promotes a style of task dependencies that is closer to functional programming: Return data for your users rather than using shared mutable state. From fbffdb6551f2c8b900c4ee2e7003b267f9f99c8b Mon Sep 17 00:00:00 2001 From: Josh Suereth Date: Tue, 11 Mar 2014 13:18:35 -0400 Subject: [PATCH 3/5] Add changes documentation for 0.13.1->0.13.2 --- src/sphinx/Community/Changes.rst | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/sphinx/Community/Changes.rst b/src/sphinx/Community/Changes.rst index 94b42d084..f08a8fa2d 100644 --- a/src/sphinx/Community/Changes.rst +++ b/src/sphinx/Community/Changes.rst @@ -2,6 +2,33 @@ Changes ======= +0.13.1 to 0.13.2 +~~~~~~~~~~~~~~~~ +- Improved the control over included settings in ``Addsettings``. Can now control when settings in ``project/*.scala`` files are included. +- Adding new ``AutoPlugin`` feature, and associated ``plugins`` command. +- Adding new name-hashing feature to incremental compiler. Alters how scala dependencies are tracked, reducing number of recompiles necessary. +- Added the ability to launch servers via the sbt-launcher. +- Added ``.previous`` feature on tasks which can load the pervious value. +- Added an ``all`` command which can run more than tasks in parallel. +- Exposed the 'overwrite' flags from ivy. Added warning if overwriting a release version. +- Improve the error message when credentials are not found in Ivy. +- Improve task macros to handle more scala constructs. +- Fix ``last`` and ``export`` tasks to read from the correct stream. +- Fix issue where ivy's ``.+`` dependency ranges were not correctly translated to maven. +- Override security manager to ignore file permissions (performance issue) +- 2.11 compatibility fixes +- Launcher can now handle ivy's ``.+`` revisions. +- SessionSettings now correctly overwrite existing settings. +- Adding a simple Logic system for inclusionary/dependency logic of plugins. +- Improve build hooks for ``LoggerReporter`` and ``TaskProgress``. +- Serialize incremental compiler analysis into text-file format. +- Issue a warning when generating Paths and separate already exists in the path. +- Migrate to Ivy 2.3.0-final. +- Docs: Use bintray as default repository host +- Docs: improved docs on test groups. +- Docs: updated documentation on the Launcher. +- Docs: started architecture document. + 0.13.0 to 0.13.1 ~~~~~~~~~~~~~~~~ From 7c15eb01f388cf87b0d66425c0db45e5f04f6c95 Mon Sep 17 00:00:00 2001 From: Josh Suereth Date: Wed, 12 Mar 2014 08:50:37 -0400 Subject: [PATCH 4/5] When fragmenting Defaults, we mixed back settings in the wrong order. * packageArtifacts is not cleared by defautlSettings * Added a test for this behavior (this one test should ensure the ordering for most settings is correct.) Fixes #1176 --- main/src/main/scala/sbt/Defaults.scala | 2 +- sbt/src/sbt-test/project/default-settings/build.sbt | 8 ++++++++ sbt/src/sbt-test/project/default-settings/test | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 sbt/src/sbt-test/project/default-settings/build.sbt create mode 100644 sbt/src/sbt-test/project/default-settings/test diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index d01745b45..04b73d5ed 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -971,7 +971,7 @@ object Classpaths publishM2 <<= publishTask(publishM2Configuration, deliverLocal) ) @deprecated("0.13.2", "This has been split into jvmIvySettings and ivyPublishSettings.") - val publishSettings: Seq[Setting[_]] = jvmPublishSettings ++ ivyPublishSettings + val publishSettings: Seq[Setting[_]] = ivyPublishSettings ++ jvmPublishSettings private[this] def baseGlobalDefaults = Defaults.globalDefaults(Seq( conflictWarning :== ConflictWarning.default("global"), diff --git a/sbt/src/sbt-test/project/default-settings/build.sbt b/sbt/src/sbt-test/project/default-settings/build.sbt new file mode 100644 index 000000000..a00c6c634 --- /dev/null +++ b/sbt/src/sbt-test/project/default-settings/build.sbt @@ -0,0 +1,8 @@ + +val root = Project("root", file("."), settings=Defaults.defaultSettings) + + +TaskKey[Unit]("checkArtifacts", "test") := { + val arts = packagedArtifacts.value + assert(!arts.isEmpty, "Packaged artifacts must not be empty!") +} \ No newline at end of file diff --git a/sbt/src/sbt-test/project/default-settings/test b/sbt/src/sbt-test/project/default-settings/test new file mode 100644 index 000000000..0f165ede1 --- /dev/null +++ b/sbt/src/sbt-test/project/default-settings/test @@ -0,0 +1 @@ +> checkArtifacts \ No newline at end of file From 9f20f04e1656f9732c32a3e3d95217b70ca4e9cf Mon Sep 17 00:00:00 2001 From: James Roper Date: Tue, 18 Mar 2014 19:44:32 +1100 Subject: [PATCH 5/5] Allow end users to add Plugins, not just AutoPlugins This allows plugins to define a Plugins instance that captures both the plugin and its required dependencies. Also fixed up some scaladocs that were wrong. --- main/src/main/scala/sbt/Plugins.scala | 6 +++--- main/src/main/scala/sbt/Project.scala | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/main/src/main/scala/sbt/Plugins.scala b/main/src/main/scala/sbt/Plugins.scala index 926defd11..1d1b7b977 100644 --- a/main/src/main/scala/sbt/Plugins.scala +++ b/main/src/main/scala/sbt/Plugins.scala @@ -36,11 +36,11 @@ Steps for users: For example, given plugins Web and Javascript (perhaps provided by plugins added with addSbtPlugin), - .plugins( Web && Javascript ) + .addPlugins( Web && Javascript ) will activate `MyPlugin` defined above and have its settings automatically added. If the user instead defines - .plugins( Web && Javascript && !MyPlugin) + .addPlugins( Web && Javascript ).disablePlugins(MyPlugin) then the `MyPlugin` settings (and anything that activates only when `MyPlugin` is activated) will not be added. */ @@ -186,7 +186,7 @@ object Plugins if(removed.isEmpty) Empty else And(removed) } - /** Defines a clause for `ap` such that the [[AutPlugin]] provided by `ap` is the head and the selector for `ap` is the body. */ + /** Defines a clause for `ap` such that the [[AutoPlugin]] provided by `ap` is the head and the selector for `ap` is the body. */ private[sbt] def asClause(ap: AutoPlugin): Clause = Clause( convert(ap.select), Set(Atom(ap.label)) ) diff --git a/main/src/main/scala/sbt/Project.scala b/main/src/main/scala/sbt/Project.scala index afcc29826..510e3e531 100755 --- a/main/src/main/scala/sbt/Project.scala +++ b/main/src/main/scala/sbt/Project.scala @@ -138,7 +138,7 @@ sealed trait Project extends ProjectDefinition[ProjectReference] /** Sets the [[AutoPlugin]]s of this project. A [[AutoPlugin]] is a common label that is used by plugins to determine what settings, if any, to add to a project. */ - def addPlugins(ns: AutoPlugin*): Project = setPlugins(Plugins.and(plugins, Plugins.And(ns.toList))) + def addPlugins(ns: Plugins*): Project = setPlugins(ns.foldLeft(plugins)(Plugins.and)) /** Disable the given plugins on this project. */ def disablePlugins(ps: AutoPlugin*): Project =