@@ -84,13 +84,17 @@ def print_box_message(msg):
8484 print ('=' * 80 )
8585
8686
87+ def str_len (x ):
88+ return len (str (x ))
89+
90+
8791def list_jar_file_under_lib_dirs (lib_dirs , recursive ):
8892 jar_files = set ()
8993
90- idx_str_max_len = len ( str ( len (lib_dirs ) ))
94+ max_idx_str_len = str_len ( len (lib_dirs ))
9195 for idx , lib_dir in enumerate (lib_dirs , start = 1 ):
9296 print_responsive_message ('list jar file under lib dir(%*s/%s): %s' % (
93- idx_str_max_len , idx , len (lib_dirs ), lib_dir ))
97+ max_idx_str_len , idx , len (lib_dirs ), lib_dir ))
9498
9599 if not exists (lib_dir ):
96100 print_error ('WARN: lib dir %s not exists, ignored!' % lib_dir )
@@ -126,7 +130,7 @@ def list_class_under_jar_file(jar_file, recursive, progress):
126130 if recursive :
127131 index_marker = ' #%3s' % index
128132 print_responsive_message ('list class under jar file(%*s/%s%s): %s' % (
129- len ( str ( progress [1 ]) ), progress [0 ], progress [1 ], index_marker , jar_jar_path ))
133+ str_len ( progress [1 ]), progress [0 ], progress [1 ], index_marker , jar_jar_path ))
130134
131135 ret = {}
132136 classes = {f for f in zf .namelist () if f .lower ().endswith ('.class' )}
@@ -155,7 +159,7 @@ def list_class_under_jar_file(jar_file, recursive, progress):
155159
156160def list_class_under_class_dir (class_dir , progress ):
157161 print_responsive_message ('list class under class dir(%*s/%s): %s' % (
158- len ( str ( progress [1 ]) ), progress [0 ], progress [1 ], class_dir ))
162+ str_len ( progress [1 ]), progress [0 ], progress [1 ], class_dir ))
159163
160164 if not exists (class_dir ):
161165 print_error ('WARN: class dir %s not exists, ignored!' % class_dir )
@@ -215,7 +219,7 @@ def find_duplicate_classes(class_to_class_paths):
215219 return class_paths_to_duplicate_classes
216220
217221
218- def print_duplicate_classes_info (class_paths_to_duplicate_classes ):
222+ def print_duplicate_classes_info (class_paths_to_duplicate_classes , class_path_to_classes ):
219223 if not class_paths_to_duplicate_classes :
220224 print ('COOL! No duplicate classes found!' )
221225 return
@@ -244,34 +248,37 @@ def print_duplicate_classes_info(class_paths_to_duplicate_classes):
244248 # use - operator of number key for reverse sort key
245249 class_paths_to_duplicate_classes .sort (key = lambda item : (- len (item [0 ]), - len (item [1 ]), item [0 ]))
246250
247- idx_str_max_len = len ( str ( len (class_paths_to_duplicate_classes ) ))
251+ max_idx_str_len = str_len ( len (class_paths_to_duplicate_classes ))
248252 for idx , (class_paths , classes ) in enumerate (class_paths_to_duplicate_classes , start = 1 ):
249- print ('[%*s] found %s duplicate classes in %s class paths:' % (
250- idx_str_max_len , idx , len (classes ), len (class_paths )))
253+ duplicate_ratio = len (classes ) / min ((len (class_path_to_classes [cp ]) for cp in class_paths ))
254+ print ('[%*s] found %s(%.3g%%) duplicate classes in %s class paths:' % (
255+ max_idx_str_len , idx , len (classes ), duplicate_ratio * 100 , len (class_paths )))
251256
252- class_path_idx_str_max_len = len (str (len (class_paths )))
257+ max_class_path_idx_str_len = str_len (len (class_paths ))
258+ max_classes_count_str_len = str_len (max (len (class_path_to_classes [cp ]) for cp in class_paths ))
253259 for i , cp in enumerate (class_paths , start = 1 ):
254- print (' %*s: %s' % (class_path_idx_str_max_len , i , cp ))
260+ print (' %*s: (contain %*s classes) %s' % (
261+ max_class_path_idx_str_len , i , max_classes_count_str_len , len (class_path_to_classes [cp ]), cp ))
255262
256263 print_box_message ('Duplicate classes detail info:' )
257264 for idx , (class_paths , classes ) in enumerate (class_paths_to_duplicate_classes , start = 1 ):
258265 print ('[%*s] found %s duplicate classes in %s class paths %s :' % (
259- idx_str_max_len , idx ,
260- len (classes ), len (class_paths ), ' ' .join (class_paths )))
266+ max_idx_str_len , idx , len (classes ), len (class_paths ), ' ' .join (class_paths )))
261267
262- class_idx_str_max_len = len ( str ( len (classes ) ))
268+ max_class_idx_str_len = str_len ( len (classes ))
263269 for i , c in enumerate (classes , start = 1 ):
264- print (' %*s: %s' % (class_idx_str_max_len , i , c ))
265-
270+ print (' %*s: %s' % (max_class_idx_str_len , i , c ))
266271
267- def print_class_paths_info (class_paths ):
268- class_paths = sorted (class_paths )
269272
270- print_box_message ('Find in %s class paths:' % len (class_paths ))
273+ def print_class_paths_info (class_path_to_classes ):
274+ max_idx_str_len = str_len (len (class_path_to_classes ))
275+ max_classes_count_str_len = str_len (max (len (classes ) for classes in class_path_to_classes .values ()))
271276
272- idx_str_max_len = len (str (len (class_paths )))
273- for idx , class_path in enumerate (class_paths , start = 1 ):
274- print ('%*s: %s' % (idx_str_max_len , idx , class_path ))
277+ class_path_to_classes = sorted (class_path_to_classes .items (), key = lambda item : item [0 ])
278+ print_box_message ('Find in %s class paths:' % len (class_path_to_classes ))
279+ for idx , (cp , classes ) in enumerate (class_path_to_classes , start = 1 ):
280+ print ('%*s: (contain %*s classes) %s' % (
281+ max_idx_str_len , idx , max_classes_count_str_len , len (classes ), cp ))
275282
276283
277284def main ():
@@ -311,8 +318,8 @@ def main():
311318 class_paths_to_duplicate_classes = find_duplicate_classes (class_to_class_paths )
312319
313320 clear_responsive_message ()
314- print_duplicate_classes_info (class_paths_to_duplicate_classes )
315- print_class_paths_info (class_path_to_classes . keys () )
321+ print_duplicate_classes_info (class_paths_to_duplicate_classes , class_path_to_classes )
322+ print_class_paths_info (class_path_to_classes )
316323
317324 return int (bool (class_paths_to_duplicate_classes ))
318325
0 commit comments