Skip to main content

ZC Buildout recipe to execute commands in it's own shell

Project description

=====================
cp.recipe.cmd package
=====================

.. contents::

What is cp.recipe.cmd ?
=======================


This recipe is used to run one or more command lines.

I stole this from iw.recipe.cmd (http://pypi.python.org/pypi/iw.recipe.cmd/0.1)

It works differently tho, when it comes to executing shell commands. iw.recipe.cmd would push each command out separately in it's own shell. Here I push them out to a shell script, and then run the shell script. This way things like CD and other things that require state within the shell work great.

options:
shell= Set a shell to execute (default /bin/sh) (do not put the #!)
on_install= whether to run or not on_install (defaults True)
on_update= whether to run or not on_update (defaults True)
install_cmd = Commands to run when install happens.
update_cmd = Commands to run when an update happens.

Also, I changed the way it works in the config file (example):

[commandexample]
recipe = cp.recipe.cmd
shell = /bin/sh
install_cmd =
echo "install commands go here"
cd /tmp
echo `pwd`
echo 'see, I exist in one shell instance.'
update_cmd =
echo "update commands go here"


On install, install_cmd will be turned into a shell script, and then ran.
on update, update_cmd will be turned into a shell script and then ran. If you want update_cmds to be the same you can do something like this:
update_cmd = ${commandexample:install_cmd}

(where commandexample is the name of your part)


I've added a new option shell=
You can put whateer you want in there, sme nice examples:
/usr/bin/env python
(to run the python interpreter)
the default is /bin/sh, so all your old code using this will work just fine.

Also, I check the output of the script and if something returns >0 then
CmdExecutionFailed is raised, along with the output of the error, and the path
of where the script is, so you can see what was generated, do debugging, and
fix it.


a python example using the new shell= is here:


[buildout]
parts = cmds

[cmds]
recipe = cp.recipe.cmd
shell=/usr/bin/env python
update_cmd =
f = open('testfile'.'w')
f.write('this is a testfile')
f.close()



Below are the original docs (which can be ignored probably):
=======================



We need a config file::

>>> cfg = """
... [buildout]
... parts = cmds
...
... [cmds]
... recipe = iw.recipe.cmd
... on_install=true
... cmds= %s
... """

>>> test_file = join(sample_buildout, 'test.txt')
>>> cmds = 'touch %s' % test_file
>>> write(sample_buildout, 'buildout.cfg', cfg % cmds)

Ok, so now we can touch a file for testing::

>>> print system(buildout)
Installing cmds.

>>> 'test.txt' in os.listdir(sample_buildout)
True

And remove it::

>>> test_file = join(sample_buildout, 'test.txt')
>>> cmds = 'rm -f %s' % test_file
>>> write(sample_buildout, 'buildout.cfg', cfg % cmds)

>>> print system(buildout)
Uninstalling cmds.
Installing cmds.

>>> 'test.txt' in os.listdir(sample_buildout)
False

We can run more than one commands::

>>> cmds = '''
... touch %s
... rm -f %s
... ''' % (test_file, test_file)

>>> test_file = join(sample_buildout, 'test.txt')
>>> cmds = 'rm -f %s' % test_file
>>> write(sample_buildout, 'buildout.cfg', cfg % cmds)

>>> print system(buildout)
Updating cmds.

>>> 'test.txt' in os.listdir(sample_buildout)
False

We can also run some python code::

>>> cfg = """
... [buildout]
... parts = py py2
...
... [py]
... recipe = iw.recipe.cmd:py
... on_install=true
... cmds=
... >>> sample_buildout = buildout.get('directory', '.')
... >>> print os.listdir(sample_buildout)
... >>> shutil.rmtree(os.path.join(sample_buildout, "bin"))
... >>> print os.listdir(sample_buildout)
... [py2]
... recipe = iw.recipe.cmd:py
... on_install=true
... cmds=
... >>> def myfunc(value):
... ... return value and True or False
... >>> v = 20
... >>> print myfunc(v)
... """

>>> write(sample_buildout, 'buildout.cfg', cfg)

Ok, so now we run it::

>>> print system(buildout)
Uninstalling cmds.
Installing py.
['.installed.cfg', 'bin', 'buildout.cfg', 'develop-eggs', 'eggs', 'parts']
['.installed.cfg', 'buildout.cfg', 'develop-eggs', 'eggs', 'parts']
Installing py2.
True



Changelog
=========

0.3 (2011-01-16)
----------------

- add HISTORY.txt to track release notes
[sureshvv]

0.2 (2010-12-07)
-----------------

- added buildout test/example
[csawyer]

- Implement the "shell" option
[csawyer]

- Get exit status of command and raise exception when it fails.
[csawyer]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cp.recipe.cmd-0.3.tar.gz (5.6 kB view details)

Uploaded Source

File details

Details for the file cp.recipe.cmd-0.3.tar.gz.

File metadata

  • Download URL: cp.recipe.cmd-0.3.tar.gz
  • Upload date:
  • Size: 5.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for cp.recipe.cmd-0.3.tar.gz
Algorithm Hash digest
SHA256 7e35063139340bf221f887956dc15a18f4fd610b36e8d0d529bb5a3ebbda40c3
MD5 e0fc65125e878e67464ddfe57b606750
BLAKE2b-256 ad50dda1f1d098cac615fe549a6c6bfb216422754cf0ba5faa3bfe714effad04

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page