@@ -2,7 +2,10 @@ mod config;
22mod i18n;
33mod utils;
44
5- use std:: { collections:: HashMap , path:: PathBuf } ;
5+ use std:: {
6+ collections:: { HashMap , HashSet } ,
7+ path:: PathBuf ,
8+ } ;
69
710use config:: { init_config, print_config} ;
811use i18n:: t;
@@ -26,6 +29,9 @@ fn run(root_path: PathBuf) -> Result<(), Box<dyn std::error::Error>> {
2629
2730 let mut result: HashMap < String , HashMap < String , Vec < LogInfo > > > = HashMap :: new ( ) ;
2831
32+ // Deduplicate logs by repoName and typeName
33+ let mut dedup_map: HashMap < String , HashMap < String , HashSet < String > > > = HashMap :: new ( ) ;
34+
2935 for repo_dir in & config. repos {
3036 // Get repo name
3137 let repo_name =
@@ -60,12 +66,23 @@ fn run(root_path: PathBuf) -> Result<(), Box<dyn std::error::Error>> {
6066 for log in filtered_logs {
6167 let log_info = format_log ( & log) ;
6268 let type_name = log_info. type_name . clone ( ) ;
63- result
69+
70+ // get HashSet of type_name in repo_name, if not exist, create a new one
71+ let type_set = dedup_map
6472 . entry ( repo_name. clone ( ) )
6573 . or_default ( )
66- . entry ( type_name)
67- . or_default ( )
68- . push ( log_info) ;
74+ . entry ( type_name. clone ( ) )
75+ . or_default ( ) ;
76+
77+ // if message not in type_set, push to result
78+ if type_set. insert ( log_info. message . clone ( ) ) {
79+ result
80+ . entry ( repo_name. clone ( ) )
81+ . or_default ( )
82+ . entry ( type_name)
83+ . or_default ( )
84+ . push ( log_info) ;
85+ }
6986 }
7087
7188 save_report_markdown ( & result, & root_path) ?;
0 commit comments