summaryrefslogtreecommitdiff
path: root/release.py
blob: f558fc3e91db3bd27c18e831f5602d0cd27c0c48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
"""
This script will walk a developer through the process of cutting a release.

Based on https://bitbucket.org/cherrypy/cherrypy/wiki/ReleaseProcess

To cut a release, simply invoke this script at the changeset to be released.
"""

from __future__ import print_function

import subprocess
import sys
import os
import platform
import shutil

VERSION='3.2.3'

if sys.version_info < (3,):
	input = raw_input

def get_next_version():
	print("The last release on this branch was {version}".format(
		version=VERSION))
	return input("What version are you releasing? ")

NEXT_VERSION = get_next_version()

files_with_versions = ('release.py', 'setup.py', 'cherrypy/__init__.py',
	'cherrypy/wsgiserver/wsgiserver2.py',
	'cherrypy/wsgiserver/wsgiserver3.py',
)

def check_status():
	"""
	Make sure there aren't outstanding changesets that are unpushed, maybe
	run the tests or ask the user if the tests are passing.
	"""
	print("You're about to release CherryPy {NEXT_VERSION}".format(
		**globals()))
	res = input('Have you run the tests with `nosetests -s ./` on '
		'Windows, Linux, and Mac on at least Python 2.4, 2.5, 2.7, and 3.2? '
		.format(**globals()))
	if not res.lower().startswith('y'):
		print("Please do that")
		raise SystemExit(1)

def bump_versions():
	"""
	Bump the versions in each of the places where it appears and commit.
	"""
	list(map(bump_version, files_with_versions))

	subprocess.check_call(['hg', 'ci', '-m',
		'Bumped to {NEXT_VERSION} in preparation for next '
		'release.'.format(**globals())])


def bump_version(filename):
	with open(filename, 'rb') as f:
		lines = [line.replace(VERSION, NEXT_VERSION) for line in f]
	with open(filename, 'wb') as f:
		f.writelines(lines)

def tag_release():
	"""
	Tag the release.
	"""
	subprocess.check_call(['hg', 'tag', NEXT_VERSION])

dist_commands = [
	[sys.executable, 'setup.py', 'sdist'],
	[sys.executable, 'setup.py', 'sdist', '--format=gztar'],
	[sys.executable, 'setup.py', 'bdist_wininst'],
]

def build():
	if os.path.isfile('MANIFEST'):
		os.remove('MANIFEST')
	if os.path.isdir('dist'):
		shutil.rmtree('dist')
	list(map(subprocess.check_call, dist_commands))

def push():
	"The build went well, so let's push the SCM changesets"
	subprocess.check_call(['hg', 'push'])

def publish():
	"""
	Publish the dists on PyPI
	"""
	try:
		upload_dist_commands = [cmd + ['register', 'upload']
			for cmd in dist_commands]
		list(map(subprocess.check_call, upload_dist_commands))
	except:
		print("Unable to upload the dist files. Ask in IRC for help access "
			"or assistance.")
		raise SystemExit(4)
	print('Distributions have been uploaded.')
	print('Please ask in IRC for others to help you test '
		'CherryPy {NEXT_VERSION}.'
		.format(**globals()))
	print("Please confirm that the distro installs properly "
		"with `easy_install CherryPy=={NEXT_VERSION}`.".format(**globals()))

def announce():
	print("Please change the Wiki: Home page (news), CherryPyDownload")
	print("Please announce the release on newsgroups, mailing lists, "
		"and IRC /topic.")

def main():
	assert sys.version_info >= (2, 6), ("Release script requires Python 2.6 "
		"or later.")
	assert platform.system() == 'Windows', ('You must release on Windows '
		'(to create Windows installers)')
	check_status()
	bump_versions()
	tag_release()
	build()
	push()
	publish()
	announce()

if __name__ == '__main__':
	main()