diff --git a/conda/batch-update-bob.sh b/conda/batch-update-bob.sh new file mode 100755 index 0000000000000000000000000000000000000000..85954abede80dfd7559b1849901cee3cc1c2f5ea --- /dev/null +++ b/conda/batch-update-bob.sh @@ -0,0 +1,28 @@ +#!/bin/bash + + + +set -ex + +case $1 in + 1) + packages = ("bob.extension");; + 2) + packages = ("bob.blitz");; + 3) + packages = ("bob.core" "bob.ip.draw");; + 4) + packages = ("bob.io.base" "bob.sp" "bob.math");; + 5) + packages = ("bob.ap" "bob.measure" "bob.db.base" "bob.io.image" "bob.io.video" "bob.io.matlab" "bob.ip.base" "bob.ip.color" "bob.ip.gabor" "bob.learn.activation" "bob.learn.libsvm" "bob.learn.boosting");; + 6) + packages = ("bob.io.audio" "bob.learn.linear" "bob.learn.mlp" "bob.db.wine" "bob.db.mnist" "bob.db.atnt" "bob.ip.flandmark" "bob.ip.facedetect" "bob.ip.optflow.hornschunck" "bob.ip.optflow.liu");; + 7) + packages = ("bob.learn.em" "bob.db.iris");; +esac + + +for pkg in "${packages[@]}" +do + python update_feedstock.py $pkg +done diff --git a/conda/update_feedstock.py b/conda/update_feedstock.py new file mode 100755 index 0000000000000000000000000000000000000000..e76f624e4f9c9f3617fbc432a427a56368f611bd --- /dev/null +++ b/conda/update_feedstock.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python + +import hashlib +import urllib.request +import requests +import json +try: + from packaging.version import parse +except ImportError: + from pip._vendor.packaging.version import parse +import re +import tempfile +import shutil +import os +import subprocess + +URL_PATTERN = 'https://pypi.python.org/pypi/{package}/json' + + +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)) + + +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'] + for release in releases: + ver = parse(release) + if not ver.is_prerelease: + version = max(version, ver) + return str(version) + + +def get_remote_md5_sum(url, max_file_size=100 * 1024 * 1024): + remote = urllib.request.urlopen(url) + hash = hashlib.md5() + + total_read = 0 + while True: + data = remote.read(4096) + total_read += 4096 + + if not data or total_read > max_file_size: + break + + hash.update(data) + + return hash.hexdigest() + + +def main(package): + 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) + try: + md5 = get_remote_md5_sum(url) + except Exception: + raise + temp_dir = tempfile.mkdtemp() + try: + print("\nClonning the feedstock") + feedstock = os.path.join(temp_dir, 'feedstock') + try: + 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]) + # update meta.yaml + with open('recipe/meta.yaml') as f: + doc = f.read() + if package == 'bob.math': + 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+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) + with open('recipe/meta.yaml', 'w') as f: + f.write(doc) + run_commands(['conda-smithy', 'rerender'], + ['git', '--no-pager', 'diff'], + ['git', 'commit', '-am', 'Updating to version {}'.format(stable_version)], + ['git', 'push', '--force', '--set-upstream', 'bioidiap', stable_version], + ['firefox', 'https://github.com/conda-forge/{}-feedstock/compare/master...bioidiap:{}?expand=1'.format(package, stable_version)]) + print('\nPlease create the pull request in the webpage that was openned.') + finally: + shutil.rmtree(temp_dir) + + +if __name__ == '__main__': + import sys + main(*sys.argv[1:])