From 5a07de78af59de2b0b7c14fb9ccb1f0a63b191aa Mon Sep 17 00:00:00 2001 From: ooooo <3164076421@qq.com> Date: Sat, 12 Apr 2025 22:04:43 +0800 Subject: [PATCH 1/9] refine check_api_label_cn --- ci_scripts/check_api_label_cn.py | 119 ++++++++++++++++++++----------- ci_scripts/check_api_label_cn.sh | 4 +- 2 files changed, 78 insertions(+), 45 deletions(-) diff --git a/ci_scripts/check_api_label_cn.py b/ci_scripts/check_api_label_cn.py index 6d8e0b71fde..9af1e862b97 100644 --- a/ci_scripts/check_api_label_cn.py +++ b/ci_scripts/check_api_label_cn.py @@ -1,6 +1,7 @@ +from __future__ import annotations + import argparse import logging -import os import re import sys from pathlib import Path @@ -21,15 +22,15 @@ # check file's api_label -def check_api_label(rootdir, file): - real_file = Path(rootdir) / file +def check_api_label(doc_root: str, file: str) -> bool: + real_file = Path(doc_root) / file with open(real_file, "r", encoding="utf-8") as f: first_line = f.readline().strip() - return first_line == generate_en_label_by_path(file) + return first_line == generate_cn_label_by_path(file) # path -> api_label (the first line's style) -def generate_en_label_by_path(file): +def generate_cn_label_by_path(file: str) -> str: result = file.removesuffix("_cn.rst") result = "_".join(Path(result).parts) result = f".. _cn_{result}:" @@ -37,26 +38,27 @@ def generate_en_label_by_path(file): # traverse doc/api to append api_label in list -def find_all_api_labels_in_dir(rootdir): +def find_all_api_labels_in_dir(api_root: str) -> list[str]: all_api_labels = [] - for root, dirs, files in os.walk(rootdir + API): - for file in files: - real_path = Path(root) / file - path = str(real_path).removeprefix(rootdir) - if not should_test(path): - continue - for label in find_api_labels_in_one_file(real_path): - all_api_labels.append(label) + + for file_path in Path(api_root).rglob("*.rst"): + if not file_path.is_file(): + continue + path = str(file_path).removeprefix(api_root.removesuffix(API)) + if not need_check(path): + continue + for label in find_api_labels_in_file(file_path): + all_api_labels.append(label) return all_api_labels # api_labels in a file -def find_api_labels_in_one_file(file_path): +def find_api_labels_in_file(file_path: Path | str) -> list[str]: api_labels_in_one_file = [] with open(file_path, "r", encoding="utf-8") as f: lines = f.readlines() for line in lines: - line = re.search(".. _([a-zA-Z0-9_]+)", line) + line = re.search(".. _cn_api_paddle_([a-zA-Z0-9_]+)", line) if not line: continue api_labels_in_one_file.append(line.group(1)) @@ -64,7 +66,7 @@ def find_api_labels_in_one_file(file_path): # api doc for checking -def should_test(file): +def need_check(file: str) -> bool: return ( file.endswith("_cn.rst") and not Path(file).name == "Overview_cn.rst" @@ -73,18 +75,11 @@ def should_test(file): ) -def run_cn_api_label_checking(rootdir, files): +def check_usage_of_api_label( + files: list[Path], valid_api_labels: list[str] +) -> bool: for file in files: - if should_test(file) and not check_api_label(rootdir, file): - logger.error( - f"The first line in {rootdir}/{file} is not avaiable, please re-check it!" - ) - sys.exit(1) - valid_api_labels = find_all_api_labels_in_dir(rootdir) - for file in files: - if not file.endswith(".rst"): - continue - with open(Path(rootdir) / file, "r", encoding="utf-8") as f: + with open(file, "r", encoding="utf-8") as f: pattern = f.read() matches = re.findall(r":ref:`([^`]+)`", pattern) for match in matches: @@ -93,14 +88,53 @@ def run_cn_api_label_checking(rootdir, files): r".+<(?P.+?)>", api_label ): api_label = api_label_match.group("api_label") - if ( - api_label.startswith("cn_api_paddle") - and api_label not in valid_api_labels - ): - logger.error( - f"Found api label {api_label} in {rootdir}/{file}, but it is not a valid api label, please re-check it!" - ) - sys.exit(1) + if not api_label.startswith("cn_api_paddle"): + continue + if api_label in valid_api_labels: + continue + logger.error( + f"Found api label {api_label} in {file}, but it is not a valid api label, please re-check it!" + ) + return False + return True + + +def get_custom_files_for_checking_usage(doc_root: str) -> set[Path]: + # TODO: add more dir for checking + custom_files = set() + for file_path in Path(doc_root) / API.rglob("*.rst"): + if not file_path.is_file(): + continue + custom_files.append(file_path) + return custom_files + + +def run_cn_api_label_checking( + doc_root: str, api_root: str, files: list[str] +) -> None: + # check the api_label in the first line for increased files + for file in files: + if need_check(file) and not check_api_label(doc_root, file): + logger.error( + f"The first line in {doc_root}/{file} is not avaiable, please re-check it!" + ) + sys.exit(1) + + # collect all api_labels in api_root + valid_api_labels = find_all_api_labels_in_dir(api_root) + + # check the usage of api_label in custom files + api_label_usage_file_set = {Path(doc_root) / file for file in files} + api_label_usage_file_set.update( + get_custom_files_for_checking_usage(doc_root) + ) + + passed = check_usage_of_api_label( + api_label_usage_file_set, valid_api_labels + ) + if not passed: + sys.exit(1) + print("All api_label check success in PR !") @@ -110,16 +144,16 @@ def parse_args(): """ parser = argparse.ArgumentParser(description="cn api_label checking") parser.add_argument( - "rootdir", + "doc_root", help="the dir DOCROOT", type=str, default="/FluidDoc/docs/", ) parser.add_argument( - "apiroot", + "api_root", type=str, - help="the dir APIROOT", + help="the dir api_root", default="/FluidDoc/docs/api/", ) parser.add_argument( @@ -128,11 +162,10 @@ def parse_args(): nargs="*", help="files need to check", ) - args = parser.parse_args() - return args + return parser.parse_args() if __name__ == "__main__": args = parse_args() - API = args.apiroot.removeprefix(args.rootdir + "/") - run_cn_api_label_checking(args.rootdir, args.all_git_files) + API = args.doc_root.removesuffix(args.api_root) + run_cn_api_label_checking(args.doc_root, args.api_root, args.all_git_files) diff --git a/ci_scripts/check_api_label_cn.sh b/ci_scripts/check_api_label_cn.sh index 33d206420f8..3e41542504e 100644 --- a/ci_scripts/check_api_label_cn.sh +++ b/ci_scripts/check_api_label_cn.sh @@ -3,8 +3,8 @@ set -x FLUIDDOCDIR=${FLUIDDOCDIR:=/FluidDoc} -DOCROOT=${FLUIDDOCDIR}/docs/ -APIROOT=${DOCROOT}/api/ +DOCROOT=${FLUIDDOCDIR}/docs +APIROOT=${DOCROOT}/api SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )" source ${SCRIPT_DIR}/utils.sh From 4430e11272a08bf29578767ca514dc2a40552e0e Mon Sep 17 00:00:00 2001 From: ooo oo <106524776+ooooo-create@users.noreply.github.com> Date: Sat, 12 Apr 2025 22:08:23 +0800 Subject: [PATCH 2/9] Update ci_scripts/check_api_label_cn.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- ci_scripts/check_api_label_cn.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ci_scripts/check_api_label_cn.py b/ci_scripts/check_api_label_cn.py index 9af1e862b97..cd21fbd01c3 100644 --- a/ci_scripts/check_api_label_cn.py +++ b/ci_scripts/check_api_label_cn.py @@ -105,9 +105,7 @@ def get_custom_files_for_checking_usage(doc_root: str) -> set[Path]: for file_path in Path(doc_root) / API.rglob("*.rst"): if not file_path.is_file(): continue - custom_files.append(file_path) - return custom_files - + custom_files.add(file_path) def run_cn_api_label_checking( doc_root: str, api_root: str, files: list[str] From d844c0ebba407101f6bf50f8a15133fa11caaa8b Mon Sep 17 00:00:00 2001 From: ooo oo <106524776+ooooo-create@users.noreply.github.com> Date: Sat, 12 Apr 2025 22:08:41 +0800 Subject: [PATCH 3/9] Update ci_scripts/check_api_label_cn.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- ci_scripts/check_api_label_cn.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ci_scripts/check_api_label_cn.py b/ci_scripts/check_api_label_cn.py index cd21fbd01c3..984600a4e96 100644 --- a/ci_scripts/check_api_label_cn.py +++ b/ci_scripts/check_api_label_cn.py @@ -114,8 +114,7 @@ def run_cn_api_label_checking( for file in files: if need_check(file) and not check_api_label(doc_root, file): logger.error( - f"The first line in {doc_root}/{file} is not avaiable, please re-check it!" - ) + f"The first line in {doc_root}/{file} is not available, please re-check it!" sys.exit(1) # collect all api_labels in api_root From 004657aca9b7b3100be2776ba2797bea2ff21cf3 Mon Sep 17 00:00:00 2001 From: ooooo <3164076421@qq.com> Date: Sat, 12 Apr 2025 22:12:50 +0800 Subject: [PATCH 4/9] fix --- ci_scripts/check_api_label_cn.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci_scripts/check_api_label_cn.py b/ci_scripts/check_api_label_cn.py index 984600a4e96..9bc0cbea8b1 100644 --- a/ci_scripts/check_api_label_cn.py +++ b/ci_scripts/check_api_label_cn.py @@ -106,6 +106,8 @@ def get_custom_files_for_checking_usage(doc_root: str) -> set[Path]: if not file_path.is_file(): continue custom_files.add(file_path) + return custom_files + def run_cn_api_label_checking( doc_root: str, api_root: str, files: list[str] @@ -115,6 +117,7 @@ def run_cn_api_label_checking( if need_check(file) and not check_api_label(doc_root, file): logger.error( f"The first line in {doc_root}/{file} is not available, please re-check it!" + ) sys.exit(1) # collect all api_labels in api_root From 75511008727c30d201f681be3ed5bb23b7b64fd3 Mon Sep 17 00:00:00 2001 From: ooo oo <106524776+ooooo-create@users.noreply.github.com> Date: Sat, 12 Apr 2025 22:15:01 +0800 Subject: [PATCH 5/9] Update ci_scripts/check_api_label_cn.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- ci_scripts/check_api_label_cn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci_scripts/check_api_label_cn.py b/ci_scripts/check_api_label_cn.py index 9bc0cbea8b1..f1ce3e15b12 100644 --- a/ci_scripts/check_api_label_cn.py +++ b/ci_scripts/check_api_label_cn.py @@ -102,7 +102,7 @@ def check_usage_of_api_label( def get_custom_files_for_checking_usage(doc_root: str) -> set[Path]: # TODO: add more dir for checking custom_files = set() - for file_path in Path(doc_root) / API.rglob("*.rst"): + for file_path in (Path(doc_root) / API).rglob("*.rst"): if not file_path.is_file(): continue custom_files.add(file_path) From e7dc7e131facbe154c604d72847334d89e7c62d9 Mon Sep 17 00:00:00 2001 From: ooooo <3164076421@qq.com> Date: Sat, 12 Apr 2025 23:13:43 +0800 Subject: [PATCH 6/9] refine --- ci_scripts/check_api_label_cn.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ci_scripts/check_api_label_cn.py b/ci_scripts/check_api_label_cn.py index f1ce3e15b12..7e57b3335e5 100644 --- a/ci_scripts/check_api_label_cn.py +++ b/ci_scripts/check_api_label_cn.py @@ -77,7 +77,8 @@ def need_check(file: str) -> bool: def check_usage_of_api_label( files: list[Path], valid_api_labels: list[str] -) -> bool: +) -> list[str]: + errors = [] for file in files: with open(file, "r", encoding="utf-8") as f: pattern = f.read() @@ -92,11 +93,8 @@ def check_usage_of_api_label( continue if api_label in valid_api_labels: continue - logger.error( - f"Found api label {api_label} in {file}, but it is not a valid api label, please re-check it!" - ) - return False - return True + errors.append(f"api label `{api_label}` in `{file}`") + return errors def get_custom_files_for_checking_usage(doc_root: str) -> set[Path]: @@ -129,10 +127,13 @@ def run_cn_api_label_checking( get_custom_files_for_checking_usage(doc_root) ) - passed = check_usage_of_api_label( + errors = check_usage_of_api_label( api_label_usage_file_set, valid_api_labels ) - if not passed: + if errors: + logger.error("Found valid api labels usage as follows:") + for i, error in enumerate(errors): + logger.error(f"{i + 1}: {error}") sys.exit(1) print("All api_label check success in PR !") From 9c97c8ba7d55df61d3c000144b0ec34094a667a9 Mon Sep 17 00:00:00 2001 From: ooooo <3164076421@qq.com> Date: Sun, 13 Apr 2025 13:08:39 +0800 Subject: [PATCH 7/9] refine --- ci_scripts/check_api_label_cn.py | 137 ++++++++++++++++--------------- 1 file changed, 72 insertions(+), 65 deletions(-) diff --git a/ci_scripts/check_api_label_cn.py b/ci_scripts/check_api_label_cn.py index 7e57b3335e5..79ae5e57be1 100644 --- a/ci_scripts/check_api_label_cn.py +++ b/ci_scripts/check_api_label_cn.py @@ -6,6 +6,12 @@ import sys from pathlib import Path +# precompile regex patterns +CN_API_LABEL_PATTERN = re.compile(r".. _([a-zA-Z0-9_]+):") +REF_PATTERN = re.compile(r":ref:`([^`]+)`") +API_LABEL_EXTRACT_PATTERN = re.compile(r".+?<(?P.+?)>") +CN_API_PREFIX = "cn_api_paddle" + logger = logging.getLogger() if logger.handlers: # we assume the first handler is the one we want to configure @@ -21,75 +27,71 @@ logger.setLevel(logging.INFO) -# check file's api_label -def check_api_label(doc_root: str, file: str) -> bool: - real_file = Path(doc_root) / file - with open(real_file, "r", encoding="utf-8") as f: +def check_api_label(file_path: Path, doc_root: Path) -> bool: + """Check if the first line of the file matches the expected api_label format.""" + with open(file_path, "r", encoding="utf-8") as f: first_line = f.readline().strip() - return first_line == generate_cn_label_by_path(file) + return first_line == generate_cn_label(file_path, doc_root) -# path -> api_label (the first line's style) -def generate_cn_label_by_path(file: str) -> str: - result = file.removesuffix("_cn.rst") - result = "_".join(Path(result).parts) - result = f".. _cn_{result}:" - return result +def generate_cn_label(file_path: Path, doc_root: Path) -> str: + """Generate the expected api_label format from file path.""" + relative_path = file_path.relative_to(doc_root) + stem = relative_path.stem.removesuffix("_cn") + parts = relative_path.with_name(stem).parts + label = "_".join(parts) + return f".. _cn_{label}:" -# traverse doc/api to append api_label in list -def find_all_api_labels_in_dir(api_root: str) -> list[str]: - all_api_labels = [] - - for file_path in Path(api_root).rglob("*.rst"): - if not file_path.is_file(): +def collect_api_labels(api_root: Path) -> set[str]: + """Collect all valid api labels.""" + labels = set() + for rst_file in api_root.rglob("*.rst"): + if not rst_file.is_file(): continue - path = str(file_path).removeprefix(api_root.removesuffix(API)) - if not need_check(path): + if not need_check(rst_file, api_root): continue - for label in find_api_labels_in_file(file_path): - all_api_labels.append(label) - return all_api_labels + labels.update(extract_api_labels(rst_file)) + return labels -# api_labels in a file -def find_api_labels_in_file(file_path: Path | str) -> list[str]: - api_labels_in_one_file = [] +def extract_api_labels(file_path: Path) -> set[str]: + labels = set() with open(file_path, "r", encoding="utf-8") as f: lines = f.readlines() for line in lines: - line = re.search(".. _cn_api_paddle_([a-zA-Z0-9_]+)", line) - if not line: + match = CN_API_LABEL_PATTERN.search(line) + if not match: + continue + label = match.group(1) + if not label.startswith("cn_api_paddle"): continue - api_labels_in_one_file.append(line.group(1)) - return api_labels_in_one_file + labels.add(label) + return labels # api doc for checking -def need_check(file: str) -> bool: +def need_check(file_path: Path, api_root: Path) -> bool: return ( - file.endswith("_cn.rst") - and not Path(file).name == "Overview_cn.rst" - and not Path(file).name == "index_cn.rst" - and file.startswith(API) + file_path.name.endswith("_cn.rst") + and file_path.name not in {"Overview_cn.rst", "index_cn.rst"} + and file_path.is_relative_to(api_root) ) -def check_usage_of_api_label( - files: list[Path], valid_api_labels: list[str] +def validate_api_label_references( + files: list[Path], valid_api_labels: set[str] ) -> list[str]: errors = [] for file in files: with open(file, "r", encoding="utf-8") as f: - pattern = f.read() - matches = re.findall(r":ref:`([^`]+)`", pattern) + content = f.read() + matches = REF_PATTERN.findall(content) for match in matches: api_label = match - if api_label_match := re.match( - r".+<(?P.+?)>", api_label - ): + if api_label_match := API_LABEL_EXTRACT_PATTERN.match(api_label): api_label = api_label_match.group("api_label") - if not api_label.startswith("cn_api_paddle"): + if not api_label.startswith(CN_API_PREFIX): continue if api_label in valid_api_labels: continue @@ -97,43 +99,49 @@ def check_usage_of_api_label( return errors -def get_custom_files_for_checking_usage(doc_root: str) -> set[Path]: +def get_custom_files_for_checking_usage(api_root: Path) -> set[Path]: # TODO: add more dir for checking custom_files = set() - for file_path in (Path(doc_root) / API).rglob("*.rst"): - if not file_path.is_file(): + for rst_file in api_root.rglob("*.rst"): + if not rst_file.is_file(): continue - custom_files.add(file_path) + if rst_file.name in {"set_global_initializer_cn.rst"}: + # TODO: how to deal with `api_paddle_Tensor_create_tensor`? + continue + custom_files.add(rst_file) return custom_files def run_cn_api_label_checking( - doc_root: str, api_root: str, files: list[str] + doc_root: Path, api_root: Path, files: list[Path] ) -> None: + # get real path for changed files + real_path_files_set = {Path(doc_root) / file for file in files} + # check the api_label in the first line for increased files - for file in files: - if need_check(file) and not check_api_label(doc_root, file): + for file_path in real_path_files_set: + if need_check(file_path, api_root) and not check_api_label( + file_path, doc_root + ): logger.error( - f"The first line in {doc_root}/{file} is not available, please re-check it!" + f"The first line in {file_path} is not available, please re-check it!" ) sys.exit(1) # collect all api_labels in api_root - valid_api_labels = find_all_api_labels_in_dir(api_root) + valid_api_labels = collect_api_labels(api_root) # check the usage of api_label in custom files - api_label_usage_file_set = {Path(doc_root) / file for file in files} - api_label_usage_file_set.update( - get_custom_files_for_checking_usage(doc_root) + api_label_usage_file_set = ( + real_path_files_set | get_custom_files_for_checking_usage(doc_root) ) - errors = check_usage_of_api_label( + if errors := validate_api_label_references( api_label_usage_file_set, valid_api_labels - ) - if errors: + ): logger.error("Found valid api labels usage as follows:") - for i, error in enumerate(errors): - logger.error(f"{i + 1}: {error}") + for i, error in enumerate(errors, 1): + logger.error(f"{i}: {error}") sys.exit(1) print("All api_label check success in PR !") @@ -146,20 +154,20 @@ def parse_args(): parser = argparse.ArgumentParser(description="cn api_label checking") parser.add_argument( "doc_root", + type=Path, help="the dir DOCROOT", - type=str, - default="/FluidDoc/docs/", + default=Path("/FluidDoc/docs"), ) parser.add_argument( "api_root", - type=str, + type=Path, help="the dir api_root", - default="/FluidDoc/docs/api/", + default=Path("/FluidDoc/docs/api"), ) parser.add_argument( "all_git_files", - type=str, + type=Path, nargs="*", help="files need to check", ) @@ -168,5 +176,4 @@ def parse_args(): if __name__ == "__main__": args = parse_args() - API = args.doc_root.removesuffix(args.api_root) run_cn_api_label_checking(args.doc_root, args.api_root, args.all_git_files) From 39aee5031974639cf70173068e69dc7b02f64521 Mon Sep 17 00:00:00 2001 From: ooooo <3164076421@qq.com> Date: Mon, 14 Apr 2025 19:21:41 +0800 Subject: [PATCH 8/9] fix bugs --- ci_scripts/check_api_label_cn.py | 12 ++++++++++-- ci_scripts/check_api_label_cn.sh | 7 +++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/ci_scripts/check_api_label_cn.py b/ci_scripts/check_api_label_cn.py index 79ae5e57be1..c808b6c3102 100644 --- a/ci_scripts/check_api_label_cn.py +++ b/ci_scripts/check_api_label_cn.py @@ -116,7 +116,7 @@ def run_cn_api_label_checking( doc_root: Path, api_root: Path, files: list[Path] ) -> None: # get real path for changed files - real_path_files_set = {Path(doc_root) / file for file in files} + real_path_files_set = set(files) # check the api_label in the first line for increased files for file_path in real_path_files_set: @@ -132,8 +132,16 @@ def run_cn_api_label_checking( valid_api_labels = collect_api_labels(api_root) # check the usage of api_label in custom files + need_uasge_check_files = set() + for file_path in real_path_files_set: + if not file_path.is_relative_to(doc_root): + continue + if file_path.suffix != ".rst": + continue + need_uasge_check_files.add(file_path) + api_label_usage_file_set = ( - real_path_files_set | get_custom_files_for_checking_usage(doc_root) + need_uasge_check_files | get_custom_files_for_checking_usage(doc_root) ) if errors := validate_api_label_references( diff --git a/ci_scripts/check_api_label_cn.sh b/ci_scripts/check_api_label_cn.sh index 3e41542504e..c20d2626e18 100644 --- a/ci_scripts/check_api_label_cn.sh +++ b/ci_scripts/check_api_label_cn.sh @@ -13,7 +13,10 @@ if [ -z ${BRANCH} ]; then BRANCH="develop" fi -all_git_files=`git diff --name-only --diff-filter=ACMR upstream/${BRANCH} | sed 's#docs/##g'` +all_git_files=$(git diff --name-only --diff-filter=ACMR upstream/${BRANCH}) + +real_path_git_files=$(echo ${all_git_files} | sed "s|^|${FLUIDDOCDIR}/|g") + echo $all_git_files echo "Run API_LABEL Checking" -python check_api_label_cn.py ${DOCROOT} ${APIROOT} $all_git_files +python check_api_label_cn.py ${DOCROOT} ${APIROOT} $real_path_git_files From ca353e10cb6174aef7fdd9af1f31ae804301c9d4 Mon Sep 17 00:00:00 2001 From: ooooo <3164076421@qq.com> Date: Mon, 14 Apr 2025 20:11:33 +0800 Subject: [PATCH 9/9] refine --- ci_scripts/check_api_label_cn.py | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/ci_scripts/check_api_label_cn.py b/ci_scripts/check_api_label_cn.py index c808b6c3102..6496f60bf34 100644 --- a/ci_scripts/check_api_label_cn.py +++ b/ci_scripts/check_api_label_cn.py @@ -27,11 +27,14 @@ logger.setLevel(logging.INFO) -def check_api_label(file_path: Path, doc_root: Path) -> bool: +def check_api_label(file_path: Path, doc_root: Path) -> str | None: """Check if the first line of the file matches the expected api_label format.""" with open(file_path, "r", encoding="utf-8") as f: first_line = f.readline().strip() - return first_line == generate_cn_label(file_path, doc_root) + except_line = generate_cn_label(file_path, doc_root) + if first_line == except_line: + return None + return f"`{file_path}` first line is: `{first_line}`, but expected generated by path: `{except_line}`." def generate_cn_label(file_path: Path, doc_root: Path) -> str: @@ -118,15 +121,20 @@ def run_cn_api_label_checking( # get real path for changed files real_path_files_set = set(files) + errors = [] # check the api_label in the first line for increased files for file_path in real_path_files_set: - if need_check(file_path, api_root) and not check_api_label( - file_path, doc_root - ): - logger.error( - f"The first line in {file_path} is not available, please re-check it!" - ) - sys.exit(1) + if not need_check(file_path, api_root): + continue + if error := check_api_label(file_path, doc_root): + errors.append(error) + if errors: + logger.error( + "Found first line is not available as follows, please re-check it!" + ) + for i, error in enumerate(errors, 1): + logger.error(f"{i}: {error}") + sys.exit(1) # collect all api_labels in api_root valid_api_labels = collect_api_labels(api_root) @@ -147,7 +155,9 @@ def run_cn_api_label_checking( if errors := validate_api_label_references( api_label_usage_file_set, valid_api_labels ): - logger.error("Found valid api labels usage as follows:") + logger.error( + "Found valid api labels usage as follows, please re-check it!" + ) for i, error in enumerate(errors, 1): logger.error(f"{i}: {error}") sys.exit(1)