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