pipeline {
    agent { label 'built-in' }

    options {
        disableConcurrentBuilds()
        skipDefaultCheckout(true)
        timeout(time: 15, unit: 'MINUTES')
        timestamps()
    }

    stages {
        stage('Checkout Patch Set') {
            steps {
                deleteDir()
                script {
                    def gerritProject = env.GERRIT_PROJECT?.trim()
                    def gerritRefSpec = env.GERRIT_REFSPEC?.trim()
                    def gerritRevision = env.GERRIT_PATCHSET_REVISION?.trim()
                    def gerritHost = env.GERRIT_HOST?.trim()
                    def gerritPort = env.GERRIT_PORT?.trim()

                    [
                        GERRIT_PROJECT: gerritProject,
                        GERRIT_REFSPEC: gerritRefSpec,
                        GERRIT_PATCHSET_REVISION: gerritRevision,
                        GERRIT_HOST: gerritHost,
                        GERRIT_PORT: gerritPort
                    ].each { name, value ->
                        if (!value) {
                            error("Missing Gerrit Trigger variable: ${name}")
                        }
                    }

                    if (!(gerritPort ==~ /\d{1,5}/)) {
                        error('Invalid GERRIT_PORT: expected an integer from 1 to 65535')
                    }
                    def gerritPortNumber = gerritPort.toInteger()
                    if (gerritPortNumber < 1 || gerritPortNumber > 65535) {
                        error('Invalid GERRIT_PORT: expected an integer from 1 to 65535')
                    }

                    checkout([
                        $class: 'GitSCM',
                        branches: [[name: gerritRevision]],
                        extensions: [],
                        userRemoteConfigs: [[
                            credentialsId: 'gerrit-ci-cd',
                            refspec: gerritRefSpec,
                            url: "ssh://ci-cd@${gerritHost}:${gerritPortNumber}/${gerritProject}"
                        ]]
                    ])

                    def checkedOutRevision = sh(
                        returnStdout: true,
                        script: 'git rev-parse HEAD'
                    ).trim()
                    if (checkedOutRevision != gerritRevision) {
                        error("Expected ${gerritRevision}, checked out ${checkedOutRevision}")
                    }
                }
            }
        }

        stage('Repository Checks') {
            steps {
                sh '''
                    set -eu
                    test -f README.md
                    git diff-tree --check --root -r HEAD
                    git fsck --no-dangling
                '''
            }
        }
    }

    post {
        always {
            deleteDir()
        }
    }
}
