Borrowed with minor modifications from qemu.git. Signed-off-by: John Snow <js...@redhat.com> --- .gitlab-ci.d/check-dco.py | 98 +++++++++++++++++++++++++++++++++++++++ .gitlab-ci.d/index.yml | 2 + .gitlab-ci.d/test.yml | 15 ++++++ 3 files changed, 115 insertions(+) create mode 100755 .gitlab-ci.d/check-dco.py create mode 100644 .gitlab-ci.d/test.yml
diff --git a/.gitlab-ci.d/check-dco.py b/.gitlab-ci.d/check-dco.py new file mode 100755 index 0000000..747cd54 --- /dev/null +++ b/.gitlab-ci.d/check-dco.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +# +# check-dco.py: validate all commits are signed off +# +# Copyright (C) 2020 Red Hat, Inc. +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import argparse +import os +import os.path +import sys +import subprocess + +parser = argparse.ArgumentParser("check-dco") +parser.add_argument( + "repourl", + help="upstream repo URL" +) +parser.add_argument( + "refspec", + help="upstream's default branch (or other refspec)" +) +args = parser.parse_args() + + +subprocess.check_call(["git", "remote", "add", "check-dco", args.repourl]) +subprocess.check_call(["git", "fetch", "check-dco", args.refspec], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) + +ancestor = subprocess.check_output( + ["git", "merge-base", f"check-dco/{args.refspec}", "HEAD"], + universal_newlines=True) +ancestor = ancestor.strip() + +subprocess.check_call(["git", "remote", "rm", "check-dco"]) + +errors = False + +print("\nChecking for 'Signed-off-by: NAME <EMAIL>' " + + "on all commits since %s...\n" % ancestor) + +log = subprocess.check_output(["git", "log", "--format=%H %s", + ancestor + "..."], + universal_newlines=True) + +if log == "": + commits = [] +else: + commits = [[c[0:40], c[41:]] for c in log.strip().split("\n")] + +for sha, subject in commits: + + msg = subprocess.check_output(["git", "show", "-s", sha], + universal_newlines=True) + lines = msg.strip().split("\n") + + print("đ %s %s" % (sha, subject)) + sob = False + for line in lines: + if "Signed-off-by:" in line: + sob = True + if "localhost" in line: + print(" â FAIL: bad email in %s" % line) + errors = True + + if not sob: + print(" â FAIL missing Signed-off-by tag") + errors = True + +if errors: + print(""" + +â ERROR: One or more commits are missing a valid Signed-off-By tag. + + +This project requires all contributors to assert that their contributions +are provided in compliance with the terms of the Developer's Certificate +of Origin 1.1 (DCO): + + https://developercertificate.org/ + +To indicate acceptance of the DCO every commit must have a tag + + Signed-off-by: REAL NAME <EMAIL> + +This can be achieved by passing the "-s" flag to the "git commit" command. + +To bulk update all commits on current branch "git rebase" can be used: + + git rebase -i master -x 'git commit --amend --no-edit -s' + +""") + + sys.exit(1) + +sys.exit(0) diff --git a/.gitlab-ci.d/index.yml b/.gitlab-ci.d/index.yml index cf61dec..cd6a65e 100644 --- a/.gitlab-ci.d/index.yml +++ b/.gitlab-ci.d/index.yml @@ -4,7 +4,9 @@ stages: - containers - build + - test include: - local: '/.gitlab-ci.d/containers.yml' - local: '/.gitlab-ci.d/build.yml' + - local: '/.gitlab-ci.d/test.yml' diff --git a/.gitlab-ci.d/test.yml b/.gitlab-ci.d/test.yml new file mode 100644 index 0000000..35fa105 --- /dev/null +++ b/.gitlab-ci.d/test.yml @@ -0,0 +1,15 @@ +check-dco: + stage: test + image: $CI_REGISTRY_IMAGE/python:latest + needs: + job: python-container + script: + - .gitlab-ci.d/check-dco.py + "https://gitlab.com/jsnow/qemu.qmp.git" + "main" + variables: + GIT_DEPTH: 1000 + rules: + - if: '$CI_PROJECT_NAMESPACE == "jsnow" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + when: never + - when: on_success -- 2.31.1