| #!/usr/bin/env python3 |
| import subprocess |
| import urllib.request |
| import os |
| import re |
| import tempfile |
| import collections |
| import sys |
| |
| base = os.environ["SYSTEM_PULLREQUEST_TARGETBRANCH"] |
| if not re.match("^[0-9a-fA-F]{40}$", base): |
| base = "refs/remotes/origin/" + base |
| |
| with tempfile.TemporaryDirectory() as dfn: |
| patches = subprocess.check_output( |
| [ |
| "git", "format-patch", |
| "--output-directory", dfn, |
| os.environ["SYSTEM_PULLREQUEST_SOURCECOMMITID"], "^" + base |
| ], |
| universal_newlines=True).splitlines() |
| if len(patches) == 0: |
| sys.exit(0) |
| |
| ckp = os.path.join(dfn, "checkpatch.pl") |
| opener = urllib.request.build_opener() |
| opener.addheaders = [('User-agent', 'rdma-core/1.x (linux-rdma@vger.kernel.org)')] |
| urllib.request.install_opener(opener) |
| urllib.request.urlretrieve( |
| "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/scripts/checkpatch.pl", |
| ckp) |
| urllib.request.urlretrieve( |
| "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/scripts/spelling.txt", |
| os.path.join(dfn, "spelling.txt")) |
| os.symlink( |
| os.path.join(os.getcwd(), "buildlib/const_structs.checkpatch"), |
| os.path.join(dfn, "const_structs.checkpatch")) |
| checkpatch = [ |
| "perl", ckp, "--no-tree", "--ignore", |
| "PREFER_KERNEL_TYPES,FILE_PATH_CHANGES,EXECUTE_PERMISSIONS,USE_NEGATIVE_ERRNO,CONST_STRUCT", |
| "--emacs", "--mailback", "--quiet", "--no-summary" |
| ] |
| |
| failed = False |
| for fn in patches: |
| proc = subprocess.run( |
| checkpatch + [os.path.basename(fn)], |
| cwd=dfn, |
| stdout=subprocess.PIPE, |
| universal_newlines=True, |
| stderr=subprocess.STDOUT) |
| if proc.returncode == 0: |
| assert (not proc.stdout) |
| continue |
| sys.stdout.write(proc.stdout) |
| |
| failed = True |
| for g in re.finditer( |
| r"^\d+-.*:\d+: (\S+): (.*)(?:\n#(\d+): (?:FILE: (.*):(\d+):)?)?$", |
| proc.stdout, |
| flags=re.MULTILINE): |
| itms = {} |
| if g.group(1) == "WARNING": |
| itms["type"] = "warning" |
| else: |
| itms["type"] = "error" |
| if g.group(4): |
| itms["sourcepath"] = g.group(4) |
| itms["linenumber"] = g.group(5) |
| print("##vso[task.logissue %s]%s" % (";".join( |
| "%s=%s" % (k, v) |
| for k, v in sorted(itms.items())), g.group(2))) |
| |
| if failed: |
| print("##vso[task.complete result=SucceededWithIssues]]azp-checkpatch") |