#!/usr/bin/env groovy

// Copyright (C) 2025 The Android Open Source Project
//
// 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.

/**
 * Declarative pipeline for building and testing JGit servlet-4 branch against Gerrit master.
 *  Parameters: None
 * Usage in a Jenkinsfile:
 *   gerritJGitServlet4Pipeline()
 */

def call(Map cfg = [:]) {

  echo "Starting pipeline for JGit servlet-4"
  echo "Change : ${env.GERRIT_CHANGE_NUMBER}/${env.GERRIT_PATCHSET_NUMBER} '${env.GERRIT_CHANGE_SUBJECT}'"
  echo "Change URL: ${env.GERRIT_CHANGE_URL}"

  pipeline {
    agent { label 'bazel-debian' }
    options {
      skipDefaultCheckout true
    }
    stages {
      stage('Checkout JGit') {
        steps {
          dir('jgit') {
            checkout scm
          }
        }
      }
      stage('Build JGit') {
        steps {
          dir('jgit') {
            sh '''
              . set-java.sh 21
              java -version
              bazelisk build all
            '''
          }
        }
      }

      stage('Test JGit') {
        steps {
          dir('jgit') {
            sh '''
              echo "Running JGit tests..."
              . set-java.sh 21
              bazelisk test //...
            '''
          }
        }
      }

      stage('Checkout Gerrit master') {
        steps {
          sh '''
            git clone -b master --recursive https://gerrit.googlesource.com/gerrit
          '''
        }
      }
      stage('Build Gerrit master') {
        steps {
          script {
            def jgitSourceDir = "${env.WORKSPACE}/jgit"
            def jgitTargetDir = "${env.WORKSPACE}/gerrit/modules/jgit"
            echo "Replacing gerrit jgit module with jgit change ${env.GERRIT_CHANGE_NUMBER}..."

            sh """
                echo "${jgitSourceDir} -> ${jgitTargetDir}"
                mv ${jgitTargetDir} /tmp/jgit-master
                ln -sfn ${jgitSourceDir} ${jgitTargetDir}
            """

            dir('gerrit') {
              sh """
                . set-java.sh 21
                bazelisk build release
              """
            }
          }
        }
      }
      stage('Test Gerrit master') {
        steps {
          dir('gerrit') {
            sh '''
              . set-java.sh 21
              echo "running gerrit master tests..."
              bazelisk test \
                --test_tag_filters=-flaky \
                --flaky_test_attempts 3 \
                --test_timeout 3600 \
                //...
            '''
          }
        }
      }
    }

    post {
      success {
        gerritReview labels: ["Code-Review": 1], message: "Gerrit successfully builds with this JGit change.\nBuild: ${env.BUILD_URL}"
      }
      unstable {
        gerritReview labels: ["Code-Review": -1], message: "Gerrit build with this JGit change is unstable.\nBuild: ${env.BUILD_URL}"
      }
      failure {
        gerritReview labels: ["Code-Review": -1], message: "Gerrit does not build successfully with this JGit change.\nBuild: ${env.BUILD_URL}"
      }
    }
  }
}
