@@ -96,34 +96,53 @@ pub(crate) async fn build_details_handler(
96
96
( output, Vec :: new ( ) , None )
97
97
} else {
98
98
let prefix = format ! ( "build-logs/{}/" , id) ;
99
+ let all_log_filenames: Vec < _ > = storage
100
+ . list_prefix ( & prefix) // the result from S3 is ordered by key
101
+ . await
102
+ . map_ok ( |path| {
103
+ path. strip_prefix ( & prefix)
104
+ . expect ( "since we query for the prefix, it has to be always there" )
105
+ . to_owned ( )
106
+ } )
107
+ . try_collect ( )
108
+ . await ?;
109
+
110
+ let fetch_file = |filename : String | async {
111
+ let file = File :: from_path ( & storage, & format ! ( "{prefix}{filename}" ) , & config) . await ?;
112
+ Ok :: < _ , anyhow:: Error > ( String :: from_utf8 ( file. 0 . content ) . context ( "non utf8" ) ?)
113
+ } ;
99
114
100
- if let Some ( current_filename) = params
101
- . filename
102
- . or ( row. default_target . map ( |target| format ! ( "{}.txt" , target) ) )
103
- {
104
- let path = format ! ( "{prefix}{current_filename}" ) ;
105
- let file = File :: from_path ( & storage, & path, & config) . await ?;
115
+ let ( filename, file_content) = if let Some ( filename) = params. filename {
116
+ ( Some ( filename. clone ( ) ) , fetch_file ( filename. clone ( ) ) . await ?)
117
+ } else if let Some ( default_target) = row. default_target {
118
+ let filename = format ! ( "{default_target}.txt" ) ;
106
119
(
107
- String :: from_utf8 ( file. 0 . content ) . context ( "non utf8" ) ?,
108
- storage
109
- . list_prefix ( & prefix) // the result from S3 is ordered by key
110
- . await
111
- . map_ok ( |path| {
112
- path. strip_prefix ( & prefix)
113
- . expect ( "since we query for the prefix, it has to be always there" )
114
- . to_owned ( )
115
- } )
116
- . try_collect ( )
117
- . await ?,
118
- Some ( current_filename) ,
120
+ Some ( filename) ,
121
+ match fetch_file ( filename. clone ( ) ) . await {
122
+ Ok ( content) => content,
123
+ Err ( _err) => "" . to_string ( ) ,
124
+ } ,
119
125
)
120
126
} else {
121
- // this can only happen when `releases.default_target` is NULL,
122
- // which is the case for in-progress builds or builds which errored
123
- // before we could determine the target.
124
- // For the "error" case we show `row.errors`, which should contain what we need to see.
125
- ( "" . into ( ) , Vec :: new ( ) , None )
126
- }
127
+ ( None , "" . into ( ) )
128
+ } ;
129
+
130
+ // .or(row.default_target.map(|target| format!("{}.txt", target)))
131
+ // {
132
+ // let path = format!("{prefix}{current_filename}");
133
+ // let file = File::from_path(&storage, &path, &config).await?;
134
+ // (
135
+ // String::from_utf8(file.0.content).context("non utf8")?,
136
+ // Some(current_filename),
137
+ // )
138
+ // } else {
139
+ // // this can only happen when `releases.default_target` is NULL,
140
+ // // which is the case for in-progress builds or builds which errored
141
+ // // before we could determine the target.
142
+ // // For the "error" case we show `row.errors`, which should contain what we need to see.
143
+ // ("".into(), Vec::new(), None)
144
+ // }
145
+ ( file_content, all_log_filenames, filename)
127
146
} ;
128
147
129
148
Ok ( BuildDetailsPage {
0 commit comments