---
stages:
  - prepare
  - python
  - compile
  - fortran
  - performance
  - deploy
  - backup
  - update_master
  - distclean
  - clean

###################################################################################################
before_script:
  - if [ $(awk "/$CI_PIPELINE_ID/{print NR}" $LOCAL_HOME/GitLabCI.queue)x == 'x' ];
      then echo $CI_PIPELINE_ID >> $LOCAL_HOME/GitLabCI.queue;
    fi
  - while [ $(awk "/$CI_PIPELINE_ID/{print NR}" $LOCAL_HOME/GitLabCI.queue) != 1 ];
      do sleep 5m;
      echo -e "Currently queued pipelines:\n$(cat $LOCAL_HOME/GitLabCI.queue)\n";
    done
  - source $DAMASKROOT/env/DAMASK.sh
  - cd $DAMASKROOT/PRIVATE/testing
  - echo Job start:" $(date)"

###################################################################################################
after_script:
  - echo Job end:" $(date)"

###################################################################################################
variables:
  # ===============================================================================================
  # GitLab Settings
  # ===============================================================================================
  GIT_SUBMODULE_STRATEGY: none

  # ===============================================================================================
  # Shortcut names
  # ===============================================================================================
  DAMASKROOT: "$LOCAL_HOME/GitLabCI_Pipeline_$CI_PIPELINE_ID/DAMASK"
  TESTROOT:   "$LOCAL_HOME/GitLabCI_Pipeline_$CI_PIPELINE_ID/tests"

  # ===============================================================================================
  # Names of module files to load
  # ===============================================================================================
  # ++++++++++++ Compiler +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  IntelCompiler19_1:               "Compiler/Intel/19.1.2 Libraries/IMKL/2020"
  GNUCompiler10:                   "Compiler/GNU/10"
  # ------------ Defaults ----------------------------------------------
  IntelCompiler:                   "$IntelCompiler19_1"
  GNUCompiler:                     "$GNUCompiler10"
  # ++++++++++++ MPI ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  IMPI2020Intel19_1:               "MPI/Intel/19.1.2/IntelMPI/2019"
  OMPI4_0GNU10:                    "MPI/GNU/10/OpenMPI/4.0.5"
  # ------------ Defaults ----------------------------------------------
  MPI_Intel:                       "$IMPI2020Intel19_1"
  MPI_GNU:                         "$OMPI4_0GNU10"
  # ++++++++++++ PETSc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  PETSc3_14_2IMPI2020Intel19_1:    "Libraries/PETSc/3.14.2/Intel-19.1.2-IntelMPI-2019"
  PETSc3_14_2OMPI4_0GNU10:         "Libraries/PETSc/3.14.2/GNU-10-OpenMPI-4.0.5"
  # ------------ Defaults ----------------------------------------------
  PETSc_Intel:                     "$PETSc3_14_2IMPI2020Intel19_1"
  PETSc_GNU:                       "$PETSc3_14_2OMPI4_0GNU10"
  # ++++++++++++ commercial FEM ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  MSC2020:                         "FEM/MSC/2020"
  # ------------ Defaults ----------------------------------------------
  MSC:                             "$MSC2020"
  IntelMarc:                       "$IntelCompiler19_1"
  HDF5Marc:                        "HDF5/1.12.0/Intel-19.1.2"

###################################################################################################
checkout:
  stage: prepare
  before_script:
    - echo $CI_PIPELINE_ID >> $LOCAL_HOME/GitLabCI.queue
    - while [ $(awk "/$CI_PIPELINE_ID/{print NR}" $LOCAL_HOME/GitLabCI.queue) != 1 ];
        do sleep 5m;
        echo -e "Currently queued pipelines:\n$(cat $LOCAL_HOME/GitLabCI.queue)\n";
      done
  script:
    - mkdir -p $DAMASKROOT
    - mkdir -p $TESTROOT
    - cd $DAMASKROOT
    - git clone -q git@magit1.mpie.de:damask/DAMASK.git .
    - git checkout $CI_COMMIT_SHA
    - git submodule update --init
    - source env/DAMASK.sh
    - ./installation/symlink_Processing.py
  except:
    - master
    - release

###################################################################################################
processing:
  stage: python
  script:
    - cd $DAMASKROOT/python
    - pytest --basetemp=${TESTROOT}/python -v --cov --cov-report=term
    - coverage report --fail-under=85
  except:
    - master
    - release

###################################################################################################
preprocessing_deprecated:
  stage: python
  script: PreProcessing/test.py
  except:
    - master
    - release

###################################################################################################
compile_grid_Intel:
  stage: compile
  script:
    - module load $IntelCompiler $MPI_Intel $PETSc_Intel
    - cd pytest
    - pytest -k 'compile and grid' --basetemp=${TESTROOT}/compile_grid_Intel
  except:
    - master
    - release

compile_mesh_Intel:
  stage: compile
  script:
    - module load $IntelCompiler $MPI_Intel $PETSc_Intel
    - cd pytest
    - pytest -k 'compile and mesh' --basetemp=${TESTROOT}/compile_mesh_Intel
  except:
    - master
    - release

