diff --git a/specifications/README.txt b/specifications/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..ece00be7320d289a8a3c7f3c7905a95964722009 --- /dev/null +++ b/specifications/README.txt @@ -0,0 +1,4 @@ +This directory is (an experimental) place to manage Launchpad +specification bodies. Files here are referenced (via svn.zope.org +URLs) from the buildout project specifications in Launchpad, +https://features.launchpad.net/products/zc.buildout. diff --git a/specifications/Reproducability.txt b/specifications/Reproducability.txt new file mode 100644 index 0000000000000000000000000000000000000000..0c2b1b972772151d8fb64309ca8256955fa9bb1b --- /dev/null +++ b/specifications/Reproducability.txt @@ -0,0 +1,99 @@ +Reproduceable (taggable) buildouts +================================== + +It's important to be able to tag a buildout in a software repository +in such a way that, months, or even years later, the buildout tag can +be checked out and used to construct the same collection of parts, +with the same versions. (Note that parts could still nehave +differently due to changes in parts of the environment, such as system +libraries, not controlled by the buildout.) + +A feature of the buildout is it's use of eggs and the automatic +resolution of dependencies. The latest versions of dependencies are +automatically downloaded and installed. This is great during +development or when using the buildout for casual software +development, but it doesn't work very well for repoduceablity. + +What's needed is some way to, when needed, record information about +the versions of eggs (and any other bits) whos versions are determined +dynamically. + +Proposal +-------- + +We'll add a buildout option, create-repeatable. The option will +specify a file into which option information should be saved to create +a repeatable buildout. The data will be saved in a form that can be +used by the buildout or recipes in a later run. To make a tagged +buildout, a user would run the buildout with the record-versions +option set to a file name and then modify the buildout to be +extended-by this file. + +Consider the following example buildout.cfg:: + + [buildout] + parts = foo + + [foo] + recipe = zc.recipe.eggs + eggs = foo + eek + +Now assume that: + +- The current version of foo is 1.1 + +- Foo depends on bar =, which depends on baz. The current versions of + bar and bas are 1.1 and 2.1. + +- The current version of eek is 1.5 + +- eek depends on ook, which is as version 1.3. + +- zc.recipe.egg is at version 1.0b5 + +If we run the buildout with the command-line option:: + + buildout:create-repeatable=reapeatable.cfg + +we'll get a repeatable.cfg file that looks something like:: + + [foo] + recipe = zc.recipe.eggs ==1.0b5 + static = true + eggs = foo ==1.1 + bar ==1.1 + baz ==2.1 + eek ==1.5 + ook ==1.3 + +The file contains options for the foo part. The buildout software +itself added an entry for the recipe that fixes the recipe version +at the version used by the buildout. + +The zc.recipe.eggs recipe added the eggs option that lists the +specifoc releases that were assembled. + +Finally the buildout.cfg file can be modified to use the +repeatable.cfg file:: + + [buildout] + parts = foo + extended-by: repeatable.cfg + + [foo] + recipe = zc.recipe.eggs + eggs = foo + eek + +When the buildout is run, the options in repeatable.cfg will override +the onces in buildout.cfg, providing a repeatable buildout + +Python API +---------- + +The recipe API will grow a repeatable method that is called after the +install method and is passed a dictionary that a recipe can store +option data in. A recipe instance will only be able to provide repeatable data +for it's part. +