Write container fetch progress to standard output.
(mut config: LayerProgressConfig)
| 231 | |
| 232 | /// Write container fetch progress to standard output. |
| 233 | async fn handle_layer_progress_print(mut config: LayerProgressConfig) -> ProgressWriter { |
| 234 | let start = std::time::Instant::now(); |
| 235 | let mut total_read = 0u64; |
| 236 | let bar = indicatif::MultiProgress::new(); |
| 237 | if config.quiet { |
| 238 | bar.set_draw_target(indicatif::ProgressDrawTarget::hidden()); |
| 239 | } |
| 240 | let layers_bar = bar.add(indicatif::ProgressBar::new( |
| 241 | config.n_layers_to_fetch.try_into().unwrap(), |
| 242 | )); |
| 243 | let byte_bar = bar.add(indicatif::ProgressBar::new(0)); |
| 244 | // let byte_bar = indicatif::ProgressBar::new(0); |
| 245 | // byte_bar.set_draw_target(indicatif::ProgressDrawTarget::hidden()); |
| 246 | layers_bar.set_style( |
| 247 | indicatif::ProgressStyle::default_bar() |
| 248 | .template("{prefix} {bar} {pos}/{len} {wide_msg}") |
| 249 | .unwrap(), |
| 250 | ); |
| 251 | let taskname = "Fetching layers"; |
| 252 | layers_bar.set_prefix(taskname); |
| 253 | layers_bar.set_message(""); |
| 254 | byte_bar.set_prefix("Fetching"); |
| 255 | byte_bar.set_style( |
| 256 | indicatif::ProgressStyle::default_bar() |
| 257 | .template( |
| 258 | " └ {prefix} {bar} {binary_bytes}/{binary_total_bytes} ({binary_bytes_per_sec}) {wide_msg}", |
| 259 | ) |
| 260 | .unwrap() |
| 261 | ); |
| 262 | |
| 263 | let mut subtasks = vec![]; |
| 264 | let mut subtask: SubTaskBytes = Default::default(); |
| 265 | loop { |
| 266 | tokio::select! { |
| 267 | // Always handle layer changes first. |
| 268 | biased; |
| 269 | layer = config.layers.recv() => { |
| 270 | if let Some(l) = layer { |
| 271 | let layer = descriptor_of_progress(&l); |
| 272 | let layer_type = prefix_of_progress(&l); |
| 273 | let short_digest = &layer.digest().digest()[0..21]; |
| 274 | let layer_size = layer.size(); |
| 275 | if l.is_starting() { |
| 276 | // Reset the progress bar |
| 277 | byte_bar.reset_elapsed(); |
| 278 | byte_bar.reset_eta(); |
| 279 | byte_bar.set_length(layer_size); |
| 280 | byte_bar.set_message(format!("{layer_type} {short_digest}")); |
| 281 | |
| 282 | subtask = SubTaskBytes { |
| 283 | subtask: layer_type.into(), |
| 284 | description: format!("{layer_type}: {short_digest}").clone().into(), |
| 285 | id: short_digest.to_string().clone().into(), |
| 286 | bytes_cached: 0, |
| 287 | bytes: 0, |
| 288 | bytes_total: layer_size, |
| 289 | }; |
| 290 | } else { |
no test coverage detected