mirror of
https://github.com/powerline/powerline.git
synced 2025-07-06 21:44:55 +02:00
Reasoning: I am going to add man pages support to the live ebuild, but it does not make sense to add this to the 1.0 ebuild previously used as the base. Since new features will likely continue to appear in the live ebuild powerline-release script was modified to do the right thing under new circumstances.
202 lines
6.8 KiB
Python
Executable File
202 lines
6.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# vim:fileencoding=utf-8:noet
|
|
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
|
|
|
import argparse
|
|
import codecs
|
|
import os
|
|
import re
|
|
|
|
from subprocess import check_output, check_call
|
|
from getpass import getpass
|
|
|
|
from github import Github
|
|
|
|
|
|
OVERLAY_NAME = 'raiagent'
|
|
OVERLAY = 'leycec/' + OVERLAY_NAME
|
|
OVERLAY_BRANCH_FORMAT = 'powerline-release-{0}'
|
|
|
|
|
|
def parse_version(s):
|
|
if s == ('+' * len(s)):
|
|
try:
|
|
last_version = next(iter(sorted([
|
|
tuple(map(int, tag.split('.')))
|
|
for tag in check_output(['git', 'tag', '-l', '[0-9]*.*']).split('\n')[:-1]
|
|
], reverse=True)))
|
|
except StopIteration:
|
|
raise ValueError('No existing versions found')
|
|
|
|
version = []
|
|
for i in range(len(s) - 1):
|
|
try:
|
|
version.append(last_version[i])
|
|
except IndexError:
|
|
version.append(0)
|
|
|
|
try:
|
|
version.append(last_version[len(s) - 1] + 1)
|
|
except IndexError:
|
|
version.append(1)
|
|
|
|
if len(version) == 1:
|
|
version.append(0)
|
|
|
|
return tuple(version)
|
|
else:
|
|
return tuple(map(int, s.split('.')))
|
|
|
|
|
|
def merge(version_string, rev, **kwargs):
|
|
check_call(['git', 'checkout', 'master'])
|
|
check_call(['git', 'merge', '--no-ff', '--no-commit', '--log', rev])
|
|
|
|
with codecs.open('.setup.py.new', 'w', encoding='utf-8') as NS:
|
|
with codecs.open('setup.py', 'r', encoding='utf-8') as OS:
|
|
for line in OS:
|
|
if line.startswith('\tversion='):
|
|
line = '\tversion=\'' + version_string + '\',\n'
|
|
elif 'Development Status' in line:
|
|
line = '\t\t\'Development Status :: 5 - Production/Stable\',\n'
|
|
NS.write(line)
|
|
|
|
os.unlink('setup.py')
|
|
os.rename('.setup.py.new', 'setup.py')
|
|
check_call(['git', 'add', 'setup.py'])
|
|
|
|
check_call(['git', 'commit'])
|
|
check_call(['git', 'tag', '-m', 'Release ' + version_string, '-a', version_string])
|
|
|
|
|
|
def push(version_string, **kwargs):
|
|
check_call(['git', 'push', 'upstream', 'master'])
|
|
check_call(['git', 'push', 'upstream', version_string])
|
|
|
|
|
|
def upload(**args):
|
|
check_call(['python', 'setup.py', 'sdist', 'upload'])
|
|
check_call(['python', 'setup.py', 'upload_docs'])
|
|
|
|
|
|
gh = None
|
|
|
|
|
|
def get_gh(user, password):
|
|
global gh
|
|
if not gh:
|
|
gh = Github(user, password)
|
|
return gh
|
|
|
|
|
|
def create_ebuilds(version_string, overlay, user, **kwargs):
|
|
overlay_url = 'git://github.com/' + OVERLAY
|
|
if not os.path.isdir(overlay):
|
|
check_call(['git', 'clone', overlay_url, overlay])
|
|
check_call(['git', 'checkout', 'master'], cwd=overlay)
|
|
check_call(['git', 'pull', '--ff-only', overlay_url, 'master'], cwd=overlay)
|
|
branch = OVERLAY_BRANCH_FORMAT.format(version_string)
|
|
check_call(['git', 'branch', branch], cwd=overlay)
|
|
check_call(['git', 'checkout', branch], cwd=overlay)
|
|
os.environ['DISTDIR'] = '/tmp/powerline-distfiles'
|
|
if not os.path.isdir(os.environ['DISTDIR']):
|
|
os.mkdir(os.environ['DISTDIR'])
|
|
new_files = []
|
|
for category, pn in (
|
|
('app-misc', 'powerline'),
|
|
('app-vim', 'powerline-vim'),
|
|
):
|
|
pdir = os.path.join(overlay, category, pn)
|
|
live_ebuild = None
|
|
for ebuild in os.listdir(pdir):
|
|
if ebuild.endswith('.ebuild') and '9999' in ebuild:
|
|
live_ebuild = os.path.join(pdir, ebuild)
|
|
break
|
|
assert(live_ebuild)
|
|
vcur = os.path.join(pdir, '{0}-{1}.ebuild'.format(pn, version_string))
|
|
with open(live_ebuild) as LEF:
|
|
with open(vcur, 'w') as F:
|
|
dropnext = False
|
|
for line in LEF:
|
|
if line.startswith('EGIT'):
|
|
# Drop all EGIT_… and the next empty line
|
|
dropnext = True
|
|
next_re = re.compile('^$')
|
|
continue
|
|
if dropnext:
|
|
assert(next_re.match(line))
|
|
dropnext = False
|
|
continue
|
|
if line.startswith('# Note the lack of an assignment to ${S}'):
|
|
next_re = re.compile('^#')
|
|
dropnext = True
|
|
line = 'S="${WORKDIR}/${MY_P}"\n'
|
|
if line.startswith('inherit'):
|
|
line = line.replace(' git-r3', '')
|
|
line += '\n'
|
|
line += 'MY_PN="powerline-status"\n'
|
|
line += 'MY_P="${MY_PN}-${PV}"'
|
|
line += '\n'
|
|
elif line.startswith('HOMEPAGE'):
|
|
line += 'SRC_URI="mirror://pypi/p/${MY_PN}/${MY_P}.tar.gz"\n'
|
|
elif line.startswith('KEYWORDS'):
|
|
line = 'KEYWORDS="~amd64 ~ppc ~x86 ~x86-fbsd"\n'
|
|
F.write(line)
|
|
new_files.append(vcur)
|
|
check_call(['ebuild', vcur, 'manifest'])
|
|
new_files.append(os.path.join(pdir, 'Manifest'))
|
|
check_call(['git', 'add', '--'] + new_files, cwd=overlay)
|
|
check_call(['git', 'commit'] + new_files + ['-m', 'powerline*: Release {0}'.format(version_string)],
|
|
cwd=overlay)
|
|
check_call(['git', 'push', 'git@github.com:{0}/{1}'.format(user, OVERLAY_NAME), branch], cwd=overlay)
|
|
|
|
|
|
def update_overlay(version_string, user, password, **kwargs):
|
|
gh = get_gh(user, password)
|
|
overlay = gh.get_repo(OVERLAY)
|
|
overlay.create_pull(
|
|
title='New powerline version: ' + version_string,
|
|
body='Add ebuilds for new powerline version\n\n---\n\nCreated automatically by release script',
|
|
base='master',
|
|
head=user + ':' + OVERLAY_BRANCH_FORMAT.format(version_string),
|
|
)
|
|
|
|
|
|
stages = (
|
|
('merge', merge),
|
|
('push', push),
|
|
('upload', upload),
|
|
('create_ebuilds', create_ebuilds),
|
|
('update_overlay', update_overlay),
|
|
)
|
|
|
|
|
|
def create_release(version, user, password=None, run_stages=None, **kwargs):
|
|
version_string = '.'.join((str(v) for v in version))
|
|
if not password:
|
|
password = getpass('Password for {0}: '.format(user))
|
|
for stname, stfunc in stages:
|
|
if run_stages is None or stname in run_stages:
|
|
stfunc(version_string=version_string, user=user, password=password, **kwargs)
|
|
|
|
|
|
p = argparse.ArgumentParser(description='Powerline release script')
|
|
p.add_argument('-u', '--user', type=str, metavar='USER', help='Github username.', required=True)
|
|
p.add_argument('-v', '--version', type=parse_version, metavar='VERSION', help='Use given version for the release. If version contains only `+\' signs then it will increase latest version number: one `+\' increases major version number (e.g. 1.2.3 -> 2.0), `++\' increases minor version number (e.g. 1.2.3 -> 1.3), `+++\' increases patch level (e.g. 1.2.3 -> 1.2.4). Defaults to `+++\'.', default='+++')
|
|
p.add_argument('-r', '--rev', metavar='COMMIT', help='Use given revision for the release. Defaults to `develop\'.', default='develop')
|
|
p.add_argument('-s', '--stages', action='append', metavar='STAGE', help='Only run one of the given stages (default to all).', choices=tuple((stname for stname, stfunc in stages)))
|
|
p.add_argument('-p', '--password', type=str, metavar='PASS', help='Github password. You will be prompted if it is not supplied.')
|
|
p.add_argument('-o', '--overlay', type=str, metavar='PATH', help='Location of the local clone of the {0} overlay. If provided directory does not exist it will be created by “git clone”. Defaults to /tmp/powerline-{0}.'.format(OVERLAY_NAME), default='/tmp/powerline-' + OVERLAY_NAME)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
args = p.parse_args()
|
|
create_release(
|
|
version=args.version,
|
|
rev=args.rev,
|
|
user=args.user,
|
|
password=args.password,
|
|
overlay=args.overlay,
|
|
run_stages=args.stages,
|
|
)
|