11#!/usr/bin/env python3
22import argparse
33import os
4+ import re
45
56def read_file (path ):
67 with open (path , "r" , encoding = "utf-8" ) as f :
78 return f .readlines ()
89
10+ def normalize_boilerplate (boilerplate_lines ):
11+ """Convert boilerplate lines into regex patterns (supporting {YEAR})."""
12+ patterns = []
13+ for line in boilerplate_lines :
14+ # Escape everything for literal match
15+ pattern = re .escape (line .strip ())
16+ # Replace escaped placeholder with regex
17+ pattern = pattern .replace (r"\{YEAR\}" , r"\d{4}" )
18+ patterns .append (re .compile (f"^{ pattern } $" ))
19+ return patterns
20+
921def check_boilerplate (src_dir , boilerplate_path , exts = None ):
1022 boilerplate_lines = read_file (boilerplate_path )
11- boilerplate_stripped = [ line . strip () for line in boilerplate_lines ]
23+ boilerplate_patterns = normalize_boilerplate ( boilerplate_lines )
1224
1325 results = []
1426 for root , _ , files in os .walk (src_dir ):
@@ -18,12 +30,15 @@ def check_boilerplate(src_dir, boilerplate_path, exts=None):
1830 file_path = os .path .join (root , file )
1931 try :
2032 file_lines = read_file (file_path )
21- file_head = [line .strip () for line in file_lines [:len (boilerplate_lines )]]
33+ file_head = [line .strip () for line in file_lines [:len (boilerplate_patterns )]]
34+
35+ ok = True
36+ for line , pattern in zip (file_head , boilerplate_patterns ):
37+ if not pattern .match (line ):
38+ ok = False
39+ break
2240
23- if file_head == boilerplate_stripped :
24- results .append ((file_path , True ))
25- else :
26- results .append ((file_path , False ))
41+ results .append ((file_path , ok ))
2742 except Exception as e :
2843 results .append ((file_path , f"Error: { e } " ))
2944 return results
0 commit comments