90 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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.__pkg__.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.__pkg__.getpath()
 | 
						|
    apidocspath = pkgpath.dirpath().join('apigen')
 | 
						|
    main(pkgpath, apidocspath, 'codespeak.net',
 | 
						|
         '/home/guido/rsynctests', args, ignorefail)
 | 
						|
 |