Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/buildenv/jenkins/jobs/infrastructure/signedOffByCheck.groovy
23788 views
/*******************************************************************************
 * Copyright (c) 2018, 2020 IBM Corp. and others
 *
 * This program and the accompanying materials are made available under
 * the terms of the Eclipse Public License 2.0 which accompanies this
 * distribution and is available at https://www.eclipse.org/legal/epl-2.0/
 * or the Apache License, Version 2.0 which accompanies this distribution and
 * is available at https://www.apache.org/licenses/LICENSE-2.0.
 *
 * This Source Code may also be made available under the following
 * Secondary Licenses when the conditions for such availability set
 * forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
 * General Public License, version 2 with the GNU Classpath
 * Exception [1] and GNU General Public License, version 2 with the
 * OpenJDK Assembly Exception [2].
 *
 * [1] https://www.gnu.org/software/classpath/license.html
 * [2] http://openjdk.java.net/legal/assembly-exception.html
 *
 * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
 *******************************************************************************/

def FAIL = false
def SRC_REPO = 'https://github.com/${ghprbGhRepository}.git'
def HASHES = '###################################'
def COMMITS = []
def BAD_COMMITS = []

timeout(time: 6, unit: 'HOURS') {
    stage('SignedOffBy Check') {
        timestamps {
            node ('worker') {
                try {
                    checkout changelog: false, poll: false,
                        scm: [$class: 'GitSCM',
                            branches: [[name: ghprbActualCommit]],
                            doGenerateSubmoduleConfigurations: false,
                            extensions: [[$class: 'CloneOption',
                                            depth: 0,
                                            noTags: false,
                                            reference: '/home/jenkins/openjdk_cache',
                                            shallow: false]],
                            submoduleCfg: [],
                            userRemoteConfigs: [[refspec: "+refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/* +refs/heads/${ghprbTargetBranch}:refs/remotes/origin/${ghprbTargetBranch}",
                                                    url: SRC_REPO]]]

                    COMMITS = sh(
                         script : "git log origin/${ghprbTargetBranch}..HEAD",
                         returnStdout: true
                         ).trim()
                    if (COMMITS == "") {
                        echo "There are no commits to check for signoffby message"
                    } else {
                        def COMMIT_RAW = COMMITS.split("(?=commit [a-f0-9]{40}+\n(Merge: [a-f0-9 ]+)*\n*Author: .*\nDate:[ ]+.*\n)");
                        COMMIT_RAW.each { COMMIT ->
                            def WRONG_COMMIT = true
                            def splitCommit = COMMIT.split("\\r?\\n")
                            def lastBlankLine = 0
                            if (splitCommit[-1] ==~ /[ ]{4}This reverts commit [0-9a-f]{40}[\.]/) {
                                echo "The following commit appears to be a revert, does not need sign-off:\n${COMMIT}"
                                WRONG_COMMIT = false
                            } else {
                                for (int i = splitCommit.size() - 1; i >= 0; i--) {
                                    if (splitCommit[i] ==~ /^\s*$/) {
                                        lastBlankLine = i
                                        break
                                    }
                                }
                                for (int j = splitCommit.size() - 1; j > lastBlankLine; j--) {
                                    if (splitCommit[j] ==~ /\s*Signed\-off\-by\:\s+[^<]+\s+\<[^@]+@[^@]+\.[^@]+\>/) {
                                        echo "The following commit appears to have a proper sign-off:\n${COMMIT}"
                                        WRONG_COMMIT = false
                                        break
                                    }
                                }
                                if (WRONG_COMMIT) {
                                    echo "FAILURE - The following commit appears to have an incorrect sign-off:\n${COMMIT}"
                                    BAD_COMMITS << "${COMMIT}"
                                    FAIL = true
                                }
                            }
                        }
                        if (FAIL) {
                            echo "${HASHES}"
                            echo "FAILURE - The following commits appear to have an incorrect sign-off"
                            BAD_COMMITS.each { commit ->
                                echo "${commit}"
                            }
                            echo "${HASHES}"
                            currentBuild.result = 'FAILURE'
                        } else {
                            echo "All commits appears to be have a proper sign-off"
                        }
                    }
                } finally {
                    cleanWs()
                }
            }
        }
    }
}