From be35bb532f7bdca0d5f9d5edbdddb7dee286ba62 Mon Sep 17 00:00:00 2001 From: Mick Grove Date: Mon, 4 Aug 2025 12:32:19 -0700 Subject: [PATCH] added progress bar to s3 downloads, and attempting to fix linux-arm64 test failure due to code 143 --- .github/workflows/ci.yml | 2 ++ CHANGELOG.md | 1 + src/scanner/repos.rs | 23 ++++++++++++++++++++++- src/scanner/runner.rs | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 389b9c3..27e1f98 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,8 @@ jobs: run: make ubuntu-arm64 - name: Run tests run: make tests + env: + CARGO_BUILD_JOBS: 1 macos-arm64: name: macOS arm64 diff --git a/CHANGELOG.md b/CHANGELOG.md index 6483f58..59f655a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. ## [1.32.0] - Added support for scanning AWS S3 buckets via `--s3-bucket` and optional `--s3-prefix` - Added `--role-arn` and `--aws-local-profile` flags for S3 authentication alongside `KF_AWS_KEY`/`KF_AWS_SECRET` +- Added progress bar for scanning s3 buckets - Refactored output reporting and formatting logic ## [1.31.0] diff --git a/src/scanner/repos.rs b/src/scanner/repos.rs index 59bc536..ffa29ea 100644 --- a/src/scanner/repos.rs +++ b/src/scanner/repos.rs @@ -300,6 +300,7 @@ pub async fn fetch_s3_objects( matcher_stats: &Mutex, enable_profiling: bool, shared_profiler: Arc, + progress_enabled: bool, ) -> Result<()> { let Some(bucket) = args.input_specifier_args.s3_bucket.as_deref() else { return Ok(()); @@ -320,9 +321,25 @@ pub async fn fetch_s3_objects( )?; let guesser = Guesser::new().expect("should be able to create filetype guesser"); let mut processor = BlobProcessor { matcher, guesser }; + + let progress = if progress_enabled { + let style = + ProgressStyle::with_template("{spinner} {msg} ({pos} objects) [{elapsed_precise}]") + .expect("progress bar style template should compile"); + let pb = ProgressBar::new_spinner().with_style(style).with_message("Fetching S3 objects"); + pb.enable_steady_tick(Duration::from_millis(500)); + pb + } else { + ProgressBar::hidden() + }; + + let bucket_name = bucket.to_string(); + let pb = progress.clone(); + + let bucket_name = bucket.to_string(); - s3::visit_bucket_objects(bucket, prefix, role_arn, profile, |key, bytes| { + s3::visit_bucket_objects(bucket, prefix, role_arn, profile, move |key, bytes| { let origin = OriginSet::new( Origin::from_extended(serde_json::json!({ "path": format!("s3://{}/{}", bucket_name, key) @@ -348,9 +365,13 @@ pub async fn fetch_s3_objects( let added = datastore.lock().unwrap().record(batch, !args.no_dedup); debug!("Added {} new S3 blobs", added); } + pb.inc(1); Ok(()) }) .await?; + let total = progress.position(); + progress.finish_with_message(format!("Fetched {} S3 objects", total)); + Ok(()) } diff --git a/src/scanner/runner.rs b/src/scanner/runner.rs index 33dc644..10b6e51 100644 --- a/src/scanner/runner.rs +++ b/src/scanner/runner.rs @@ -107,6 +107,7 @@ pub async fn run_async_scan( &matcher_stats, enable_profiling, Arc::clone(&shared_profiler), + progress_enabled, ) .await?;