From 7e1b59dcca6142e1ca263703e5da908c0829404e Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Tue, 22 Feb 2022 12:40:31 +0100
Subject: [PATCH] ci: Add precheck to merge_request builds

---
 .gitlab/check_ci.sh   | 81 +++++++++++++++++++++++++++++++++++++++++++
 .gitlab/common.yml    |  8 +++++
 tools/check_header.sh | 14 ++++++++
 3 files changed, 103 insertions(+)
 create mode 100755 .gitlab/check_ci.sh

diff --git a/.gitlab/check_ci.sh b/.gitlab/check_ci.sh
new file mode 100755
index 000000000..76e9496ea
--- /dev/null
+++ b/.gitlab/check_ci.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+
+success=1
+
+check_rebase()
+{
+    hash_master=$(git show-ref -s origin/master)
+    hash_common=$(git merge-base origin/master ${CI_COMMIT_SHA})
+    if [ "${hash_master}" = "${hash_common}" ]
+    then
+        echo "check_rebase: OK"
+        return 0
+    else
+        echo "check_rebase: Rebase is required"
+        success=0
+        return 1
+    fi
+}
+
+check_draft()
+{
+    if [ "${CI_PIPELINE_SOURCE}" = "merge_request_event" ]
+    then
+        draft=$( echo ${CI_MERGE_REQUEST_TITLE} | sed "s/^Draft.*$/Draft/" )
+        wip=$( echo ${CI_MERGE_REQUEST_TITLE} | sed "s/^WIP.*$/WIP/" )
+
+        if [ "$draft" = "Draft" ]
+        then
+            echo "check_draft: Merge request is in draft mode"
+            success=0
+            return 1
+        fi
+
+        if [ "$wip" = "WIP" ]
+        then
+            echo "check_draft: Merge request is in WIP"
+            success=0
+            return 1
+        fi
+
+        # if [ "${CI_MERGE_REQUEST_APPROVED}" != "true" ]
+        # then
+        #     echo "check_approval: Merge request not yet approved"
+        #     success=0
+        #     return 1
+        # fi
+
+        echo "check_draft: Merge request is ok"
+    fi
+
+    return 0
+}
+
+echo "----------------------------------------------------"
+check_rebase
+
+echo ""
+echo "----------------------------------------------------"
+check_draft
+
+echo ""
+echo "----------------------------------------------------"
+echo " Checking file headers: "
+TOOLSDIR=$(dirname $0)/../tools
+
+$TOOLSDIR/check_header.sh
+rc=$?
+if [ $rc -eq 0 ]
+then
+    echo "Check header: SUCCESS"
+else
+    echo "Check header: FAILED"
+    success=0
+fi
+
+if [ $success -eq 0 ]
+then
+    exit 1
+    # We could cancel the job, but then the log is not pushed in time to the web interface
+    #curl --request POST --header "PRIVATE-TOKEN: ${PIPELINE_TOKEN}" "https://gitlab.inria.fr/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/cancel"
+fi
diff --git a/.gitlab/common.yml b/.gitlab/common.yml
index 2c597c65f..312eea9ad 100644
--- a/.gitlab/common.yml
+++ b/.gitlab/common.yml
@@ -21,6 +21,14 @@
   except:
     - schedules
 
+preliminary_checks:
+  image: registry.gitlab.inria.fr/solverstack/docker/distrib
+  stage: .pre
+  script:
+    - .gitlab/check_ci.sh
+  only:
+    - merge_requests
+
 .build_script_template:
   extends: .only-branches
   stage: build
diff --git a/tools/check_header.sh b/tools/check_header.sh
index bd0913627..48311d6ba 100755
--- a/tools/check_header.sh
+++ b/tools/check_header.sh
@@ -14,6 +14,7 @@
 #
 #!/usr/bin/env sh
 header=1
+nberr=0
 
 print_header()
 {
@@ -45,6 +46,7 @@ check_header_file()
         then
             print_header $filename
             echo -n "@file line missing or incorrect:"; grep "@file" $filename; echo ""
+            nberr=$(( nberr + 1 ))
         fi
     fi
 }
@@ -74,6 +76,7 @@ check_header_version()
     then
         print_header $filename
         echo -n "@version line missing or incorrect:"; grep "@version" $filename; echo "";
+        nberr=$(( nberr + 1 ))
     fi
 }
 
@@ -87,6 +90,7 @@ check_header_author()
     then
         print_header $filename
         echo "@author line missing";
+        nberr=$(( nberr + 1 ))
     fi
 }
 
@@ -100,6 +104,7 @@ check_header_date()
     then
         print_header $filename
         echo -n "@date line missing or incorrect"; grep "@date" $filename; echo "";
+        nberr=$(( nberr + 1 ))
     fi
 }
 
@@ -137,6 +142,7 @@ check_header_define()
                 grep "#ifndef" $filename
                 grep "#define" $filename
                 grep "#endif"  $filename
+                nberr=$(( nberr + 1 ))
             fi
             ;;
         *)
@@ -197,3 +203,11 @@ do
 
     check_header $f
 done
+
+if [ $nberr -gt 0 ]
+then
+    echo "${nberr} mistakes have been found in the header files."
+    exit 1
+else
+    exit 0
+fi
-- 
GitLab