Commit 221cc5ce authored by Jim Fulton's avatar Jim Fulton

Added a bootstrapping command.

Reformated the tests to simplify the examples of calling the buildout
script.
parent 46a8f6c9
...@@ -94,6 +94,7 @@ class Buildout(dict): ...@@ -94,6 +94,7 @@ class Buildout(dict):
if options is None: if options is None:
options = self[section] = {} options = self[section] = {}
options[option] = value options[option] = value
# The egg dire
# do substitutions # do substitutions
converted = {} converted = {}
...@@ -163,6 +164,35 @@ class Buildout(dict): ...@@ -163,6 +164,35 @@ class Buildout(dict):
def _buildout_path(self, *names): def _buildout_path(self, *names):
return os.path.join(self._buildout_dir, *names) return os.path.join(self._buildout_dir, *names)
def bootstrap(self, args):
# Set up the actual buildout
self.install(args)
# Now copy buildout and setuptools eggs, amd record destination eggs:
entries = []
for name in 'setuptools', 'zc.buildout':
r = pkg_resources.Requirement.parse(name)
dist = pkg_resources.working_set.find(r)
if dist.precedence == pkg_resources.DEVELOP_DIST:
dest = os.path.join(self['buildout']['develop-eggs-directory'],
name+'.egg-link')
open(dest, 'w').write(dist.location)
entries.append(dist.location)
else:
dest = os.path.join(self['buildout']['eggs-directory'],
os.path.basename(dist.location))
entries.append(dest)
if not os.path.exists(dest):
shutil.copy2(dist.location, dest)
# Create buildout script
ws = pkg_resources.WorkingSet(entries)
ws.require('zc.buildout')
zc.buildout.easy_install.scripts(
['zc.buildout'], ws, sys.executable,
self['buildout']['bin-directory'])
def install(self, install_parts): def install(self, install_parts):
# Create buildout directories # Create buildout directories
...@@ -554,7 +584,7 @@ def main(args=None): ...@@ -554,7 +584,7 @@ def main(args=None):
if args: if args:
command = args.pop(0) command = args.pop(0)
if command != 'install': if command not in ('install', 'bootstrap'):
_error('invalid command:', command) _error('invalid command:', command)
else: else:
command = 'install' command = 'install'
......
...@@ -265,7 +265,8 @@ buildout: ...@@ -265,7 +265,8 @@ buildout:
>>> import os >>> import os
>>> os.chdir(sample_buildout) >>> os.chdir(sample_buildout)
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')), >>> buildout = os.path.join(sample_buildout, 'bin', 'buildout')
>>> print system(buildout),
buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ... buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ...
buildout: Installing data_dir buildout: Installing data_dir
data_dir: Creating directory mystuff data_dir: Creating directory mystuff
...@@ -314,7 +315,7 @@ we'll see that the directory gets removed and recreated: ...@@ -314,7 +315,7 @@ we'll see that the directory gets removed and recreated:
... path = mydata ... path = mydata
... """) ... """)
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')), >>> print system(buildout),
buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ... buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ...
buildout: Uninstalling data_dir buildout: Uninstalling data_dir
buildout: Installing data_dir buildout: Installing data_dir
...@@ -414,7 +415,7 @@ joined by a colon. ...@@ -414,7 +415,7 @@ joined by a colon.
Now, if we run the buildout, we'll see the options with the values Now, if we run the buildout, we'll see the options with the values
substituted. substituted.
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')), >>> print system(buildout),
buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ... buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ...
buildout: Uninstalling data_dir buildout: Uninstalling data_dir
buildout: Installing data_dir buildout: Installing data_dir
...@@ -432,7 +433,7 @@ The buildout system didn't know if this module could effect the mkdir ...@@ -432,7 +433,7 @@ The buildout system didn't know if this module could effect the mkdir
recipe, so it assumed it could and reinstalled mydata. If we rerun recipe, so it assumed it could and reinstalled mydata. If we rerun
the buildout: the buildout:
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')), >>> print system(buildout),
buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ... buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ...
buildout: Installing data_dir buildout: Installing data_dir
buildout: Installing debug buildout: Installing debug
...@@ -488,7 +489,7 @@ To see how this works, we use an example: ...@@ -488,7 +489,7 @@ To see how this works, we use an example:
... op = base ... op = base
... """) ... """)
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')), >>> print system(buildout),
op buldout op buldout
recipe recipes:debug recipe recipes:debug
...@@ -588,7 +589,7 @@ Here is a more elaborate example. ...@@ -588,7 +589,7 @@ Here is a more elaborate example.
... name = ee ... name = ee
... """) ... """)
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')), >>> print system(buildout),
name ee name ee
op buildout op buildout
op1 e1 1 op1 e1 1
...@@ -635,7 +636,7 @@ delimiter.) ...@@ -635,7 +636,7 @@ delimiter.)
... """) ... """)
>>> os.environ['HOME'] = home >>> os.environ['HOME'] = home
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')), >>> print system(buildout),
name ee name ee
op buildout op buildout
op1 e1 1 op1 e1 1
...@@ -688,8 +689,7 @@ Here's an example: ...@@ -688,8 +689,7 @@ Here's an example:
Note that we used the installed buildout option to specify an Note that we used the installed buildout option to specify an
alternate file to store information about installed parts. alternate file to store information about installed parts.
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout') >>> print system(buildout+' -c other.cfg debug:op1=foo -v'),
... + ' -c other.cfg debug:op1=foo -v'),
buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ... buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ...
buildout: Installing debug buildout: Installing debug
name other name other
...@@ -702,8 +702,7 @@ WARNING. ...@@ -702,8 +702,7 @@ WARNING.
Options can also be combined in the usual Unix way, as in: Options can also be combined in the usual Unix way, as in:
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout') >>> print system(buildout+' -vcother.cfg debug:op1=foo'),
... + ' -vcother.cfg debug:op1=foo'),
buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ... buildout: Running /tmp/sample-buildout/recipes/setup.py -q develop ...
buildout: Installing debug buildout: Installing debug
name other name other
...@@ -717,7 +716,7 @@ argument. ...@@ -717,7 +716,7 @@ argument.
>>> os.remove(os.path.join(sample_buildout, 'other.cfg')) >>> os.remove(os.path.join(sample_buildout, 'other.cfg'))
>>> os.remove(os.path.join(sample_buildout, '.other.cfg')) >>> os.remove(os.path.join(sample_buildout, '.other.cfg'))
Currently, the default and only command is 'install' and it takes a The most commonly used command is 'install' and it takes a
list of parts to install. if any parts are specified, then they must list of parts to install. if any parts are specified, then they must
be listed in the buildout parts option and only those parts are be listed in the buildout parts option and only those parts are
installed. To illustrate this, we'll update our configuration and run installed. To illustrate this, we'll update our configuration and run
...@@ -745,7 +744,7 @@ the buildout in the usual way: ...@@ -745,7 +744,7 @@ the buildout in the usual way:
... recipe = recipes:debug ... recipe = recipes:debug
... """) ... """)
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout') + ' -v'), >>> print system(buildout+' -v'),
buildout: Running /sample-buildout/recipes/setup.py -q develop ... buildout: Running /sample-buildout/recipes/setup.py -q develop ...
buildout: Uninstalling debug buildout: Uninstalling debug
buildout: Installing debug buildout: Installing debug
...@@ -827,8 +826,7 @@ Now we'll update our configuration file: ...@@ -827,8 +826,7 @@ Now we'll update our configuration file:
and run the buildout specifying just d2 and d3: and run the buildout specifying just d2 and d3:
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout' + ' -v') >>> print system(buildout+' -v install d3 d4'),
... + ' install d3 d4'),
buildout: Running /sample-buildout/recipes/setup.py -q develop ... buildout: Running /sample-buildout/recipes/setup.py -q develop ...
buildout: Uninstalling d3 buildout: Uninstalling d3
buildout: Installing d3 buildout: Installing d3
...@@ -897,7 +895,7 @@ directories are still there. ...@@ -897,7 +895,7 @@ directories are still there.
Now, if we run the buildout without the install command: Now, if we run the buildout without the install command:
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout') + ' -v'), >>> print system(buildout+' -v'),
buildout: Running /sample-buildout/recipes/setup.py -q develop ... buildout: Running /sample-buildout/recipes/setup.py -q develop ...
buildout: Uninstalling d1 buildout: Uninstalling d1
buildout: Uninstalling d2 buildout: Uninstalling d2
...@@ -954,7 +952,7 @@ provide alternate locations, and even names for these directories. ...@@ -954,7 +952,7 @@ provide alternate locations, and even names for these directories.
... work = os.path.join(alt, 'work'), ... work = os.path.join(alt, 'work'),
... )) ... ))
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout') + ' -v'), >>> print system(buildout+' -v'),
buildout: Creating directory /tmp/sample-alt/scripts buildout: Creating directory /tmp/sample-alt/scripts
buildout: Creating directory /tmp/sample-alt/work buildout: Creating directory /tmp/sample-alt/work
buildout: Creating directory /tmp/sample-alt/basket buildout: Creating directory /tmp/sample-alt/basket
...@@ -992,7 +990,7 @@ You can also specify an alternate buildout directory: ...@@ -992,7 +990,7 @@ You can also specify an alternate buildout directory:
... recipes=os.path.join(sample_buildout, 'recipes'), ... recipes=os.path.join(sample_buildout, 'recipes'),
... )) ... ))
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout') + ' -v'), >>> print system(buildout+' -v'),
buildout: Creating directory /tmp/sample-alt/bin buildout: Creating directory /tmp/sample-alt/bin
buildout: Creating directory /tmp/sample-alt/parts buildout: Creating directory /tmp/sample-alt/parts
buildout: Creating directory /tmp/sample-alt/eggs buildout: Creating directory /tmp/sample-alt/eggs
...@@ -1048,7 +1046,7 @@ can be a numeric value and that the verbosity can be specified in the ...@@ -1048,7 +1046,7 @@ can be a numeric value and that the verbosity can be specified in the
configuration file. Because the verbosoty is subtracted from the log configuration file. Because the verbosoty is subtracted from the log
level, we get a final log level of 20, which is the INFO level. level, we get a final log level of 20, which is the INFO level.
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')), >>> print system(buildout),
INFO Running /tmp/sample-buildout/recipes/setup.py -q develop ... INFO Running /tmp/sample-buildout/recipes/setup.py -q develop ...
Predefined buildout options Predefined buildout options
...@@ -1066,8 +1064,7 @@ database is shown. ...@@ -1066,8 +1064,7 @@ database is shown.
... parts = ... parts =
... """) ... """)
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout') >>> print system(buildout+' -vv'),
... + ' -vv'),
Configuration data: Configuration data:
[buildout] [buildout]
bin-directory = /tmp/sample-buildout/bin bin-directory = /tmp/sample-buildout/bin
...@@ -1146,3 +1143,41 @@ verbosity ...@@ -1146,3 +1143,41 @@ verbosity
command-line options. command-line options.
Bootstrapping
-------------
If zc.buildout is installed, you can use it to create a new buildout
with it's own local copies of zc.buildout and setuptools and with
local buildout scripts. There must be an existing setup.cfg:
>>> sample_bootstrapped = tempfile.mkdtemp('sample-bootstrapped')
>>> write(sample_bootstrapped, 'setup.cfg',
... '''
... [buildout]
... parts =
... ''')
>>> print system(buildout
... +' -c'+os.path.join(sample_bootstrapped, 'setup.cfg')
... +' bootstrap'),
>>> ls(sample_bootstrapped)
- .installed.cfg
d bin
d develop-eggs
d eggs
d parts
- setup.cfg
>>> ls(sample_bootstrapped, 'bin')
- buildout
- py_zc.buildout
>>> ls(sample_bootstrapped, 'eggs')
- setuptools-0.6b3-py2.3.egg
>>> ls(sample_bootstrapped, 'develop-eggs')
- zc.buildout.egg-link
Note that, in this example, we were using a development egg for the
buildout, and the ac.buildout egg ended up as an egg link.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment