diff --git a/conda/batch-update-conda-forge.sh b/conda/batch-update-conda-forge.sh deleted file mode 100755 index 6e9c349cf05b3c547bd21a17c96612acffd6d9bf..0000000000000000000000000000000000000000 --- a/conda/batch-update-conda-forge.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# you need (hub)[https://github.com/github/hub] and (gh)[https://github.com/node-gh/gh] - - -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") - ;; - 8) - packages=("bob") - ;; -esac - - -for pkg in "${packages[@]}" -do - gh re --fork $pkg-feedstock --user conda-forge --organization bioidiap || true - python ../gitlab/update_feedstock.py $pkg -done diff --git a/gitlab/update_feedstock.py b/gitlab/update_feedstock.py deleted file mode 100755 index 546bfb0e1068caabd9270ff310a042eec498165e..0000000000000000000000000000000000000000 --- a/gitlab/update_feedstock.py +++ /dev/null @@ -1,264 +0,0 @@ -#!/usr/bin/env python - -import hashlib -try: - from urllib2 import urlopen -except ImportError: - from urllib.request import urlopen -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: - 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.""" - req = requests.get(url_pattern.format(package=package)) - version = parse('0') - if req.status_code == requests.codes.ok: - 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 = 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() - - -class Gitlab(object): - """A class that wraps Gitlab API using curl""" - - def __init__(self, token): - super(Gitlab, self).__init__() - self.token = token - self.base_url = 'https://gitlab.idiap.ch/api/v3/' - self.projects_url = self.base_url + 'projects/' - - def get_project(self, project_name, namespace='bob'): - cmd = ["curl", "--header", - "PRIVATE-TOKEN: {}".format(self.token), - self.base_url + "projects/{}%2F{}".format( - namespace, project_name)] - pipeline = subprocess.check_output(cmd) - return json.loads(pipeline.decode()) - - def create_pipeline(self, project_id): - cmd = ["curl", "--request", "POST", "--header", - "PRIVATE-TOKEN: {}".format(self.token), - self.base_url + "projects/{}/pipeline?ref=master".format( - project_id)] - pipeline = subprocess.check_output(cmd) - return json.loads(pipeline.decode()) - - def get_pipeline(self, project_id, pipeline_id): - cmd = ["curl", "--header", - "PRIVATE-TOKEN: {}".format(self.token), - self.base_url + "projects/{}/pipelines/{}".format( - project_id, pipeline_id)] - pipeline = subprocess.check_output(cmd) - return json.loads(pipeline.decode()) - - def create_merge_request(self, project_id, source_branch, target_branch, - title, assignee_id='', description='', - target_project_id='', labels='', milestone_id='', - remove_source_branch=''): - url = "projects/{}/merge_requests?" - url += "&".join(['source_branch={}', 'target_branch={}', 'title={}', - 'assignee_id={}', 'description={}', - 'target_project_id={}', 'labels={}', - 'milestone_id={}', 'remove_source_branch={}']) - url = url.format(project_id, source_branch, target_branch, title, - assignee_id, description, target_project_id, labels, - milestone_id, remove_source_branch) - cmd = ["curl", "--request", "POST", "--header", - "PRIVATE-TOKEN: {}".format(self.token), - self.base_url + url] - pipeline = subprocess.check_output(cmd) - return json.loads(pipeline.decode()) - - def accept_merge_request(self, project_id, mergerequest_id, - merge_commit_message='', - should_remove_source_branch='', - merge_when_pipeline_succeeds='', sha=''): - """ - Update an existing merge request. - """ - - url = "projects/{}/merge_request/{}/merge?" - url += "&".join([ - 'merge_commit_message={}', - 'should_remove_source_branch={}', - 'merge_when_pipeline_succeeds={}', - 'sha={}', - ]) - url = url.format(project_id, mergerequest_id, merge_commit_message, - should_remove_source_branch, - merge_when_pipeline_succeeds, - sha) - cmd = ["curl", "--request", "PUT", "--header", - "PRIVATE-TOKEN: {}".format(self.token), - self.base_url + url] - pipeline = subprocess.check_output(cmd) - try: - return json.loads(pipeline.decode()) - except Exception: - return False - - -def update_meta(meta_path, 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) - md5 = get_remote_md5_sum(url) - with open(meta_path) as f: - doc = f.read() - 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) - doc = doc.replace('Modified BSD License (3-clause)', 'BSD 3-Clause') - - if package == 'bob': - requrl = 'https://gitlab.idiap.ch/bob/bob/blob/v{}/requirements.txt' - requrl = requrl.format(stable_version) - 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 - - numpy x.x - - {req} - -'''.format(req=req) - doc = doc[:be_id] + template + doc[te_id:] - - with open(meta_path, 'w') as f: - f.write(doc) - - return stable_version - - -def main(package, subfolder='recipes', direct_push=False): - temp_dir = tempfile.mkdtemp() - try: - print("\nClonning bob.conda") - root = os.path.join(temp_dir, 'bob.conda') - feedstock = os.path.join(root, subfolder, package) - try: - run_commands( - ['git', 'clone', - 'git@gitlab.idiap.ch:bob/bob.conda.git', - root]) - except ValueError: - print("\nFailed to clone `bob.conda`, Exiting ...") - raise - os.chdir(feedstock) - # update meta.yaml - meta_path = 'meta.yaml' - stable_version = update_meta(meta_path, package) - - branch_name = '{}-{}'.format(package, stable_version) - if not direct_push: - run_commands( - ['git', 'checkout', '-b', branch_name]) - - run_commands(['git', '--no-pager', 'diff'], - ['git', 'config', 'user.email', - os.environ.get('GITLAB_USER_EMAIL')], - ['git', 'config', 'user.name', - os.environ.get('GITLAB_USER_ID')], - ['git', 'add', '-A']) - try: - run_commands(['git', 'commit', '-am', - '[{}] Update to version {}'.format(package, - 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: - origin_url = 'https://idiapbbb:{}@gitlab.idiap.ch/bob/bob.conda.git' - origin_url = origin_url.format(os.environ.get('IDIAPBBB_PASS')) - subprocess.call(['git', 'remote', 'set-url', 'origin', origin_url]) - run_commands(['git', 'push', '--quiet', '--force', '--set-upstream', - 'origin', branch_name]) - gitlab = Gitlab(os.environ.get('GITLAB_API_TOKEN')) - project_id = gitlab.get_project('bob.conda')['id'] - title = 'Update-to-{}'.format(branch_name) - mr = gitlab.create_merge_request(project_id, branch_name, 'master', - title, remove_source_branch='true') - # gitlab.accept_merge_request( - # project_id, mr['id'], merge_when_pipeline_succeeds='true') - finally: - shutil.rmtree(temp_dir) - - -if __name__ == '__main__': - import sys - main(*sys.argv[1:])