#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# This is a basic workflow to help you get started with Actions

name: conda

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
  push:
  pull_request:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  build-pytest-package-ubuntu:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1
      - name: install-conda-build
        run: conda install conda-build anaconda-client
      - name: conda-config
        run: conda config --add channels conda-forge && conda config --add channels nusdbsystem && conda config --set anaconda_upload no
      - name: build-pytest
        run:  conda build tool/conda/singa --python 3.6
        env:
          TEST_COMMAND: pytest --cov=$PREFIX/lib/python3.7/site-packages/singa --cov-report=xml && codecov --flags singa-python
      - name: upload-package
        env: 
          ANACONDA_UPLOAD_TOKEN: ${{ secrets.ANACONDA_UPLOAD_TOKEN }}
        if: ${{ env.ANACONDA_UPLOAD_TOKEN }}
        run: /usr/share/miniconda/bin/anaconda -t $ANACONDA_UPLOAD_TOKEN upload -u nusdbsystem -l main /usr/share/miniconda/conda-bld/linux-64/singa-*.tar.bz2 --force
        # 


  build-pytest-package-macos:
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v1
      - name: set permission
        run: sudo chmod -R 777 /usr/local/miniconda 
        # && xcrun --show-sdk-path
      - name: install-conda-build
        run: conda install conda-build anaconda-client
      - name: conda-config
        run: conda config --add channels conda-forge && conda config --add channels nusdbsystem && conda config --set anaconda_upload no
      - name: build-pytest
        run:  conda build tool/conda/singa --python 3.6
        env:
          TEST_COMMAND: pytest --cov=$PREFIX/lib/python3.6/site-packages/singa --cov-report=xml && codecov --flags singa-python
      - name: upload-package
        env: 
          ANACONDA_UPLOAD_TOKEN: ${{ secrets.ANACONDA_UPLOAD_TOKEN }}
        if: ${{ env.ANACONDA_UPLOAD_TOKEN }}
        run: /usr/local/miniconda/bin/anaconda -t $ANACONDA_UPLOAD_TOKEN upload -u nusdbsystem -l main /usr/local/miniconda/conda-bld/osx-64/singa-*.tar.bz2 --force