Files
pytest2/py/bin/_update_website.py
guido 13c44faa38 [svn r38770] Removed option --apigen_relpath, added options --docpath and --apigenpath, both
of which are not only used for building the navigation, but also to actually
tell py.test where docs should be generated. Also cleaned up and fixed the
situation regarding relative links in the navigation menu and stylesheet/js
paths.

--HG--
branch : trunk
2007-02-14 00:56:57 +01:00

90 lines
3.4 KiB
Python
Executable File

#!/usr/bin/env python
""" run py.test with the --apigen option and rsync the results to a host
rsyncs the whole package (with all the ReST docs converted to HTML) as well
as the apigen docs to a given remote host and path
"""
from _findpy import py
import py
import sys
def rsync(pkgpath, apidocspath, gateway, remotepath):
""" copy the code and docs to the remote host """
# copy to a temp dir first, even though both paths (normally) share the
# same parent dir, that may contain other stuff that we don't want to
# copy...
tempdir = py.test.ensuretemp('update_website_rsync_temp')
pkgpath.copy(tempdir.ensure(pkgpath.basename, dir=True))
apidocspath.copy(tempdir.ensure(apidocspath.basename, dir=True))
rs = py.execnet.RSync(tempdir)
rs.add_target(gateway, remotepath, delete=True)
rs.send()
def run_tests(pkgpath, apigenpath, args='', captureouterr=False):
""" run the unit tests and build the docs """
pypath = py.__package__.getpath()
pytestpath = pypath.join('bin/py.test')
# XXX this would need a Windows specific version if we want to allow
# running this script on that platform, but currently --apigen doesn't
# work there anyway...
apigenscript = pkgpath.join('apigen/apigen.py') # XXX be more general here?
if not apigenscript.check(file=True):
apigenscript = pypath.join('apigen/apigen.py')
cmd = ('APIGENPATH="%s" PYTHONPATH="%s:%s" python '
'"%s" %s --apigen="%s" "%s"' % (apigenpath, pypath.dirpath(),
pkgpath.dirpath(), pytestpath,
args, apigenscript,
pkgpath))
if captureouterr:
cmd += ' > /dev/null 2>&1'
try:
output = py.process.cmdexec(cmd)
except py.error.Error, e:
return e.err or str(e)
return None
def main(pkgpath, apidocspath, rhost, rpath, args='', ignorefail=False):
print 'running tests'
errors = run_tests(pkgpath, apidocspath, args)
if errors:
print >>sys.stderr, \
'Errors while running the unit tests: %s' % (errors,)
if not ignorefail:
print >>sys.stderr, ('if you want to continue the update '
'regardless of failures, use --ignorefail')
sys.exit(1)
print 'rsyncing'
gateway = py.execnet.SshGateway(rhost)
errors = rsync(pkgpath, apidocspath, gateway, rpath)
if errors:
print >>sys.stderr, 'Errors while rsyncing: %s'
sys.exit(1)
if __name__ == '__main__':
args = sys.argv[1:]
if '--help' in args or '-h' in args:
print 'usage: %s [options]'
print
print 'run the py lib tests and update the py lib website'
print 'options:'
print ' --ignorefail: ignore errors in the unit tests and always'
print ' try to rsync'
print ' --help: show this message'
print
print 'any additional arguments are passed on as-is to the py.test'
print 'child process'
sys.exit()
ignorefail = False
if '--ignorefail' in args:
args.remove('--ignorefail')
ignorefail = True
args = ' '.join(sys.argv[1:])
pkgpath = py.__package__.getpath()
apidocspath = pkgpath.dirpath().join('apigen')
main(pkgpath, apidocspath, 'codespeak.net',
'/home/guido/rsynctests', args, ignorefail)