From dedaa2dc49701fa1a116bd460d5c2c748823d3cc Mon Sep 17 00:00:00 2001 From: Amir Mohammadi <183.amir@gmail.com> Date: Sat, 22 Oct 2016 19:09:49 +0200 Subject: [PATCH] Add bob, clean-up, add direct_push option for amir --- conda/batch-update-conda-forge.sh | 3 + gitlab/deploy.sh | 5 +- gitlab/update_feedstock.py | 117 ++++++++++++++++++++---------- 3 files changed, 86 insertions(+), 39 deletions(-) diff --git a/conda/batch-update-conda-forge.sh b/conda/batch-update-conda-forge.sh index 4a40d29..6e9c349 100755 --- a/conda/batch-update-conda-forge.sh +++ b/conda/batch-update-conda-forge.sh @@ -27,6 +27,9 @@ case $1 in 7) packages=("bob.learn.em" "bob.db.iris") ;; + 8) + packages=("bob") + ;; esac diff --git a/gitlab/deploy.sh b/gitlab/deploy.sh index 009d951..34b1ca2 100755 --- a/gitlab/deploy.sh +++ b/gitlab/deploy.sh @@ -21,7 +21,8 @@ fi unlock_pypirc -condaforge_packages=("bob.extension" \ +condaforge_packages=("bob" \ +"bob.extension" \ "bob.blitz" \ "bob.core" \ "bob.ip.draw" \ @@ -54,5 +55,5 @@ condaforge_packages=("bob.extension" \ "bob.db.iris") if contains_element ${CI_PROJECT_NAME} "${condaforge_packages[@]}"; then - run_cmd ${CONDA_FOLDER}/bin/python _ci/update_feedstock.py ${CI_PROJECT_NAME} --no-gui + run_cmd ${CONDA_FOLDER}/bin/python _ci/update_feedstock.py ${CI_PROJECT_NAME} fi diff --git a/gitlab/update_feedstock.py b/gitlab/update_feedstock.py index a220e9d..a0c1df5 100755 --- a/gitlab/update_feedstock.py +++ b/gitlab/update_feedstock.py @@ -1,7 +1,10 @@ #!/usr/bin/env python import hashlib -import urllib.request +try: + from urllib2 import urlopen +except ImportError: + from urllib.request import urlopen import requests import json try: @@ -21,22 +24,18 @@ def run_commands(*calls): """runs the given commands.""" # get all calls for call in calls: - if True or False: - print(' - ' + ' '.join(call)) - if not False: - # execute call - if subprocess.call(call): - # call failed (has non-zero exit status) - raise ValueError("Command '%s' failed; stopping" % ' '.join(call)) + print(' - ' + ' '.join(call)) + # execute call + if subprocess.call(call): + # call failed (has non-zero exit status) + raise ValueError("Command '%s' failed; stopping" % ' '.join(call)) def get_version(package, url_pattern=URL_PATTERN): """Return version of package on pypi.python.org using json.""" - # reader = codecs.getreader("utf-8") req = requests.get(url_pattern.format(package=package)) version = parse('0') if req.status_code == requests.codes.ok: - # j = json.loads(req.text.encode(req.encoding)) j = json.loads(req.text) if 'releases' in j: releases = j['releases'] @@ -48,7 +47,7 @@ def get_version(package, url_pattern=URL_PATTERN): def get_remote_md5_sum(url, max_file_size=100 * 1024 * 1024): - remote = urllib.request.urlopen(url) + remote = urlopen(url) hash = hashlib.md5() total_read = 0 @@ -58,16 +57,16 @@ def get_remote_md5_sum(url, max_file_size=100 * 1024 * 1024): if not data or total_read > max_file_size: break - hash.update(data) return hash.hexdigest() -def main(package, gui=True): +def main(package, direct_push=False): stable_version = get_version(package) print('latest stable version for {} is {}'.format(package, stable_version)) - url = 'https://pypi.io/packages/source/{0}/{1}/{1}-{2}.zip'.format(package[0], package, stable_version) + url = 'https://pypi.io/packages/source/{0}/{1}/{1}-{2}.zip'.format( + package[0], package, stable_version) try: md5 = get_remote_md5_sum(url) except Exception: @@ -77,14 +76,19 @@ def main(package, gui=True): print("\nClonning the feedstock") feedstock = os.path.join(temp_dir, '{}-feedstock'.format(package)) try: - run_commands(['git', 'clone', 'git@github.com:conda-forge/{}-feedstock.git'.format(package), feedstock]) + run_commands( + ['git', 'clone', + 'git@github.com:conda-forge/{}-feedstock.git'.format(package), + feedstock]) except ValueError: print("\nThe feedstock does not exist on conda-forge. Exiting ...") raise os.chdir(feedstock) - run_commands(['git', 'remote', 'add', 'bioidiap', 'git@github.com:bioidiap/{}-feedstock.git'.format(package)], - # ['git', 'fetch', '--all'], - ['git', 'checkout', '-b', stable_version]) + if not direct_push: + run_commands( + ['git', 'remote', 'add', 'bioidiap', + 'git@github.com:bioidiap/{}-feedstock.git'.format(package)], + ['git', 'checkout', '-b', stable_version]) # update meta.yaml with open('recipe/meta.yaml') as f: doc = f.read() @@ -92,26 +96,69 @@ def main(package, gui=True): build_number = '200' else: build_number = '0' - doc = re.sub(r'\{\s?%\s?set\s?version\s?=\s?".*"\s?%\s?\}', '{% set version = "' + str(stable_version) + '" %}', doc, count=1) - doc = re.sub(r'\s+number\:\s?[0-9]+', '\n number: ' + build_number, doc, count=1) - doc = re.sub(r'\{\s?%\s?set\s?build_number\s?=\s?"[0-9]+"\s?%\s?\}', '{% set build_number = "' + build_number + '" %}', doc, count=1) + doc = re.sub(r'\{\s?%\s?set\s?version\s?=\s?".*"\s?%\s?\}', + '{% set version = "' + str(stable_version) + '" %}', + doc, count=1) + doc = re.sub(r'\s+number\:\s?[0-9]+', '\n number: ' + build_number, doc, + count=1) + doc = re.sub(r'\{\s?%\s?set\s?build_number\s?=\s?"[0-9]+"\s?%\s?\}', + '{% set build_number = "' + build_number + '" %}', + doc, count=1) doc = re.sub(r'\s+md5\:.*', '\n md5: {}'.format(md5), doc, count=1) - doc = re.sub(r'\s+url\:.*', '\n url: {}'.format(url.replace(stable_version, '{{ version }}')), doc, count=1) - doc = re.sub(r'\s+home\:.*', '\n home: https://www.idiap.ch/software/bob/', doc, count=1) + doc = re.sub(r'\s+url\:.*', + '\n url: {}'.format( + url.replace(stable_version, '{{ version }}')), + doc, count=1) + doc = re.sub(r'\s+home\:.*', + '\n home: https://www.idiap.ch/software/bob/', + doc, count=1) + + if package == 'bob': + requrl = 'https://gitlab.idiap.ch/bob/bob/raw/master/requirements.txt' + remote = requests.get(requrl) + req = remote.content.decode() + req = '\n - '.join(req.replace('== ', '==').strip().split('\n')) + be_id = doc.find('bob.extension') + te_id = doc.find('test:\n', be_id) + template = '''{req} + + run: + - python + - {req} + +'''.format(req=req) + doc = doc[:be_id] + template + doc[te_id:] + with open('recipe/meta.yaml', 'w') as f: f.write(doc) - if gui: - browse = '--browse' - else: - browse = '' run_commands(['conda-smithy', 'rerender'], ['git', '--no-pager', 'diff'], - ['git', 'add', '-A'], - ['git', 'commit', '-am', 'Update to version {}'.format(stable_version)], - ['git', 'push', '--force', '--set-upstream', 'bioidiap', stable_version], - ['hub', 'pull-request', browse, '-b', 'conda-forge:master', '-h', 'bioidiap:{}'.format(stable_version), '-m', 'Update to version {}'.format(stable_version)]) - print('\nPlease create the pull request in the webpage that was openned.') + ['git', 'add', '-A']) + try: + run_commands(['git', 'commit', '-am', + 'Fix badges [skip ci]']) + # 'Update to version {}'.format(stable_version)]) + except ValueError: + print('Feedstock is already uptodate, skipping.') + return + if direct_push: + print(feedstock) + try: + answer = raw_input('Would you like to push directly to master?').lower() + except Exception: + answer = input('Would you like to push directly to master?').lower() + if answer.startswith('y') or answer == '': + run_commands(['git', 'push']) + print('See the changes at:\n' + 'https://github.com/conda-forge/' + '{}-feedstock/commits/master\n\n'.format(package)) + else: + run_commands(['git', 'push', '--force', '--set-upstream', + 'bioidiap', stable_version], + ['hub', 'pull-request', '-b', 'conda-forge:master', + '-h', 'bioidiap:{}'.format(stable_version), + '-m', 'Update to version {}'.format(stable_version)]) finally: shutil.rmtree(temp_dir) @@ -119,8 +166,4 @@ def main(package, gui=True): if __name__ == '__main__': import sys pkg = sys.argv[1] - if len(sys.argv) > 2: - gui = False - else: - gui = True - main(pkg, gui) + main(pkg) -- GitLab