#!groovy
//
//
// Licensed 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.
build_and_test = '''
mkdir -p ${ERLANG_VERSION}
cd ${ERLANG_VERSION}
rm -rf build
mkdir build
cd build
tar -xf ${WORKSPACE}/apache-couchdb-*.tar.gz
cd apache-couchdb-*
./configure
make check || (make build-report && false)
'''

docs_changed = "git diff --name-only origin/${env.CHANGE_TARGET} | grep -q '^src/docs/'"
other_changes = "git diff --name-only origin/${env.CHANGE_TARGET} | grep -q -v '^src/docs/'"

pipeline {

  // no top-level agent; agents must be declared for each stage
  agent none

  environment {
    recipient = 'notifications@couchdb.apache.org'
    // Following fix an issue with git <= 2.6.5 where no committer
    // name or email are present for reflog, required for git clone
    GIT_COMMITTER_NAME = 'Jenkins User'
    GIT_COMMITTER_EMAIL = 'couchdb@apache.org'
    // Parameters for the matrix build
    DOCKER_IMAGE_BASE = 'apache/couchdbci-debian:bullseye-erlang'
    // https://github.com/jenkins-infra/jenkins.io/blob/master/Jenkinsfile#64
    // We need the jenkins user mapped inside of the image
    // npm config cache below deals with /home/jenkins not mapping correctly
    // inside the image
    DOCKER_ARGS = '-e npm_config_cache=npm-cache -e HOME=. -v=/etc/passwd:/etc/passwd -v /etc/group:/etc/group'

    // *** BE SURE TO ALSO CHANGE THE ERLANG VERSIONS FARTHER DOWN ***
    // Search for ERLANG_VERSION
    // see https://issues.jenkins.io/browse/JENKINS-61047 for why this cannot
    // be done parametrically
    LOW_ERLANG_VER = '23.3.4.18'
  }

  options {
    buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '10'))
    // This fails the build immediately if any parallel step fails
    parallelsAlwaysFailFast()
    preserveStashes(buildCount: 10)
    timeout(time: 3, unit: 'HOURS')
    timestamps()
  }

  stages {

    stage('Setup Env') {
      agent {
        docker {
          image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}"
          label 'docker'
          args "${DOCKER_ARGS}"
          registryUrl 'https://docker.io/'
          registryCredentialsId 'dockerhub_creds'
        }
      }
      options {
        timeout(time: 10, unit: 'MINUTES')
      }
      steps {
        script {
          env.DOCS_CHANGED = '0'
          env.ONLY_DOCS_CHANGED = '0'
          if ( sh(returnStatus: true, script: docs_changed) == 0 ) {
            env.DOCS_CHANGED = '1'
            if (sh(returnStatus: true, script: other_changes) == 1) {
              env.ONLY_DOCS_CHANGED = '1'
            }
          }
        }
      }
      post {
        cleanup {
          // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894
          sh 'rm -rf ${WORKSPACE}/*'
        }
      }
    } // stage 'Setup Environment'
//
  //  stage('Docs Check') {
  //    // Run docs `make check` stage if any docs changed
  //    when {
  //      beforeOptions true
  //      expression { DOCS_CHANGED == '1' }
  //    }
  //    agent {
  //      docker {
  //        image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}"
  //        label 'docker'
  //        args "${DOCKER_ARGS}"
  //        registryUrl 'https://docker.io/'
  //        registryCredentialsId 'dockerhub_creds'
  //      }
  //    }
  //    options {
  //      timeout(time: 15, unit: 'MINUTES')
  //    }
  //    steps {
  //      sh '''
  //        make python-black
  //      '''
  //      sh '''
  //        (cd src/docs && make check)
  //      '''
  //    }
  //    post {
  //      cleanup {
  //        // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894
  //        sh 'rm -rf ${WORKSPACE}/*'
  //      }
  //    }
  //  } // stage Docs Check
