#!/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 stable-3.12 and 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}/${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 stable-3.12') {
        steps {
          sh '''
            git clone -b stable-3.12 --recursive https://gerrit.googlesource.com/gerrit
          '''
        }
      }

      stage('Build Gerrit stable-3.12') {
        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-3.12
                ln -sfn ${jgitSourceDir} ${jgitTargetDir}
            """

            dir('gerrit') {
              sh '''
                . set-java.sh 21
                  bazelisk build release
              '''
            }
          }
        }
      }
      stage('Test Gerrit stable-3.12') {
        steps {
          dir('gerrit') {
            sh '''
              . set-java.sh 21
              echo "running gerrit stable-3.12 tests..."
              bazelisk test \
                --test_tag_filters=-flaky \
                --flaky_test_attempts 3 \
                --test_timeout 3600 \
                //...
            '''
          }
        }
      }
      stage('Checkout Gerrit master') {
        steps {
          dir('gerrit') {
            sh '''
              git reset --hard origin/master
              git checkout master
              git submodule update --init --recursive
            '''
          }
        }
      }
      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}"
      }
    }
  }
}
