From 7af1a75b26ecdf1c7932169f2904a74db50c5b5d Mon Sep 17 00:00:00 2001 From: James Vega Date: Mon, 2 May 2005 17:39:12 +0000 Subject: [PATCH] Add release.py, updated to use Darcs. --- sandbox/release.py | 145 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 sandbox/release.py diff --git a/sandbox/release.py b/sandbox/release.py new file mode 100644 index 000000000..b0bc2cf96 --- /dev/null +++ b/sandbox/release.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python + +import os +import re +import sys +import ftplib +import shutil + +def firstLines(filename, n): + fd = file(filename) + lines = [] + while n: + n -= 1 + lines.append(fd.readline().rstrip('\r\n')) + return lines + +def firstLine(filename): + return firstLines(filename, 1)[0] + +def error(s): + sys.stderr.write(s+'\n') + sys.exit(-1) + +def system(sh, errmsg=None): + if errmsg is None: + errmsg = repr(sh) + ret = os.system(sh) + if ret: + error(errmsg + ' (error code: %s)' % ret) + +if __name__ == '__main__': + if len(sys.argv) < 3: + error('Usage: %s \n' % sys.argv[0]) + + print 'Check version string for validity.' + (u, v) = sys.argv[1:] + if not re.match(r'^\d+\.\d+\.\d+\w*$', v): + error('Invalid version string: ' + 'must be of the form MAJOR.MINOR.PATCHLEVEL.') + + if os.path.exists('supybot'): + error('I need to make the directory "supybot" but it already exists.' + ' Change to an appropriate directory or rmeove the supybot ' + 'directory to continue.') + print 'Checking out fresh tree from Darcs.' + system('darcs get http://source.supybot.com/supybot/') + os.chdir('supybot') + + print 'Checking RELNOTES version line.' + if firstLine('RELNOTES') != 'Version %s' % v: + error('Invalid first line in RELNOTES.') + + print 'Checking ChangeLog version line.' + (first, _, third) = firstLines('ChangeLog', 3) + if not re.match(r'^200\d-\d{2}-\d{2}\s+\w+.*<\S+@\S+>$', first): + error('Invalid first line in ChangeLog.') + if not re.match(r'^\t\* Version %s!$' % v, third): + error('Invalid third line in ChangeLog.') + + print 'Updating version in version files.' + versionFiles = ('src/conf.py', 'scripts/supybot', 'setup.py') + for fn in versionFiles: + sh = 'perl -pi -e "s/^version\s*=.*/version = \'%s\'/" %s' % (v, fn) + system(sh, 'Error changing version in %s' % fn) + system('darcs record -m "Updated to %s." %s' % (v, ' '.join(versionFiles))) + + print 'Tagging release.' + system('darcs tag -m release-%s' % v.replace('.', '_')) + + print 'Removing test, sandbox, and _darcs.' + shutil.rmtree('test') + shutil.rmtree('sandbox') + system('find . -name _darcs | xargs rm -rf') + + os.chdir('..') + dirname = 'Supybot-%s' % v + print 'Renaming directory to %s.' % dirname + if os.path.exists(dirname): + shutil.rmtree(dirname) + shutil.move('supybot', dirname) + + print 'Creating tarball (gzip).' + system('tar czvf Supybot-%s.tar.gz %s' % (v, dirname)) + print 'Creating tarball (bzip2).' + system('tar cjvf Supybot-%s.tar.bz2 %s' % (v, dirname)) + print 'Creating zip.' + system('zip -r Supybot-%s.zip %s' % (v, dirname)) + + print 'Uploading package files to upload.sf.net.' + ftp = ftplib.FTP('upload.sf.net') + ftp.login() + ftp.cwd('incoming') + for filename in ['Supybot-%s.tar.gz', + 'Supybot-%s.tar.bz2', + 'Supybot-%s.zip']: + filename = filename % v + print 'Uploading %s to SF.net.' % filename + ftp.storbinary('STOR %s' % filename, file(filename)) + ftp.close() + + print 'Committing %s+darcs to version files.' % v + for fn in versionFiles: + sh = 'perl -pi -e "s/^version\s*=.*/version = \'%s\'/" %s' % \ + (v + '+cvs', fn) + system(sh, 'Error changing version in %s' % fn) + system('darcs record -m "Updated to %s." %s' % (v, ' '.join(versionFiles))) + + print 'Copying new version.txt over to project webserver.' + system('echo %s > version.txt' % v) + system('scp version.txt %s@shell.sf.net:/home/groups/s/su/supybot/htdocs'%u) + +# print 'Generating documentation.' +# # docFiles is in the format {directory: files} +# docFiles = {'.': ('README', 'INSTALL', 'ChangeLog'), +# 'docs': ('config.html', 'CAPABILITIES', 'commands.html', +# 'CONFIGURATION', 'FAQ', 'GETTING_STARTED', +# 'INTERFACES', 'OVERVIEW', 'PLUGIN-EXAMPLE', +# 'plugins', 'plugins.html', 'STYLE'), +# } +# system('python scripts/supybot-plugin-doc') +# pwd = os.getcwd() +# os.chmod('docs/plugins', 0775) +# sh = 'tar rf %s/docs.tar %%s' % pwd +# for (dir, L) in docFiles.iteritems(): +# os.chdir(os.path.join(pwd, dir)) +# system(sh % ' '.join(L)) +# os.chdir(pwd) +# system('bzip2 docs.tar') +# +# print 'Uploading documentation to webspace.' +# system('scp docs.tar.bz2 %s@supybot.sf.net:/home/groups/s/su/supybot' +# '/htdocs/docs/.' % u) +# system('ssh %s@supybot.sf.net "cd /home/groups/s/su/supybot/htdocs/docs; ' +# 'tar jxf docs.tar.bz2"' % u) +# +# print 'Cleaning up generated documentation.' +# shutil.rmtree('docs/plugins') +# configFiles = ('docs/config.html', 'docs/plugins.html', +# 'docs/commands.html', 'docs.tar.bz2', 'test-conf', +# 'test-data', 'test-logs', 'tmp') +# for fn in configFiles: +# os.remove(fn) + +# This is the part where we do our release on Freshmeat using XMLRPC and +# ESR's software to do it: http://freshmeat.net/p/freshmeat-submit/