Commit cea9649b authored by Hanno Schlichting's avatar Hanno Schlichting

Fixed argument parsing for entrypoint based zopectl commands.

parent 37cf7ab4
...@@ -11,6 +11,8 @@ http://docs.zope.org/zope2/releases/. ...@@ -11,6 +11,8 @@ http://docs.zope.org/zope2/releases/.
Bugs Fixed Bugs Fixed
++++++++++ ++++++++++
- Fixed argument parsing for entrypoint based zopectl commands.
- Fixed the usage of ``pstats.Stats()`` output stream. The - Fixed the usage of ``pstats.Stats()`` output stream. The
`Control_Panel/DebugInfo/manage_profile` ZMI view was broken in Python 2.5+. `Control_Panel/DebugInfo/manage_profile` ZMI view was broken in Python 2.5+.
......
...@@ -176,17 +176,19 @@ in ``setup.py``. Commands have to be put in the ``zopectl.command`` group: ...@@ -176,17 +176,19 @@ in ``setup.py``. Commands have to be put in the ``zopectl.command`` group:
Due to an implementation detail of ``zopectl`` you can not use a minus Due to an implementation detail of ``zopectl`` you can not use a minus
character (``-``) in the command name. character (``-``) in the command name.
This adds a ``init_app`` command that can be used directly from the commandline:: This adds a ``init_app`` command that can be used directly from the command
line::
bin\zopectl init_app bin\zopectl init_app
The command must be implemented as a python callable. It will be called with The command must be implemented as a Python callable. It will be called with
two parameters: the Zope2 application and a tuple with all commandline two parameters: the Zope2 application and a list with all command line
arguments. Here is a basic example: arguments. Here is a basic example:
.. code-block:: python .. code-block:: python
def init_application(app, args): def init_application(app, args):
print 'Initialisating the application' print 'Initializing the application'
Make sure the callable can be imported without side-effects, such as setting
up the database connection used by Zope 2.
...@@ -354,8 +354,9 @@ class ZopeCmd(ZDCmd): ...@@ -354,8 +354,9 @@ class ZopeCmd(ZDCmd):
# ['run "arg 1" "arg2"'] rather than ['run','arg 1','arg2']. # ['run "arg 1" "arg2"'] rather than ['run','arg 1','arg2'].
# If that's the case, we'll use csv to do the parsing # If that's the case, we'll use csv to do the parsing
# so that we can split on spaces while respecting quotes. # so that we can split on spaces while respecting quotes.
if len(self.options.args) == 1: tup = self.options.args
tup = csv.reader(self.options.args, delimiter=' ').next() if len(tup) == 1:
tup = csv.reader(tup, delimiter=' ').next()
# Remove -c and add command name as sys.argv[0] # Remove -c and add command name as sys.argv[0]
cmd = [ 'import sys', cmd = [ 'import sys',
...@@ -364,13 +365,14 @@ class ZopeCmd(ZDCmd): ...@@ -364,13 +365,14 @@ class ZopeCmd(ZDCmd):
] ]
if len(tup) > 1: if len(tup) > 1:
argv = tup[1:] argv = tup[1:]
cmd.append('[sys.argv.append(x) for x in %s]; ' % argv) for a in argv:
cmd.append('sys.argv.append(r\'%s\')' % a)
cmd.extend([ cmd.extend([
'import pkg_resources', 'import pkg_resources',
'import Zope2', 'import Zope2',
'func=pkg_resources.EntryPoint.parse(\'%s\').load(False)' % entry_point, 'func=pkg_resources.EntryPoint.parse(\'%s\').load(False)' % entry_point,
'app=Zope2.app()', 'app=Zope2.app()',
'func(app)', 'func(app, sys.argv[1:])',
]) ])
cmdline = self.get_startup_cmd(self.options.python, ' ; '.join(cmd)) cmdline = self.get_startup_cmd(self.options.python, ' ; '.join(cmd))
self._exitstatus = os.system(cmdline) self._exitstatus = os.system(cmdline)
......
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