diff --git a/.travis.yml b/.travis.yml index 2981634..6601dc1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,10 @@ # This file was generated automatically from conda-smithy. To update this configuration, -# update the conda-forge.yaml and/or the recipe/meta.yaml. +# update the conda-forge.yml and/or the recipe/meta.yaml. -language: objective-c +language: generic + +os: osx +osx_image: beta-xcode6.1 env: matrix: @@ -22,22 +25,18 @@ before_install: install: - | - MINICONDA_URL="http://repo.continuum.io/miniconda" + MINICONDA_URL="https://repo.continuum.io/miniconda" MINICONDA_FILE="Miniconda3-latest-MacOSX-x86_64.sh" - curl -O "${MINICONDA_URL}/${MINICONDA_FILE}" + curl -L -O "${MINICONDA_URL}/${MINICONDA_FILE}" bash $MINICONDA_FILE -b - export PATH=/Users/travis/miniconda3/bin:$PATH - - conda config --set show_channel_urls true - conda update --yes conda - conda install --yes conda-build=1.20.0 jinja2 anaconda-client + source /Users/travis/miniconda3/bin/activate root conda config --add channels conda-forge - + conda config --set show_channel_urls true + conda install --yes --quiet conda-forge-build-setup + source run_conda_forge_build_setup script: - conda build ./recipe -after_success: - - - ./ci_support/upload_or_check_non_existence.py ./recipe conda-forge --channel=main + - upload_or_check_non_existence ./recipe conda-forge --channel=main diff --git a/README.md b/README.md index fc89a06..f85cdd9 100644 --- a/README.md +++ b/README.md @@ -14,19 +14,19 @@ Summary: Paegan-Transport - The parallellized Langragian transport model for Net Installing paegan-transport =========================== -Installing paegan-transport from the conda-forge channel can be achieved by adding conda-forge to your channels with: +Installing `paegan-transport` from the `conda-forge` channel can be achieved by adding `conda-forge` to your channels with: ``` conda config --add channels conda-forge ``` -Once the conda-forge channel has been enabled, paegan-transport can be installed with: +Once the `conda-forge` channel has been enabled, `paegan-transport` can be installed with: ``` conda install paegan-transport ``` -It is possible to list all of the versions of paegan-transport available on your platform with: +It is possible to list all of the versions of `paegan-transport` available on your platform with: ``` conda search paegan-transport --channel conda-forge @@ -38,7 +38,7 @@ About conda-forge conda-forge is a community-led conda channel of installable packages. In order to provide high-quality builds, the process has been automated into the -conda-forge GitHub organization. The conda-forge organization contains one repository +conda-forge GitHub organization. The conda-forge organization contains one repository for each of the installable packages. Such a repository is known as a *feedstock*. A feedstock is made up of a conda recipe (the instructions on what and how to build @@ -51,8 +51,8 @@ packages to the [conda-forge](https://anaconda.org/conda-forge) To manage the continuous integration and simplify feedstock maintenance [conda-smithy](http://github.com/conda-forge/conda-smithy) has been developed. -Using the ``conda-forge.yml`` within this repository, it is possible to regenerate all of -this feedstock's supporting files (e.g. the CI configuration files) with ``conda smithy regenerate``. +Using the ``conda-forge.yml`` within this repository, it is possible to re-render all of +this feedstock's supporting files (e.g. the CI configuration files) with ``conda smithy rerender``. Terminology @@ -70,8 +70,8 @@ Terminology Current build status ==================== -Linux: [![Circle CI](https://circleci.com/gh/conda-forge/paegan-transport-feedstock.svg?style=svg)](https://circleci.com/gh/conda-forge/paegan-transport-feedstock) -OSX: [![TravisCI](https://travis-ci.org/conda-forge/paegan-transport-feedstock.svg?branch=master)](https://travis-ci.org/conda-forge/paegan-transport-feedstock) +Linux: [![Circle CI](https://circleci.com/gh/conda-forge/paegan-transport-feedstock.svg?style=shield)](https://circleci.com/gh/conda-forge/paegan-transport-feedstock) +OSX: [![TravisCI](https://travis-ci.org/conda-forge/paegan-transport-feedstock.svg?branch=master)](https://travis-ci.org/conda-forge/paegan-transport-feedstock) Windows: [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/conda-forge/paegan-transport-feedstock?svg=True)](https://ci.appveyor.com/project/conda-forge/paegan-transport-feedstock/branch/master) Current release info @@ -83,16 +83,21 @@ Downloads: [![Anaconda-Server Badge](https://anaconda.org/conda-forge/paegan-tra Updating paegan-transport-feedstock =================================== -If you would like to improve the paegan-transport recipe, please take the normal -route of forking this repository and submitting a PR. Upon submission, your changes will -be run on the appropriate platforms to give the reviewer an opportunity to confirm that the -changes result in a successful build. Once merged, the recipe will be re-built and uploaded -automatically to the conda-forge channel, whereupon they will be available for everybody to -install and use. +If you would like to improve the paegan-transport recipe or build a new +package version, please fork this repository and submit a PR. Upon submission, +your changes will be run on the appropriate platforms to give the reviewer an +opportunity to confirm that the changes result in a successful build. Once +merged, the recipe will be re-built and uploaded automatically to the +`conda-forge` channel, whereupon the built conda packages will be available for +everybody to install and use from the `conda-forge` channel. +Note that all branches in the conda-forge/paegan-transport-feedstock are +immediately built and any created packages are uploaded, so PRs should be based +on branches in forks and branches in the main repository should only be used to +build distinct package versions. In order to produce a uniquely identifiable distribution: * If the version of a package **is not** being increased, please add or increase - the [``build/number``](http://conda.pydata.org/docs/building/meta-yaml.html#build-number-and-string). + the [``build/number``](http://conda.pydata.org/docs/building/meta-yaml.html#build-number-and-string). * If the version of a package **is** being increased, please remember to return the [``build/number``](http://conda.pydata.org/docs/building/meta-yaml.html#build-number-and-string) back to 0. diff --git a/appveyor.yml b/appveyor.yml index fbfa9d3..4f8f1a0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,11 +1,9 @@ # This file was automatically generated by conda-smithy. To update a component of this -# file, make changes to conda-forge.yaml and/or recipe/meta.yaml, and run -# "conda-smithy regenerate". +# file, make changes to conda-forge.yml and/or recipe/meta.yaml, and run +# "conda smithy rerender". environment: - CONDA_INSTALL_LOCN: "C:\\conda" - # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the # /E:ON and /V:ON options are not enabled in the batch script intepreter # See: http://stackoverflow.com/a/13751649/163740 @@ -14,6 +12,8 @@ environment: # We set a default Python version for the miniconda that is to be installed. This can be # overridden in the matrix definition where appropriate. CONDA_PY: "27" + CONDA_INSTALL_LOCN: "C:\\Miniconda-x64" + BINSTAR_TOKEN: # The BINSTAR_TOKEN secure variable. This is defined canonically in conda-forge.yml. secure: MP4hZYylDyUWEsrt3u3cod2sbFeRwUziH02mvQOdbjsTO/l1yIxDkP/76rSIjcGC @@ -21,21 +21,27 @@ environment: matrix: - TARGET_ARCH: x86 CONDA_PY: 27 + CONDA_INSTALL_LOCN: C:\\Miniconda - TARGET_ARCH: x64 CONDA_PY: 27 + CONDA_INSTALL_LOCN: C:\\Miniconda-x64 - TARGET_ARCH: x86 CONDA_PY: 34 + CONDA_INSTALL_LOCN: C:\\Miniconda3 - TARGET_ARCH: x64 CONDA_PY: 34 + CONDA_INSTALL_LOCN: C:\\Miniconda3-x64 - TARGET_ARCH: x86 CONDA_PY: 35 + CONDA_INSTALL_LOCN: C:\\Miniconda35 - TARGET_ARCH: x64 CONDA_PY: 35 + CONDA_INSTALL_LOCN: C:\\Miniconda35-x64 # We always use a 64-bit machine, but can build x86 distributions @@ -56,20 +62,27 @@ install: # Cywing's git breaks conda-build. (See https://github.com/conda-forge/conda-smithy-feedstock/pull/2.) - cmd: rmdir C:\cygwin /s /q - - appveyor DownloadFile "https://raw.githubusercontent.com/pelson/Obvious-CI/master/bootstrap-obvious-ci-and-miniconda.py" - - cmd: python bootstrap-obvious-ci-and-miniconda.py %CONDA_INSTALL_LOCN% %TARGET_ARCH% %CONDA_PY:~0,1% --without-obvci - - cmd: set PATH=%CONDA_INSTALL_LOCN%;%CONDA_INSTALL_LOCN%\scripts;%PATH% - - cmd: set PYTHONUNBUFFERED=1 + # Add our channels. + - cmd: set "OLDPATH=%PATH%" + - cmd: set "PATH=%CONDA_INSTALL_LOCN%\\Scripts;%CONDA_INSTALL_LOCN%\\Library\\bin;%PATH%" - cmd: conda config --set show_channel_urls true - - cmd: conda install -c pelson/channel/development --yes --quiet obvious-ci - cmd: conda config --add channels conda-forge - - cmd: conda info - - cmd: conda install -n root --quiet --yes conda-build anaconda-client jinja2 setuptools - # Workaround for Python 3.4 and x64 bug in latest conda-build. - # FIXME: Remove once there is a release that fixes the upstream issue - # ( https://github.com/conda/conda-build/issues/895 ). - - cmd: if "%TARGET_ARCH%" == "x64" if "%CONDA_PY%" == "34" conda install conda-build=1.20.0 --yes + + # Add a hack to switch to `conda` version `4.1.12` before activating. + # This is required to handle a long path activation issue. + # Please see PR ( https://github.com/conda/conda/pull/3349 ). + - cmd: conda install --yes --quiet conda=4.1.12 + - cmd: set "PATH=%OLDPATH%" + - cmd: set "OLDPATH=" + + # Actually activate `conda`. + - cmd: call %CONDA_INSTALL_LOCN%\Scripts\activate.bat + - cmd: set PYTHONUNBUFFERED=1 + + - cmd: conda install -n root --quiet --yes obvious-ci + - cmd: conda install -n root --quiet --yes conda-forge-build-setup + - cmd: run_conda_forge_build_setup # Skip .NET project specific build phase. build: off @@ -77,5 +90,4 @@ build: off test_script: - "%CMD_IN_ENV% conda build recipe --quiet" deploy_script: - - - 'python ci_support\upload_or_check_non_existence.py .\recipe conda-forge --channel=main' + - cmd: upload_or_check_non_existence .\recipe conda-forge --channel=main diff --git a/ci_support/checkout_merge_commit.sh b/ci_support/checkout_merge_commit.sh new file mode 100755 index 0000000..9528e4b --- /dev/null +++ b/ci_support/checkout_merge_commit.sh @@ -0,0 +1,27 @@ +#!/bin/bash + + +# Update PR refs for testing. +if [[ -n "${CIRCLE_PR_NUMBER}" ]] +then + FETCH_REFS="${FETCH_REFS} +refs/pull/${CIRCLE_PR_NUMBER}/head:pr/${CIRCLE_PR_NUMBER}/head" + FETCH_REFS="${FETCH_REFS} +refs/pull/${CIRCLE_PR_NUMBER}/merge:pr/${CIRCLE_PR_NUMBER}/merge" +fi + +# Retrieve the refs. +if [[ -n "${CIRCLE_PR_NUMBER}" ]] +then + git fetch -u origin ${FETCH_REFS} +fi + +# Checkout the PR merge ref. +if [[ -n "${CIRCLE_PR_NUMBER}" ]] +then + git checkout -qf "pr/${CIRCLE_PR_NUMBER}/merge" +fi + +# Check for merge conflicts. +if [[ -n "${CIRCLE_PR_NUMBER}" ]] +then + git branch --merged | grep "pr/${CIRCLE_PR_NUMBER}/head" > /dev/null +fi diff --git a/ci_support/run_docker_build.sh b/ci_support/run_docker_build.sh index c8af217..23d6814 100755 --- a/ci_support/run_docker_build.sh +++ b/ci_support/run_docker_build.sh @@ -14,7 +14,6 @@ config=$(cat < ~/.condarc # A lock sometimes occurs with incomplete builds. The lock file is stored in build_artefacts. conda clean --lock -conda update --yes --all -conda install --yes conda-build -conda info +conda install --yes --quiet conda-forge-build-setup +source run_conda_forge_build_setup # Embarking on 3 case(s). set -x export CONDA_PY=27 set +x conda build /recipe_root --quiet || exit 1 - /feedstock_root/ci_support/upload_or_check_non_existence.py /recipe_root conda-forge --channel=main || exit 1 + upload_or_check_non_existence /recipe_root conda-forge --channel=main || exit 1 set -x export CONDA_PY=34 set +x conda build /recipe_root --quiet || exit 1 - /feedstock_root/ci_support/upload_or_check_non_existence.py /recipe_root conda-forge --channel=main || exit 1 + upload_or_check_non_existence /recipe_root conda-forge --channel=main || exit 1 set -x export CONDA_PY=35 set +x conda build /recipe_root --quiet || exit 1 - /feedstock_root/ci_support/upload_or_check_non_existence.py /recipe_root conda-forge --channel=main || exit 1 + upload_or_check_non_existence /recipe_root conda-forge --channel=main || exit 1 EOF diff --git a/ci_support/upload_or_check_non_existence.py b/ci_support/upload_or_check_non_existence.py deleted file mode 100755 index 681f144..0000000 --- a/ci_support/upload_or_check_non_existence.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function - -import argparse -import hashlib -import os -import subprocess -import sys - -from binstar_client.utils import get_binstar -import binstar_client.errors -import conda.config -from conda_build.metadata import MetaData -from conda_build.build import bldpkg_path - - -def built_distribution_already_exists(cli, meta, owner): - """ - Checks to see whether the built recipe (aka distribution) already - exists on the owner/user's binstar account. - - """ - distro_name = '{}/{}.tar.bz2'.format(conda.config.subdir, meta.dist()) - fname = bldpkg_path(meta) - try: - dist_info = cli.distribution(owner, meta.name(), meta.version(), - distro_name) - except binstar_client.errors.NotFound: - dist_info = {} - - exists = bool(dist_info) - # Unfortunately, we cannot check the md5 quality of the built distribution, as - # this will depend on fstat information such as modification date (because - # distributions are tar files). Therefore we can only assume that the distribution - # just built, and the one on anaconda.org are the same. -# if exists: -# md5_on_binstar = dist_info.get('md5') -# with open(fname, 'rb') as fh: -# md5_of_build = hashlib.md5(fh.read()).hexdigest() -# -# if md5_on_binstar != md5_of_build: -# raise ValueError('This build ({}), and the build already on binstar ' -# '({}) are different.'.format(md5_of_build, md5_on_binstar)) - return exists - - -def upload(cli, meta, owner, channels): - try: - with open('binstar.token', 'w') as fh: - fh.write(cli.token) - subprocess.check_call(['anaconda', '--quiet', '-t', 'binstar.token', - 'upload', bldpkg_path(meta), - '--user={}'.format(owner), - '--channel={}'.format(channels)], - env=os.environ) - finally: - os.remove('binstar.token') - - -def distribution_exists_on_channel(binstar_cli, meta, owner, channel='main'): - """ - Determine whether a distribution exists on a specific channel. - - Note from @pelson: As far as I can see, there is no easy way to do this on binstar. - - """ - fname = '{}/{}.tar.bz2'.format(conda.config.subdir, meta.dist()) - distributions_on_channel = [dist['basename'] for dist in - binstar_cli.show_channel(owner=owner, channel=channel)['files']] - return fname in distributions_on_channel - - -def add_distribution_to_channel(binstar_cli, meta, owner, channel='main'): - """ - Add a(n already existing) distribution on binstar to another channel. - - Note - the addition is done based on name and version - no build strings etc. - so if you have a foo-0.1-np18 and foo-0.1-np19 *both* will be added to the channel. - - """ - package_fname = '{}/{}.tar.bz2'.format(conda.config.subdir, meta.dist()) - binstar_cli.add_channel(channel, owner, meta.name(), meta.version()) - - -def main(): - token = os.environ.get('BINSTAR_TOKEN') - - description = ('Upload or check consistency of a built version of a ' - 'conda recipe with binstar. Note: The existence of the ' - 'BINSTAR_TOKEN environment variable determines ' - 'whether the upload should actually take place.') - parser = argparse.ArgumentParser(description=description) - parser.add_argument('recipe_dir', help='the conda recipe directory') - parser.add_argument('owner', help='the binstar owner/user') - parser.add_argument('--channel', help='the binstar channel', default='main') - args = parser.parse_args() - recipe_dir, owner, channel = args.recipe_dir, args.owner, args.channel - - cli = get_binstar(argparse.Namespace(token=token, site=None)) - meta = MetaData(recipe_dir) - if meta.skip(): - print("No upload to take place - this configuration was skipped in build/skip.") - return - exists = built_distribution_already_exists(cli, meta, owner) - if token: - on_channel = distribution_exists_on_channel(cli, meta, owner, channel) - if not exists: - upload(cli, meta, owner, channel) - print('Uploaded {}'.format(bldpkg_path(meta))) - elif not on_channel: - print('Adding distribution {} to {}\'s {} channel' - ''.format(bldpkg_path(meta), owner, channel)) - add_distribution_to_channel(cli, meta, owner, channel) - else: - print('Distribution {} already \nexists on {}\'s {} channel.' - ''.format(bldpkg_path(meta), owner, channel)) - else: - print("No BINSTAR_TOKEN present, so no upload is taking place. " - "The distribution just built {} already available on {}'s " - "{} channel.".format('is' if exists else 'is not', - owner, channel)) - -if __name__ == '__main__': - main() diff --git a/circle.yml b/circle.yml index 58649fa..0c5dcdf 100644 --- a/circle.yml +++ b/circle.yml @@ -1,3 +1,7 @@ +checkout: + post: + - ./ci_support/checkout_merge_commit.sh + machine: services: - docker