You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
264 lines
8.4 KiB
Python
264 lines
8.4 KiB
Python
#!/usr/bin/python
|
|
"""
|
|
This script installs the trunk version, builds the docs, then uploads them
|
|
to ...
|
|
|
|
Then it installs the devel version, builds the docs, and uploads them to
|
|
...
|
|
|
|
Depends
|
|
-------
|
|
virtualenv
|
|
"""
|
|
import base64
|
|
import subprocess
|
|
import os
|
|
import shutil
|
|
import re
|
|
import smtplib
|
|
import sys
|
|
from email.MIMEText import MIMEText
|
|
|
|
######### INITIAL SETUP ##########
|
|
|
|
#hard-coded "curren working directory" ie., you will need file permissions
|
|
#for this folder
|
|
script = os.path.abspath(sys.argv[0])
|
|
dname = os.path.abspath(os.path.dirname(script))
|
|
gname = 'statsmodels'
|
|
gitdname = os.path.join(dname, gname)
|
|
os.chdir(dname)
|
|
|
|
# hard-coded git branch names
|
|
repo = 'git://github.com/statsmodels/statsmodels.git'
|
|
stable_trunk = 'master'
|
|
last_release = 'v0.3.1'
|
|
#branches = [stable_trunk, last_release]
|
|
#NOTE: just update the releases by hand
|
|
branches = [stable_trunk]
|
|
|
|
# virtual environment directory
|
|
virtual_dir = 'BUILDENV'
|
|
virtual_dir = os.path.join(dname, virtual_dir)
|
|
# this points to the newly installed python in the virtualenv
|
|
virtual_python = os.path.join(virtual_dir,'bin','python')
|
|
|
|
|
|
# my security holes
|
|
with open('/home/skipper/statsmodels/gmail.txt') as f:
|
|
pwd = f.readline().strip()
|
|
gmail_pwd = base64.b64decode(pwd)
|
|
|
|
########### EMAIL #############
|
|
email_name ='statsmodels.dev' + 'AT' + 'gmail' +'.com'
|
|
email_name = email_name.replace('AT','@')
|
|
gmail_pwd= gmail_pwd
|
|
to_email = [email_name, ('josef.pktd' + 'AT' + 'gmail' + '.com').replace('AT',
|
|
'@')]
|
|
|
|
|
|
########### FUNCTIONS ###############
|
|
|
|
def create_virtualenv():
|
|
# make a virtualenv for installation if it doesn't exist
|
|
# and easy_install sphinx
|
|
if not os.path.exists(virtual_dir):
|
|
retcode = subprocess.call(['/usr/local/bin/virtualenv', virtual_dir])
|
|
if retcode != 0:
|
|
msg = """There was a problem creating the virtualenv"""
|
|
raise Exception(msg)
|
|
retcode = subprocess.call([virtual_dir+'/bin/easy_install', 'sphinx'])
|
|
if retcode != 0:
|
|
msg = """There was a problem installing sphinx"""
|
|
raise Exception(msg)
|
|
|
|
def create_update_gitdir():
|
|
"""
|
|
Creates a directory for local repo if it doesn't exist, updates repo otherwise.
|
|
"""
|
|
if not os.path.exists(gitdname):
|
|
retcode = subprocess.call('git clone '+repo, shell=True)
|
|
if retcode != 0:
|
|
msg = """There was a problem cloning the repo"""
|
|
raise Exception(msg)
|
|
else:
|
|
os.chdir(gitdname)
|
|
retcode = subprocess.call('git pull', shell=True)
|
|
if retcode != 0:
|
|
msg = """There was a problem pulling from the repo."""
|
|
raise Exception(msg)
|
|
|
|
def getdirs():
|
|
"""
|
|
Get current directories of cwd in order to restore to this
|
|
"""
|
|
dirs = [i for i in os.listdir(dname) if not \
|
|
os.path.isfile(os.path.join(dname, i))]
|
|
return dirs
|
|
|
|
def newdir(dirs):
|
|
"""
|
|
Returns difference in directories between dirs and current directories
|
|
|
|
If the difference is greater than one directory it raises an error.
|
|
"""
|
|
dirs = set(dirs)
|
|
newdirs = set([i for i in os.listdir(dname) if not \
|
|
os.path.isfile(os.path.join(dname,i))])
|
|
newdir = newdirs.difference(dirs)
|
|
if len(newdir) != 1:
|
|
msg = """There was more than one directory created. Don't know what to delete."""
|
|
raise Exception(msg)
|
|
newdir = newdir.pop()
|
|
return newdir
|
|
|
|
def install_branch(branch):
|
|
"""
|
|
Installs the branch in a virtualenv.
|
|
"""
|
|
|
|
# if it's already in the virtualenv, remove it
|
|
ver = '.'.join(map(str,(sys.version_info.major,sys.version_info.minor)))
|
|
sitepack = os.path.join(virtual_dir,'lib','python'+ver, 'site-packages')
|
|
dir_list = os.listdir(sitepack)
|
|
for f in dir_list:
|
|
if 'scikits.statsmodels' in f:
|
|
shutil.rmtree(os.path.join(sitepack, f))
|
|
|
|
# checkout the branch
|
|
os.chdir(gitdname)
|
|
retcode = subprocess.call('git checkout ' + branch, shell=True)
|
|
if retcode != 0:
|
|
msg = """Could not checkout out branch %s""" % branch
|
|
raise Exception(msg)
|
|
|
|
# build and install
|
|
retcode = subprocess.call(" ".join([virtual_python, 'setup.py', 'build']),
|
|
shell=True)
|
|
if retcode != 0:
|
|
msg = """ Could not build branch %s""" % branch
|
|
raise Exception(msg)
|
|
retcode = subprocess.call(" ".join([virtual_python, os.path.join(gitdname,
|
|
'setup.py'), 'install']), shell=True)
|
|
if retcode != 0:
|
|
os.chdir(dname)
|
|
msg = """Could not install branch %s""" % branch
|
|
raise Exception(msg)
|
|
os.chdir(dname)
|
|
|
|
def build_docs(branch):
|
|
"""
|
|
Changes into gitdname and builds the docs using sphinx in the
|
|
BUILDENV virtualenv
|
|
"""
|
|
os.chdir(os.path.join(gitdname,'scikits','statsmodels','docs'))
|
|
sphinx_dir = os.path.join(virtual_dir,'bin')
|
|
#NOTE: don't use make.py, just use make and specify which sphinx
|
|
# retcode = subprocess.call([virtual_python,'make.py','html',
|
|
# '--sphinx_dir='+sphinx_dir])
|
|
retcode = subprocess.call(" ".join(['make','html',
|
|
'SPHINXBUILD='+sphinx_dir+'/sphinx-build']), shell=True)
|
|
if retcode != 0:
|
|
os.chdir(dname)
|
|
msg = """Could not build the html docs for branch %s""" % branch
|
|
raise Exception(msg)
|
|
os.chdir(dname)
|
|
|
|
def build_pdf(branch):
|
|
"""
|
|
Changes into new_branch_dir and builds the docs using sphinx in the
|
|
BUILDENV virtualenv
|
|
"""
|
|
os.chdir(os.path.join(gitdname,'scikits','statsmodels','docs'))
|
|
sphinx_dir = os.path.join(virtual_dir,'bin')
|
|
retcode = subprocess.call(" ".join(['make','latexpdf',
|
|
'SPHINXBUILD='+sphinx_dir+'/sphinx-build']), shell=True)
|
|
if retcode != 0:
|
|
os.chdir(old_cwd)
|
|
msg = """Could not build the pdf docs for branch %s""" % branch
|
|
raise Exception(msg)
|
|
os.chdir(dname)
|
|
|
|
def upload_docs(branch):
|
|
if branch == 'master':
|
|
remote_dir = 'devel'
|
|
else:
|
|
remote_dir = ''
|
|
# old_cwd = os.getcwd()
|
|
os.chdir(os.path.join(gitdname,'scikits','statsmodels','docs'))
|
|
retcode = subprocess.call(['rsync', '-avPr' ,'-e ssh', 'build/html/',
|
|
'jseabold,statsmodels@web.sourceforge.net:htdocs/'+remote_dir])
|
|
if retcode != 0:
|
|
os.chdir(old_cwd)
|
|
msg = """Could not upload html to %s for branch %s""" % (remote_dir, branch)
|
|
raise Exception(msg)
|
|
os.chdir(dname)
|
|
|
|
#TODO: upload pdf is not tested
|
|
def upload_pdf(branch):
|
|
if branch == 'master':
|
|
remote_dir = 'devel'
|
|
else:
|
|
remote_dir = ''
|
|
os.chdir(os.path.join(dname, new_branch_dir,'scikits','statsmodels','docs'))
|
|
retcode = subprocess.call(['rsync', '-avPr', '-e ssh',
|
|
'build/latex/statsmodels.pdf',
|
|
'jseabold,statsmodels@web.sourceforge.net:htdocs/'+remote_dir+'pdf/'])
|
|
if retcode != 0:
|
|
os.chdir(old_cwd)
|
|
msg = """Could not upload pdf to %s for branch %s""" % (remote_dir+'/pdf',
|
|
branch)
|
|
raise Exception(msg)
|
|
os.chdir(dname)
|
|
|
|
|
|
def email_me(status='ok'):
|
|
if status == 'ok':
|
|
message = """
|
|
HTML Documentation uploaded successfully.
|
|
"""
|
|
subject = "Statsmodels HTML Build OK"
|
|
else:
|
|
message = status
|
|
subject = "Statsmodels HTML Build Failed"
|
|
|
|
msg = MIMEText(message)
|
|
msg['Subject'] = subject
|
|
msg['From'] = email_name
|
|
msg['To'] = email_name
|
|
|
|
server = smtplib.SMTP('smtp.gmail.com',587)
|
|
server.ehlo()
|
|
server.starttls()
|
|
server.ehlo()
|
|
server.login(email_name, gmail_pwd)
|
|
server.sendmail(email_name, to_email, msg.as_string())
|
|
server.close()
|
|
|
|
|
|
############### MAIN ###################
|
|
|
|
def main():
|
|
# get branch, install in virtualenv, build the docs, upload, and cleanup
|
|
msg = ''
|
|
for branch in branches:
|
|
try:
|
|
#create virtualenv
|
|
create_virtualenv()
|
|
create_update_gitdir()
|
|
install_branch(branch)
|
|
build_docs(branch)
|
|
upload_docs(branch)
|
|
# build_pdf(new_branch_dir)
|
|
# upload_pdf(branch, new_branch_dir)
|
|
except Exception as status:
|
|
msg += status.args[0] + '\n'
|
|
|
|
if msg == '': # if it doesn't something went wrong and was caught above
|
|
email_me()
|
|
else:
|
|
email_me(msg)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|