//
  //  stage('Build Docs') {
  //    // Build docs separately if only docs changed. If there are other changes, docs are
  //    // already built as part of `make dist`
  //    when {
  //      beforeOptions true
  //      expression { ONLY_DOCS_CHANGED == '1' }
  //    }
  //    agent {
  //      docker {
  //        image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}"
  //        label 'docker'
  //        args "${DOCKER_ARGS}"
  //        registryUrl 'https://docker.io/'
  //        registryCredentialsId 'dockerhub_creds'
  //      }
  //    }
  //    options {
  //      timeout(time: 30, unit: 'MINUTES')
  //    }
  //    steps {
  //      sh '''
  //         (cd src/docs && ./setup.sh ; make html)
  //       '''
  //    }
  //    post {
  //      cleanup {
  //        // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894
  //        sh 'rm -rf ${WORKSPACE}/*'
  //      }
  //    }
  //  } // stage Build Docs
//
  //  stage('Source Format Checks') {
  //    when {
  //      beforeOptions true
  //      expression { ONLY_DOCS_CHANGED == '0' }
  //    }
  //    agent {
  //      docker {
  //        image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}"
  //        label 'docker'
  //        args "${DOCKER_ARGS}"
  //        registryUrl 'https://docker.io/'
  //        registryCredentialsId 'dockerhub_creds'
  //      }
  //    }
  //    options {
  //      timeout(time: 15, unit: "MINUTES")
  //    }
  //    steps {
  //      sh '''
  //        rm -rf apache-couchdb-*
  //        ./configure --skip-deps
  //        make erlfmt-check
  //        make elixir-source-checks
  //        make python-black
  //      '''
  //    }
  //    post {
  //      cleanup {
  //        // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894
  //        sh 'rm -rf ${WORKSPACE}/*'
  //      }
  //    }
  //  } // stage Erlfmt
//
//
  //  stage('Make Dist') {
  //    when {
  //      beforeOptions true
  //      expression { ONLY_DOCS_CHANGED == '0' }
  //    }
  //    agent {
  //      docker {
  //        image "${DOCKER_IMAGE_BASE}-${LOW_ERLANG_VER}"
  //        label 'docker'
  //        args "${DOCKER_ARGS}"
  //        registryUrl 'https://docker.io/'
  //        registryCredentialsId 'dockerhub_creds'
  //      }
  //    }
  //    options {
  //      timeout(time: 15, unit: "MINUTES")
  //    }
  //    steps {
  //      sh '''
  //        rm -rf apache-couchdb-*
  //        ./configure --spidermonkey-version 78
  //        make dist
  //        chmod -R a+w * .
  //      '''
  //    }
  //    post {
  //      success {
  //        stash includes: 'apache-couchdb-*.tar.gz', name: 'tarball'
  //      }
  //      cleanup {
  //        // UGH see https://issues.jenkins-ci.org/browse/JENKINS-41894
  //        sh 'rm -rf ${WORKSPACE}/*'
  //      }
  //    }
  //  } // stage Make Dist
//
  //  // TODO Rework once Improved Docker Pipeline Engine is released
  //  // https://issues.jenkins-ci.org/browse/JENKINS-47962
  //  // https://issues.jenkins-ci.org/browse/JENKINS-48050
//
  //  stage('Make Check') {
  //    when {
  //      beforeOptions true
  //      expression { ONLY_DOCS_CHANGED == '0' }
  //    }
  //    matrix {
  //      axes {
  //        axis {
  //          name 'ERLANG_VERSION'
  //          values '23.3.4.18', '24.3.4.7', '25.2'
  //        }
  //        axis {
  //          name 'SM_VSN'
  //          values '78'
  //        }
  //      }
//
  //      stages {
  //        stage('Build and Test') {
  //          agent {
  //            docker {
  //              image "${DOCKER_IMAGE_BASE}-${ERLANG_VERSION}"
  //              label 'docker'
  //              args "${DOCKER_ARGS}"
  //            }
  //          }
  //          options {
  //            skipDefaultCheckout()
  //            timeout(time: 90, unit: "MINUTES")
  //          }
  //          steps {
  //            unstash 'tarball'
  //            sh( script: build_and_test )
  //          }
  //          post {
  //            always {
  //              junit '**/.eunit/*.xml, **/_build/*/lib/couchdbtest/*.xml, **/src/mango/nosetests.xml, **/test/javascript/junit.xml'
  //            }
  //            cleanup {
  //              sh 'rm -rf ${WORKSPACE}/*'
  //            }
  //          }
  //        } // stage
  //      } // stages
  //    } // matrix
  //  } // stage "Make Check"
  } // stages
} // pipeline
