1616 parse_pytest_html ,
1717 parse_system_info ,
1818)
19+ from report_generators .regression_analyzer import analyze_regressions
1920
2021
2122def collect_pytest_reports (pytest_dir ):
@@ -61,22 +62,25 @@ def collect_gtest_reports(gtest_dir):
6162
6263
6364def collect_system_info (system_info_dir ):
64- """Collect and parse system information files."""
65- system_info_list = []
66-
65+ """Collect and parse system information files, deduplicated by hostname."""
6766 if not system_info_dir or not Path (system_info_dir ).exists ():
68- return system_info_list
67+ return []
6968
7069 info_files = list (Path (system_info_dir ).rglob ("system_info.txt" ))
7170 print (f"Found { len (info_files )} system info files" )
7271
72+ seen = {} # hostname -> info dict
7373 for info_file in info_files :
7474 try :
7575 info = parse_system_info (info_file )
76- system_info_list .append (info )
76+ hostname = info .get ("hostname" , "unknown" )
77+ if hostname not in seen :
78+ seen [hostname ] = info
7779 except Exception as e :
7880 print (f"Error parsing { info_file } : { e } " )
7981
82+ system_info_list = list (seen .values ())
83+ print (f"Unique hosts: { len (system_info_list )} " )
8084 return system_info_list
8185
8286
@@ -93,6 +97,16 @@ def build_test_metadata(args):
9397 "gtest_run_number" : args .gtest_run_number ,
9498 "gtest_branch" : args .gtest_branch ,
9599 "gtest_run_url" : args .gtest_run_url ,
100+ "baseline_pytest_run_id" : args .baseline_pytest_run_id ,
101+ "baseline_pytest_run_date" : args .baseline_pytest_run_date ,
102+ "baseline_pytest_run_number" : args .baseline_pytest_run_number ,
103+ "baseline_pytest_branch" : args .baseline_pytest_branch ,
104+ "baseline_pytest_run_url" : args .baseline_pytest_run_url ,
105+ "baseline_gtest_run_id" : args .baseline_gtest_run_id ,
106+ "baseline_gtest_run_date" : args .baseline_gtest_run_date ,
107+ "baseline_gtest_run_number" : args .baseline_gtest_run_number ,
108+ "baseline_gtest_branch" : args .baseline_gtest_branch ,
109+ "baseline_gtest_run_url" : args .baseline_gtest_run_url ,
96110 }
97111
98112
@@ -123,6 +137,28 @@ def main():
123137 parser .add_argument ("--gtest-branch" , help = "GTest workflow branch" )
124138 parser .add_argument ("--gtest-run-url" , help = "GTest workflow run URL" )
125139
140+ # Baseline (regression comparison) arguments
141+ parser .add_argument (
142+ "--baseline-pytest-dir" ,
143+ help = "Directory containing baseline pytest HTML reports for regression comparison" ,
144+ )
145+ parser .add_argument (
146+ "--baseline-gtest-dir" ,
147+ help = "Directory containing baseline gtest log files for regression comparison" ,
148+ )
149+ parser .add_argument ("--baseline-pytest-run-id" , help = "Baseline pytest run ID" )
150+ parser .add_argument ("--baseline-pytest-run-date" , help = "Baseline pytest run date" )
151+ parser .add_argument (
152+ "--baseline-pytest-run-number" , help = "Baseline pytest run number"
153+ )
154+ parser .add_argument ("--baseline-pytest-branch" , help = "Baseline pytest branch" )
155+ parser .add_argument ("--baseline-pytest-run-url" , help = "Baseline pytest run URL" )
156+ parser .add_argument ("--baseline-gtest-run-id" , help = "Baseline gtest run ID" )
157+ parser .add_argument ("--baseline-gtest-run-date" , help = "Baseline gtest run date" )
158+ parser .add_argument ("--baseline-gtest-run-number" , help = "Baseline gtest run number" )
159+ parser .add_argument ("--baseline-gtest-branch" , help = "Baseline gtest branch" )
160+ parser .add_argument ("--baseline-gtest-run-url" , help = "Baseline gtest run URL" )
161+
126162 args = parser .parse_args ()
127163
128164 # Validate input directories
@@ -152,15 +188,51 @@ def main():
152188 print ("Error: No test data found in either pytest or gtest directories" )
153189 sys .exit (1 )
154190
191+ # Collect baseline data for regression comparison
192+ regression_data = None
193+ baseline_pytest_dir = args .baseline_pytest_dir
194+ baseline_gtest_dir = args .baseline_gtest_dir
195+
196+ if baseline_pytest_dir or baseline_gtest_dir :
197+ baseline_pytest = []
198+ baseline_gtest = []
199+ if baseline_pytest_dir and Path (baseline_pytest_dir ).exists ():
200+ print ("Collecting baseline pytest reports..." )
201+ baseline_pytest = collect_pytest_reports (baseline_pytest_dir )
202+ if baseline_gtest_dir and Path (baseline_gtest_dir ).exists ():
203+ print ("Collecting baseline gtest reports..." )
204+ baseline_gtest = collect_gtest_reports (baseline_gtest_dir )
205+
206+ if baseline_pytest or baseline_gtest :
207+ print ("Analyzing regressions..." )
208+ regression_data = analyze_regressions (
209+ pytest_data , gtest_data , baseline_pytest , baseline_gtest
210+ )
211+ print (
212+ f" Regressions: { len (regression_data ['regressions' ])} , "
213+ f"Fixes: { len (regression_data ['fixes' ])} , "
214+ f"New failures: { len (regression_data ['new_failures' ])} "
215+ )
216+
155217 # Generate reports
156218 print ("\n Generating Excel report..." )
157219 generate_excel_report (
158- pytest_data , gtest_data , args .output_excel , system_info_list , test_metadata
220+ pytest_data ,
221+ gtest_data ,
222+ args .output_excel ,
223+ system_info_list ,
224+ test_metadata ,
225+ regression_data ,
159226 )
160227
161228 print ("Generating HTML report..." )
162229 generate_html_report (
163- pytest_data , gtest_data , args .output_html , system_info_list , test_metadata
230+ pytest_data ,
231+ gtest_data ,
232+ args .output_html ,
233+ system_info_list ,
234+ test_metadata ,
235+ regression_data ,
164236 )
165237
166238 # Print summary
0 commit comments