From 6963c30f15aabd7350f2d23d08cbf0431c978529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E4=BA=8E=E6=96=8C?= <1931127624@qq.com> Date: Wed, 17 Jun 2020 11:19:22 +0800 Subject: [PATCH] [workflow] Improve PR title checker for the release tag (#1244) * [skip ci] [workflow] Improve PR title checker for the release tag * [skip ci] enforce code format * [skip ci] Apply suggestions from code review Co-authored-by: Yuanming Hu Co-authored-by: Taichi Gardener Co-authored-by: Yuanming Hu --- .github/workflows/persubmit.yml | 1 + misc/check_pr_title.py | 48 +++++++++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/.github/workflows/persubmit.yml b/.github/workflows/persubmit.yml index f3d9af475fc55..ff7a621ffcd9f 100644 --- a/.github/workflows/persubmit.yml +++ b/.github/workflows/persubmit.yml @@ -81,6 +81,7 @@ jobs: - name: Run PR Title Checker run: | + pip install semver GitPython python misc/check_pr_title.py "$PR_TITLE" env: PR_TITLE: ${{ github.event.pull_request.title }} diff --git a/misc/check_pr_title.py b/misc/check_pr_title.py index e93f91cf3d1b3..06588faa552a2 100644 --- a/misc/check_pr_title.py +++ b/misc/check_pr_title.py @@ -1,4 +1,18 @@ -import sys, os, json +import sys, os, json, semver, git + + +def get_old_ver(): + repo = git.Repo('.') + for c in repo.iter_commits('master', max_count=200): + if c.summary.startswith('[release]'): + ver = c.summary.split(']', maxsplit=1)[1] + if ver[0] == 'v': + ver = ver[1:] + ver = ver.split(' ')[0] + oldver = semver.VersionInfo.parse(ver) + return oldver + raise ValueError('Could not find an old version!') + title = sys.argv[1] print(f'Checking PR title: {title}') @@ -26,10 +40,6 @@ if x[1] == ' ': exit(f'Extra space before: {x[2:]}') -x = title.split(']')[-1].strip() -if x[0].islower(): - exit(f'PR title should be uppercase at: {x}') - had_upper = False for x in title.split('] ')[:-1]: if x[0] != '[': @@ -43,4 +53,32 @@ exit(f'At most 1 uppercase tag expected, got: [{x[1:]}]') had_upper = True +is_release = False +for x in title.split('] ')[:-1]: + x = x[1:] + if x.lower() == 'release': + is_release = True + if not x.islower(): + exit(f'[release] must be lowercase, got: [{x}]') + +if is_release: + ts = title.split(']') + if len(ts) != 2: + exit(f'Release PRs must have only one tag "[release]", got: {title}') + ver = ts[1][1:] + if ver[0] != 'v': + exit(f'Release version must start with "v", got: {ver}') + ver = ver[1:] + try: + ver = semver.VersionInfo.parse(ver) + except ValueError: + exit(f'Invalid SemVer version: {ver}') + oldver = get_old_ver() + if ver not in [oldver.bump_minor(), oldver.bump_patch()]: + exit(f'Version bump incorrect: {oldver} -> {ver}') +else: + x = title.split(']')[-1].strip() + if x[0].islower(): + exit(f'PR titles must start with uppercase letters: {x}') + print('OK!')