@@ -44,7 +44,11 @@ struct Event {
44
44
45
45
#[ derive( StructOpt , Debug ) ]
46
46
struct Opt {
47
+ #[ structopt( required_unless = "dir" ) ]
47
48
file_prefix : Vec < PathBuf > ,
49
+ /// all event trace files in dir will be merged to one chrome_profiler.json file
50
+ #[ structopt( long = "dir" ) ]
51
+ dir : Option < PathBuf > ,
48
52
/// collapse threads without overlapping events
49
53
#[ structopt( long = "collapse-threads" ) ]
50
54
collapse_threads : bool ,
@@ -120,7 +124,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
120
124
121
125
let mut seq = serializer. serialize_seq ( None ) ?;
122
126
123
- for file_prefix in opt. file_prefix . iter ( ) {
127
+ let dir_paths = file_prefixes_in_dir ( & opt) ?;
128
+
129
+ for file_prefix in opt. file_prefix . iter ( ) . chain ( dir_paths. iter ( ) ) {
124
130
let data = ProfilingData :: new ( & file_prefix) ?;
125
131
126
132
let thread_to_collapsed_thread = generate_thread_to_collapsed_thread_mapping ( & opt, & data) ;
@@ -191,6 +197,20 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
191
197
Ok ( ( ) )
192
198
}
193
199
200
+ fn file_prefixes_in_dir ( opt : & Opt ) -> Result < Vec < PathBuf > , std:: io:: Error > {
201
+ let mut result = Vec :: new ( ) ;
202
+ if let Some ( dir_path) = & opt. dir {
203
+ for entry in fs:: read_dir ( dir_path) ? {
204
+ let entry = entry?;
205
+ let path = entry. path ( ) ;
206
+ if path. extension ( ) . filter ( |e| * e == "events" ) . is_some ( ) {
207
+ result. push ( path)
208
+ }
209
+ }
210
+ }
211
+ Ok ( result)
212
+ }
213
+
194
214
fn timestamp_to_min_max ( timestamp : Timestamp ) -> ( SystemTime , SystemTime ) {
195
215
match timestamp {
196
216
Timestamp :: Instant ( t) => ( t, t) ,
0 commit comments