compile_grid_GNU:
  stage: compile
  script:
    - module load $GNUCompiler $MPI_GNU $PETSc_GNU
    - cd pytest
    - pytest -k 'compile and grid' --basetemp=${TESTROOT}/compile_grid_GNU
  except:
    - master
    - release

compile_mesh_GNU:
  stage: compile
  script:
    - module load $GNUCompiler $MPI_GNU $PETSc_GNU
    - cd pytest
    - pytest -k 'compile and mesh' --basetemp=${TESTROOT}/compile_mesh_GNU
  except:
    - master
    - release

compile_Marc:
  stage: compile
  script:
    - module load $IntelMarc $HDF5Marc $MSC
    - cd pytest
    - pytest -k 'compile and Marc' --basetemp=${TESTROOT}/compile_Marc
  except:
    - master
    - release

setup_grid:
  stage: compile
  script:
    - module load $IntelCompiler $MPI_Intel $PETSc_Intel
    - BUILD_DIR=$(mktemp -d)
    - cd ${BUILD_DIR}
    - cmake -DDAMASK_SOLVER=GRID -DCMAKE_INSTALL_PREFIX=${DAMASKROOT} ${DAMASKROOT}
    - make -j2 all install
  except:
    - master
    - release

setup_mesh:
  stage: compile
  script:
    - module load $IntelCompiler $MPI_Intel $PETSc_Intel
    - BUILD_DIR=$(mktemp -d)
    - cd ${BUILD_DIR}
    - cmake -DDAMASK_SOLVER=MESH -DCMAKE_INSTALL_PREFIX=${DAMASKROOT} ${DAMASKROOT}
    - make -j2 all install
  except:
    - master
    - release

###################################################################################################
core:
  stage: fortran
  script:
    - module load $IntelCompiler $MPI_Intel $PETSc_Intel
    - cd pytest
    - pytest -k 'not compile' --basetemp=${TESTROOT}/fortran -v
  except:
    - master
    - release

Phenopowerlaw_singleSlip:
  stage: fortran
  script: Phenopowerlaw_singleSlip/test.py
  except:
    - master
    - release

J2_plasticBehavior:
  stage: fortran
  script:
    - module load $IntelMarc $HDF5Marc $MSC
    - J2_plasticBehavior/test.py
  except:
    - master
    - release


###################################################################################################
SpectralRuntime:
  stage: performance
  script:
    - module load $IntelCompiler $MPI_Intel $PETSc_Intel
    - cd $DAMASKROOT
    - make clean grid OPTIMIZATION=AGGRESSIVE
    - cd $LOCAL_HOME/performance                                                                    # location of old results
    - git checkout .                                                                                # undo any changes (i.e. run time data from non-development branch)
    - cd $DAMASKROOT/PRIVATE/testing
    - SpectralAll_runtime/test.py -d $LOCAL_HOME/performance
  except:
    - master
    - release

###################################################################################################
source_distribution:
  stage: deploy
  script:
    - cd $(mktemp -d)
    - $DAMASKROOT/PRIVATE/releasing/deployMe.sh $CI_COMMIT_SHA
  except:
    - master
    - release

library_documentation:
  stage: deploy
  script:
    - cd $DAMASKROOT/PRIVATE/documenting/sphinx
    - make html
  except:
    - master
    - release

##################################################################################################
backup_runtime_measurement:
  stage: backup
  script:
    - cd $LOCAL_HOME/performance                                                                    # location of new runtime results
    - git commit -am"${CI_PIPELINE_ID}_${CI_COMMIT_SHA}"
    - mkdir $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}
    - mv $LOCAL_HOME/performance/time.png $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
    - mv $LOCAL_HOME/performance/memory.png $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
  only:
    - development

##################################################################################################
merge_into_master:
  stage: update_master
  script:
    - cd $DAMASKROOT
    - export TESTEDREV=$(git describe)                                                              # might be detached from development branch
    - echo $TESTEDREV > VERSION
    - git commit VERSION -m "[skip ci] updated version information after successful test of $TESTEDREV"
    - export UPDATEDREV=$(git describe)                                                             # tested state + 1 commit
    - git checkout master
    - git merge $UPDATEDREV -s recursive -X ours                                                    # conflicts occur only for inconsistent state
    - git push origin master                                                                        # master is now tested version and has updated VERSION file
    - git checkout development
    - git pull
    - git merge master -s recursive -X ours -m "[skip ci] Merge branch 'master' into development"   # only possible conflict is in VERSION file
    - git push origin development                                                                   # development is unchanged (as master is based on it) but has updated VERSION file
  only:
    - development

###################################################################################################
remove_data:
  stage: distclean
  before_script:
    - echo "Removing data and lock of pipeline $CI_PIPELINE_ID"
  script:
    - rm -rf $LOCAL_HOME/GitLabCI_Pipeline_$CI_PIPELINE_ID
    - sed -i "/$CI_PIPELINE_ID/d" $LOCAL_HOME/GitLabCI.queue                                        # in case pipeline was manually (web GUI) restarted and releaseLock was performed already
  except:
    - master
    - release

###################################################################################################
remove_lock:
  stage: clean
  before_script:
    - echo "Removing lock of pipeline $CI_PIPELINE_ID"
  when: always
  script: sed -i "/$CI_PIPELINE_ID/d" $LOCAL_HOME/GitLabCI.queue
  except:
    - master
    - release