Commit 4df856c7 authored by Jim Fulton's avatar Jim Fulton

- Added a new init command for creating a new buildout. This creates

  an empty configuration file and then bootstraps.

- Except when using the new init command, it is now an error to run
  buildout without a configuration file.

- 75607: buildout should not run if it creates an empty buildout.cfg
parent ea1b8f3d
...@@ -20,6 +20,12 @@ Feature Changes ...@@ -20,6 +20,12 @@ Feature Changes
- buildout changes to the buildout directory before running recipe - buildout changes to the buildout directory before running recipe
install and update methods. install and update methods.
- Added a new init command for creating a new buildout. This creates
an empty configuration file and then bootstraps.
- Except when using the new init command, it is now an error to run
buildout without a configuration file.
Bugs Fixed Bugs Fixed
---------- ----------
...@@ -30,6 +36,8 @@ Bugs Fixed ...@@ -30,6 +36,8 @@ Bugs Fixed
setuptools requires that file urls that point to directories must setuptools requires that file urls that point to directories must
end in a "/". Added a workaround. end in a "/". Added a workaround.
- 75607: buildout should not run if it creates an empty buildout.cfg
1.0.0b24 (2007-05-09) 1.0.0b24 (2007-05-09)
===================== =====================
......
...@@ -67,7 +67,7 @@ _buildout_default_options = { ...@@ -67,7 +67,7 @@ _buildout_default_options = {
class Buildout(UserDict.DictMixin): class Buildout(UserDict.DictMixin):
def __init__(self, config_file, cloptions, def __init__(self, config_file, cloptions,
user_defaults=True, windows_restart=False): user_defaults=True, windows_restart=False, command=None):
__doing__ = 'Initializing' __doing__ = 'Initializing'
...@@ -80,8 +80,14 @@ class Buildout(UserDict.DictMixin): ...@@ -80,8 +80,14 @@ class Buildout(UserDict.DictMixin):
config_file = os.path.abspath(config_file) config_file = os.path.abspath(config_file)
base = os.path.dirname(config_file) base = os.path.dirname(config_file)
if not os.path.exists(config_file): if not os.path.exists(config_file):
print 'Warning: creating', config_file if command == 'init':
print 'Creating', config_file
open(config_file, 'w').write('[buildout]\nparts = \n') open(config_file, 'w').write('[buildout]\nparts = \n')
else:
raise zc.buildout.UserError(
"Couldn't open %s" % config_file)
if config_file:
data['buildout']['directory'] = os.path.dirname(config_file) data['buildout']['directory'] = os.path.dirname(config_file)
else: else:
base = None base = None
...@@ -95,6 +101,7 @@ class Buildout(UserDict.DictMixin): ...@@ -95,6 +101,7 @@ class Buildout(UserDict.DictMixin):
[])) []))
# load configuration files # load configuration files
if config_file:
_update(data, _open(os.path.dirname(config_file), config_file, [])) _update(data, _open(os.path.dirname(config_file), config_file, []))
# apply command-line options # apply command-line options
...@@ -209,6 +216,8 @@ class Buildout(UserDict.DictMixin): ...@@ -209,6 +216,8 @@ class Buildout(UserDict.DictMixin):
['zc.buildout'], ws, sys.executable, ['zc.buildout'], ws, sys.executable,
self['buildout']['bin-directory']) self['buildout']['bin-directory'])
init = bootstrap
def install(self, install_args): def install(self, install_args):
__doing__ = 'Installing' __doing__ = 'Installing'
...@@ -1211,12 +1220,34 @@ Commands: ...@@ -1211,12 +1220,34 @@ Commands:
definition from the configuration file is used. Otherwise, the definition from the configuration file is used. Otherwise, the
arguments specify the parts to be installed. arguments specify the parts to be installed.
Note that the semantics differ depending on whether any parts are
specified. If parts are specified, then only those parts will be
installed. If no parts are specified, then the parts specified by
the buildout parts option will be installed along with all of
their dependencies.
bootstrap bootstrap
Create a new buildout in the current working directory, copying Create a new buildout in the current working directory, copying
the buildout and setuptools eggs and, creating a basic directory the buildout and setuptools eggs and, creating a basic directory
structure and a buildout-local buildout script. structure and a buildout-local buildout script.
init
Initialize a buildout, creating a buildout.cfg file if it doesn't
exist and then performing the same actions as for the buildout
command.
setup script [setup command and options]
Run a given setup script arranging that setuptools is in the
script's path and and that it has been imported so that
setuptools-provided commands (like bdist_egg) can be used even if
the setup script doesn't import setuptools itself.
The script can be given either as a script path or a path to a
directory containing a setup.py script.
""" """
def _help(): def _help():
print _usage print _usage
...@@ -1288,7 +1319,9 @@ def main(args=None): ...@@ -1288,7 +1319,9 @@ def main(args=None):
if args: if args:
command = args.pop(0) command = args.pop(0)
if command not in ('install', 'bootstrap', 'runsetup', 'setup'): if command not in (
'install', 'bootstrap', 'runsetup', 'setup', 'init',
):
_error('invalid command:', command) _error('invalid command:', command)
else: else:
command = 'install' command = 'install'
...@@ -1296,7 +1329,7 @@ def main(args=None): ...@@ -1296,7 +1329,7 @@ def main(args=None):
try: try:
try: try:
buildout = Buildout(config_file, options, buildout = Buildout(config_file, options,
user_defaults, windows_restart) user_defaults, windows_restart, command)
getattr(buildout, command)(args) getattr(buildout, command)(args)
except SystemExit: except SystemExit:
pass pass
......
...@@ -1968,8 +1968,8 @@ verbosity ...@@ -1968,8 +1968,8 @@ verbosity
command-line options. command-line options.
Bootstrapping Creating new buildouts and bootstrapping
------------- ----------------------------------------
If zc.buildout is installed, you can use it to create a new buildout 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 with it's own local copies of zc.buildout and setuptools and with
...@@ -1979,8 +1979,8 @@ local buildout scripts. ...@@ -1979,8 +1979,8 @@ local buildout scripts.
>>> print system(buildout >>> print system(buildout
... +' -c'+os.path.join(sample_bootstrapped, 'setup.cfg') ... +' -c'+os.path.join(sample_bootstrapped, 'setup.cfg')
... +' bootstrap'), ... +' init'),
Warning: creating /sample-bootstrapped/setup.cfg Creating /sample-bootstrapped/setup.cfg
buildout: Creating directory /sample-bootstrapped/bin buildout: Creating directory /sample-bootstrapped/bin
buildout: Creating directory /sample-bootstrapped/parts buildout: Creating directory /sample-bootstrapped/parts
buildout: Creating directory /sample-bootstrapped/eggs buildout: Creating directory /sample-bootstrapped/eggs
...@@ -2012,6 +2012,36 @@ buildout or setuptools.) ...@@ -2012,6 +2012,36 @@ buildout or setuptools.)
Note that the buildout script was installed but not run. To run Note that the buildout script was installed but not run. To run
the buildout, we'd have to run the installed buildout script. the buildout, we'd have to run the installed buildout script.
If we have an existing buildout that already has a buildout.cfg, we'll
normally use the bootstrap command instead of init. It will complain
if there isn't a configuration file:
>>> sample_bootstrapped2 = tmpdir('sample-bootstrapped2')
>>> print system(buildout
... +' -c'+os.path.join(sample_bootstrapped2, 'setup.cfg')
... +' bootstrap'),
While:
Initializing
Error: Couldn't open /sample-bootstrapped2/setup.cfg
>>> write(sample_bootstrapped2, 'setup.cfg',
... """
... [buildout]
... parts =
... """)
>>> print system(buildout
... +' -c'+os.path.join(sample_bootstrapped2, 'setup.cfg')
... +' bootstrap'),
buildout: Creating directory /sample-bootstrapped2/bin
buildout: Creating directory /sample-bootstrapped2/parts
buildout: Creating directory /sample-bootstrapped2/eggs
buildout: Creating directory /sample-bootstrapped2/develop-eggs
zc.buildout.easy_install: Generated script /sample-bootstrapped2/bin/buildout.
Newest and Offline Modes Newest and Offline Modes
------------------------ ------------------------
......
...@@ -606,170 +606,24 @@ if os.path.exists(bootstrap_py): ...@@ -606,170 +606,24 @@ if os.path.exists(bootstrap_py):
def test_help(): def test_help():
""" """
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')+' -h'), >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')+' -h'),
Usage: buildout [options] [assignments] [command [command arguments]] ... # doctest: +ELLIPSIS
<BLANKLINE> Usage: buildout [options] [assignments] [command [command arguments]]
Options: <BLANKLINE>
<BLANKLINE> Options:
<BLANKLINE>
-h, --help -h, --help
<BLANKLINE> ...
Print this message and exit.
<BLANKLINE> >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')
-v ... +' --help'),
<BLANKLINE> ... # doctest: +ELLIPSIS
Increase the level of verbosity. This option can be used multiple times. Usage: buildout [options] [assignments] [command [command arguments]]
<BLANKLINE> <BLANKLINE>
-q Options:
<BLANKLINE> <BLANKLINE>
Decrease the level of verbosity. This option can be used multiple times.
<BLANKLINE>
-c config_file
<BLANKLINE>
Specify the path to the buildout configuration file to be used.
This defaults to the file named "buildout.cfg" in the current
working directory.
<BLANKLINE>
-U
<BLANKLINE>
Don't read user defaults.
<BLANKLINE>
-o
<BLANKLINE>
Run in off-line mode. This is equivalent to the assignment
buildout:offline=true.
<BLANKLINE>
-O
<BLANKLINE>
Run in non-off-line mode. This is equivalent to the assignment
buildout:offline=false. This is the default buildout mode. The
-O option would normally be used to override a true offline
setting in a configuration file.
<BLANKLINE>
-n
<BLANKLINE>
Run in newest mode. This is equivalent to the assignment
buildout:newest=true. With this setting, which is the default,
buildout will try to find the newest versions of distributions
available that satisfy its requirements.
<BLANKLINE>
-N
<BLANKLINE>
Run in non-newest mode. This is equivalent to the assignment
buildout:newest=false. With this setting, buildout will not seek
new distributions if installed distributions satisfy it's
requirements.
<BLANKLINE>
-D
<BLANKLINE>
Debug errors. If an error occurs, then the post-mortem debugger
will be started. This is especially useful for debuging recipe
problems.
<BLANKLINE>
Assignments are of the form: section:option=value and are used to
provide configuration options that override those given in the
configuration file. For example, to run the buildout in offline mode,
use buildout:offline=true.
<BLANKLINE>
Options and assignments can be interspersed.
<BLANKLINE>
Commands:
<BLANKLINE>
install [parts]
<BLANKLINE>
Install parts. If no command arguments are given, then the parts
definition from the configuration file is used. Otherwise, the
arguments specify the parts to be installed.
<BLANKLINE>
bootstrap
<BLANKLINE>
Create a new buildout in the current working directory, copying
the buildout and setuptools eggs and, creating a basic directory
structure and a buildout-local buildout script.
<BLANKLINE>
<BLANKLINE>
>>> print system(os.path.join(sample_buildout, 'bin', 'buildout')
... +' --help'),
Usage: buildout [options] [assignments] [command [command arguments]]
<BLANKLINE>
Options:
<BLANKLINE>
-h, --help -h, --help
<BLANKLINE> ...
Print this message and exit.
<BLANKLINE>
-v
<BLANKLINE>
Increase the level of verbosity. This option can be used multiple times.
<BLANKLINE>
-q
<BLANKLINE>
Decrease the level of verbosity. This option can be used multiple times.
<BLANKLINE>
-c config_file
<BLANKLINE>
Specify the path to the buildout configuration file to be used.
This defaults to the file named "buildout.cfg" in the current
working directory.
<BLANKLINE>
-U
<BLANKLINE>
Don't read user defaults.
<BLANKLINE>
-o
<BLANKLINE>
Run in off-line mode. This is equivalent to the assignment
buildout:offline=true.
<BLANKLINE>
-O
<BLANKLINE>
Run in non-off-line mode. This is equivalent to the assignment
buildout:offline=false. This is the default buildout mode. The
-O option would normally be used to override a true offline
setting in a configuration file.
<BLANKLINE>
-n
<BLANKLINE>
Run in newest mode. This is equivalent to the assignment
buildout:newest=true. With this setting, which is the default,
buildout will try to find the newest versions of distributions
available that satisfy its requirements.
<BLANKLINE>
-N
<BLANKLINE>
Run in non-newest mode. This is equivalent to the assignment
buildout:newest=false. With this setting, buildout will not seek
new distributions if installed distributions satisfy it's
requirements.
<BLANKLINE>
-D
<BLANKLINE>
Debug errors. If an error occurs, then the post-mortem debugger
will be started. This is especially useful for debuging recipe
problems.
<BLANKLINE>
Assignments are of the form: section:option=value and are used to
provide configuration options that override those given in the
configuration file. For example, to run the buildout in offline mode,
use buildout:offline=true.
<BLANKLINE>
Options and assignments can be interspersed.
<BLANKLINE>
Commands:
<BLANKLINE>
install [parts]
<BLANKLINE>
Install parts. If no command arguments are given, then the parts
definition from the configuration file is used. Otherwise, the
arguments specify the parts to be installed.
<BLANKLINE>
bootstrap
<BLANKLINE>
Create a new buildout in the current working directory, copying
the buildout and setuptools eggs and, creating a basic directory
structure and a buildout-local buildout script.
<BLANKLINE>
<BLANKLINE>
""" """
def test_bootstrap_with_extension(): def test_bootstrap_with_extension():
...@@ -2059,6 +1913,18 @@ def bug_61890_file_urls_dont_seem_to_work_in_find_dash_links(): ...@@ -2059,6 +1913,18 @@ def bug_61890_file_urls_dont_seem_to_work_in_find_dash_links():
- demo-0.2-py2.4.egg - demo-0.2-py2.4.egg
- demoneeded-1.1-py2.4.egg - demoneeded-1.1-py2.4.egg
"""
def bug_75607_buildout_should_not_run_if_it_creates_an_empty_buildout_cfg():
"""
>>> remove('buildout.cfg')
>>> print system(buildout),
While:
Initializing
Error: Couldn't open /sample-buildout/buildout.cfg
""" """
###################################################################### ######################################################################
......
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