xref: /kvm-unit-tests/scripts/check-patch.py (revision 220ac1e0aaeaa86968de0573970cc0d3cfa2dbfb)
1*846737f0SNicholas Piggin#!/usr/bin/env python3
2*846737f0SNicholas Piggin#
3*846737f0SNicholas Piggin# check-patch.py: run checkpatch.pl across all commits in a branch
4*846737f0SNicholas Piggin#
5*846737f0SNicholas Piggin# Copyright (C) 2020 Red Hat, Inc.
6*846737f0SNicholas Piggin#
7*846737f0SNicholas Piggin# SPDX-License-Identifier: GPL-2.0-or-later
8*846737f0SNicholas Piggin
9*846737f0SNicholas Piggin# This file is taken from qemu.git 029e13a8a56a2 .gitlab-ci.d/check-patch.py
10*846737f0SNicholas Piggin# with minor changes to adjust namespace and checkpatch.pl invocation.
11*846737f0SNicholas Piggin
12*846737f0SNicholas Pigginimport os
13*846737f0SNicholas Pigginimport os.path
14*846737f0SNicholas Pigginimport sys
15*846737f0SNicholas Pigginimport subprocess
16*846737f0SNicholas Piggin
17*846737f0SNicholas Pigginnamespace = "kvm-unit-tests"
18*846737f0SNicholas Pigginif len(sys.argv) >= 2:
19*846737f0SNicholas Piggin    namespace = sys.argv[1]
20*846737f0SNicholas Piggin
21*846737f0SNicholas Piggincwd = os.getcwd()
22*846737f0SNicholas Pigginreponame = os.path.basename(cwd)
23*846737f0SNicholas Pigginrepourl = "https://gitlab.com/%s/%s.git" % (namespace, reponame)
24*846737f0SNicholas Piggin
25*846737f0SNicholas Piggin# GitLab CI environment does not give us any direct info about the
26*846737f0SNicholas Piggin# base for the user's branch. We thus need to figure out a common
27*846737f0SNicholas Piggin# ancestor between the user's branch and current git master.
28*846737f0SNicholas Pigginsubprocess.check_call(["git", "remote", "add", "check-patch", repourl])
29*846737f0SNicholas Pigginsubprocess.check_call(["git", "fetch", "check-patch", "master"])
30*846737f0SNicholas Piggin
31*846737f0SNicholas Piggin#                      stdout=subprocess.DEVNULL,
32*846737f0SNicholas Piggin#                      stderr=subprocess.DEVNULL)
33*846737f0SNicholas Piggin
34*846737f0SNicholas Pigginancestor = subprocess.check_output(["git", "merge-base",
35*846737f0SNicholas Piggin                                    "check-patch/master", "HEAD"],
36*846737f0SNicholas Piggin                                   universal_newlines=True)
37*846737f0SNicholas Piggin
38*846737f0SNicholas Pigginancestor = ancestor.strip()
39*846737f0SNicholas Piggin
40*846737f0SNicholas Pigginlog = subprocess.check_output(["git", "log", "--format=%H %s",
41*846737f0SNicholas Piggin                               ancestor + "..."],
42*846737f0SNicholas Piggin                              universal_newlines=True)
43*846737f0SNicholas Piggin
44*846737f0SNicholas Pigginsubprocess.check_call(["git", "remote", "rm", "check-patch"])
45*846737f0SNicholas Piggin
46*846737f0SNicholas Pigginif log == "":
47*846737f0SNicholas Piggin    print("\nNo commits since %s, skipping checks\n" % ancestor)
48*846737f0SNicholas Piggin    sys.exit(0)
49*846737f0SNicholas Piggin
50*846737f0SNicholas Pigginerrors = False
51*846737f0SNicholas Piggin
52*846737f0SNicholas Pigginprint("\nChecking all commits since %s...\n" % ancestor, flush=True)
53*846737f0SNicholas Piggin
54*846737f0SNicholas Pigginret = subprocess.run(["scripts/checkpatch.pl", "--terse", "--no-tree", "--git",
55*846737f0SNicholas Piggin                      ancestor + "..."])
56*846737f0SNicholas Piggin
57*846737f0SNicholas Pigginif ret.returncode != 0:
58*846737f0SNicholas Piggin    print("    ❌ FAIL one or more commits failed scripts/checkpatch.pl")
59*846737f0SNicholas Piggin    sys.exit(1)
60*846737f0SNicholas Piggin
61*846737f0SNicholas Pigginsys.exit(0)
62