Skip to content

Commit 6b8234a

Browse files
Wenxin-Jiangclaude
andcommitted
fix: surface find_by_purls errors instead of silently swallowing them
Replace all `if let Ok(packages) = crawler.find_by_purls(...)` with `match` blocks that log warnings on Err when not in silent mode. Previously, per-path crawler failures (corrupt manifests, permission denied, etc.) were silently dropped, causing packages to vanish from discovery without any diagnostic output. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c295ef3 commit 6b8234a

File tree

1 file changed

+165
-81
lines changed

1 file changed

+165
-81
lines changed

crates/socket-patch-cli/src/ecosystem_dispatch.rs

Lines changed: 165 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,16 @@ pub async fn find_packages_for_purls(
6060
}
6161
}
6262
for nm_path in &nm_paths {
63-
if let Ok(packages) = npm_crawler.find_by_purls(nm_path, npm_purls).await {
64-
for (purl, pkg) in packages {
65-
all_packages.entry(purl).or_insert(pkg.path);
63+
match npm_crawler.find_by_purls(nm_path, npm_purls).await {
64+
Ok(packages) => {
65+
for (purl, pkg) in packages {
66+
all_packages.entry(purl).or_insert(pkg.path);
67+
}
68+
}
69+
Err(e) => {
70+
if !silent {
71+
eprintln!("Warning: Failed to scan {}: {}", nm_path.display(), e);
72+
}
6673
}
6774
}
6875
}
@@ -90,11 +97,16 @@ pub async fn find_packages_for_purls(
9097
match python_crawler.get_site_packages_paths(options).await {
9198
Ok(sp_paths) => {
9299
for sp_path in &sp_paths {
93-
if let Ok(packages) =
94-
python_crawler.find_by_purls(sp_path, &base_pypi_purls).await
95-
{
96-
for (purl, pkg) in packages {
97-
all_packages.entry(purl).or_insert(pkg.path);
100+
match python_crawler.find_by_purls(sp_path, &base_pypi_purls).await {
101+
Ok(packages) => {
102+
for (purl, pkg) in packages {
103+
all_packages.entry(purl).or_insert(pkg.path);
104+
}
105+
}
106+
Err(e) => {
107+
if !silent {
108+
eprintln!("Warning: Failed to scan {}: {}", sp_path.display(), e);
109+
}
98110
}
99111
}
100112
}
@@ -121,11 +133,16 @@ pub async fn find_packages_for_purls(
121133
}
122134
}
123135
for src_path in &src_paths {
124-
if let Ok(packages) =
125-
cargo_crawler.find_by_purls(src_path, cargo_purls).await
126-
{
127-
for (purl, pkg) in packages {
128-
all_packages.entry(purl).or_insert(pkg.path);
136+
match cargo_crawler.find_by_purls(src_path, cargo_purls).await {
137+
Ok(packages) => {
138+
for (purl, pkg) in packages {
139+
all_packages.entry(purl).or_insert(pkg.path);
140+
}
141+
}
142+
Err(e) => {
143+
if !silent {
144+
eprintln!("Warning: Failed to scan {}: {}", src_path.display(), e);
145+
}
129146
}
130147
}
131148
}
@@ -151,11 +168,16 @@ pub async fn find_packages_for_purls(
151168
}
152169
}
153170
for gem_path in &gem_paths {
154-
if let Ok(packages) =
155-
ruby_crawler.find_by_purls(gem_path, gem_purls).await
156-
{
157-
for (purl, pkg) in packages {
158-
all_packages.entry(purl).or_insert(pkg.path);
171+
match ruby_crawler.find_by_purls(gem_path, gem_purls).await {
172+
Ok(packages) => {
173+
for (purl, pkg) in packages {
174+
all_packages.entry(purl).or_insert(pkg.path);
175+
}
176+
}
177+
Err(e) => {
178+
if !silent {
179+
eprintln!("Warning: Failed to scan {}: {}", gem_path.display(), e);
180+
}
159181
}
160182
}
161183
}
@@ -182,11 +204,16 @@ pub async fn find_packages_for_purls(
182204
}
183205
}
184206
for cache_path in &cache_paths {
185-
if let Ok(packages) =
186-
go_crawler.find_by_purls(cache_path, golang_purls).await
187-
{
188-
for (purl, pkg) in packages {
189-
all_packages.entry(purl).or_insert(pkg.path);
207+
match go_crawler.find_by_purls(cache_path, golang_purls).await {
208+
Ok(packages) => {
209+
for (purl, pkg) in packages {
210+
all_packages.entry(purl).or_insert(pkg.path);
211+
}
212+
}
213+
Err(e) => {
214+
if !silent {
215+
eprintln!("Warning: Failed to scan {}: {}", cache_path.display(), e);
216+
}
190217
}
191218
}
192219
}
@@ -213,11 +240,16 @@ pub async fn find_packages_for_purls(
213240
}
214241
}
215242
for repo_path in &repo_paths {
216-
if let Ok(packages) =
217-
maven_crawler.find_by_purls(repo_path, maven_purls).await
218-
{
219-
for (purl, pkg) in packages {
220-
all_packages.entry(purl).or_insert(pkg.path);
243+
match maven_crawler.find_by_purls(repo_path, maven_purls).await {
244+
Ok(packages) => {
245+
for (purl, pkg) in packages {
246+
all_packages.entry(purl).or_insert(pkg.path);
247+
}
248+
}
249+
Err(e) => {
250+
if !silent {
251+
eprintln!("Warning: Failed to scan {}: {}", repo_path.display(), e);
252+
}
221253
}
222254
}
223255
}
@@ -244,11 +276,16 @@ pub async fn find_packages_for_purls(
244276
}
245277
}
246278
for vendor_path in &vendor_paths {
247-
if let Ok(packages) =
248-
composer_crawler.find_by_purls(vendor_path, composer_purls).await
249-
{
250-
for (purl, pkg) in packages {
251-
all_packages.entry(purl).or_insert(pkg.path);
279+
match composer_crawler.find_by_purls(vendor_path, composer_purls).await {
280+
Ok(packages) => {
281+
for (purl, pkg) in packages {
282+
all_packages.entry(purl).or_insert(pkg.path);
283+
}
284+
}
285+
Err(e) => {
286+
if !silent {
287+
eprintln!("Warning: Failed to scan {}: {}", vendor_path.display(), e);
288+
}
252289
}
253290
}
254291
}
@@ -275,11 +312,16 @@ pub async fn find_packages_for_purls(
275312
}
276313
}
277314
for pkg_path in &pkg_paths {
278-
if let Ok(packages) =
279-
nuget_crawler.find_by_purls(pkg_path, nuget_purls).await
280-
{
281-
for (purl, pkg) in packages {
282-
all_packages.entry(purl).or_insert(pkg.path);
315+
match nuget_crawler.find_by_purls(pkg_path, nuget_purls).await {
316+
Ok(packages) => {
317+
for (purl, pkg) in packages {
318+
all_packages.entry(purl).or_insert(pkg.path);
319+
}
320+
}
321+
Err(e) => {
322+
if !silent {
323+
eprintln!("Warning: Failed to scan {}: {}", pkg_path.display(), e);
324+
}
283325
}
284326
}
285327
}
@@ -385,9 +427,16 @@ pub async fn find_packages_for_rollback(
385427
}
386428
}
387429
for nm_path in &nm_paths {
388-
if let Ok(packages) = npm_crawler.find_by_purls(nm_path, npm_purls).await {
389-
for (purl, pkg) in packages {
390-
all_packages.entry(purl).or_insert(pkg.path);
430+
match npm_crawler.find_by_purls(nm_path, npm_purls).await {
431+
Ok(packages) => {
432+
for (purl, pkg) in packages {
433+
all_packages.entry(purl).or_insert(pkg.path);
434+
}
435+
}
436+
Err(e) => {
437+
if !silent {
438+
eprintln!("Warning: Failed to scan {}: {}", nm_path.display(), e);
439+
}
391440
}
392441
}
393442
}
@@ -414,19 +463,24 @@ pub async fn find_packages_for_rollback(
414463

415464
if let Ok(sp_paths) = python_crawler.get_site_packages_paths(options).await {
416465
for sp_path in &sp_paths {
417-
if let Ok(packages) =
418-
python_crawler.find_by_purls(sp_path, &base_pypi_purls).await
419-
{
420-
for (base_purl, pkg) in packages {
421-
for qualified_purl in pypi_purls {
422-
if strip_purl_qualifiers(qualified_purl) == base_purl
423-
&& !all_packages.contains_key(qualified_purl)
424-
{
425-
all_packages
426-
.insert(qualified_purl.clone(), pkg.path.clone());
466+
match python_crawler.find_by_purls(sp_path, &base_pypi_purls).await {
467+
Ok(packages) => {
468+
for (base_purl, pkg) in packages {
469+
for qualified_purl in pypi_purls {
470+
if strip_purl_qualifiers(qualified_purl) == base_purl
471+
&& !all_packages.contains_key(qualified_purl)
472+
{
473+
all_packages
474+
.insert(qualified_purl.clone(), pkg.path.clone());
475+
}
427476
}
428477
}
429478
}
479+
Err(e) => {
480+
if !silent {
481+
eprintln!("Warning: Failed to scan {}: {}", sp_path.display(), e);
482+
}
483+
}
430484
}
431485
}
432486
}
@@ -446,11 +500,16 @@ pub async fn find_packages_for_rollback(
446500
}
447501
}
448502
for src_path in &src_paths {
449-
if let Ok(packages) =
450-
cargo_crawler.find_by_purls(src_path, cargo_purls).await
451-
{
452-
for (purl, pkg) in packages {
453-
all_packages.entry(purl).or_insert(pkg.path);
503+
match cargo_crawler.find_by_purls(src_path, cargo_purls).await {
504+
Ok(packages) => {
505+
for (purl, pkg) in packages {
506+
all_packages.entry(purl).or_insert(pkg.path);
507+
}
508+
}
509+
Err(e) => {
510+
if !silent {
511+
eprintln!("Warning: Failed to scan {}: {}", src_path.display(), e);
512+
}
454513
}
455514
}
456515
}
@@ -476,11 +535,16 @@ pub async fn find_packages_for_rollback(
476535
}
477536
}
478537
for gem_path in &gem_paths {
479-
if let Ok(packages) =
480-
ruby_crawler.find_by_purls(gem_path, gem_purls).await
481-
{
482-
for (purl, pkg) in packages {
483-
all_packages.entry(purl).or_insert(pkg.path);
538+
match ruby_crawler.find_by_purls(gem_path, gem_purls).await {
539+
Ok(packages) => {
540+
for (purl, pkg) in packages {
541+
all_packages.entry(purl).or_insert(pkg.path);
542+
}
543+
}
544+
Err(e) => {
545+
if !silent {
546+
eprintln!("Warning: Failed to scan {}: {}", gem_path.display(), e);
547+
}
484548
}
485549
}
486550
}
@@ -507,11 +571,16 @@ pub async fn find_packages_for_rollback(
507571
}
508572
}
509573
for cache_path in &cache_paths {
510-
if let Ok(packages) =
511-
go_crawler.find_by_purls(cache_path, golang_purls).await
512-
{
513-
for (purl, pkg) in packages {
514-
all_packages.entry(purl).or_insert(pkg.path);
574+
match go_crawler.find_by_purls(cache_path, golang_purls).await {
575+
Ok(packages) => {
576+
for (purl, pkg) in packages {
577+
all_packages.entry(purl).or_insert(pkg.path);
578+
}
579+
}
580+
Err(e) => {
581+
if !silent {
582+
eprintln!("Warning: Failed to scan {}: {}", cache_path.display(), e);
583+
}
515584
}
516585
}
517586
}
@@ -538,11 +607,16 @@ pub async fn find_packages_for_rollback(
538607
}
539608
}
540609
for repo_path in &repo_paths {
541-
if let Ok(packages) =
542-
maven_crawler.find_by_purls(repo_path, maven_purls).await
543-
{
544-
for (purl, pkg) in packages {
545-
all_packages.entry(purl).or_insert(pkg.path);
610+
match maven_crawler.find_by_purls(repo_path, maven_purls).await {
611+
Ok(packages) => {
612+
for (purl, pkg) in packages {
613+
all_packages.entry(purl).or_insert(pkg.path);
614+
}
615+
}
616+
Err(e) => {
617+
if !silent {
618+
eprintln!("Warning: Failed to scan {}: {}", repo_path.display(), e);
619+
}
546620
}
547621
}
548622
}
@@ -569,11 +643,16 @@ pub async fn find_packages_for_rollback(
569643
}
570644
}
571645
for vendor_path in &vendor_paths {
572-
if let Ok(packages) =
573-
composer_crawler.find_by_purls(vendor_path, composer_purls).await
574-
{
575-
for (purl, pkg) in packages {
576-
all_packages.entry(purl).or_insert(pkg.path);
646+
match composer_crawler.find_by_purls(vendor_path, composer_purls).await {
647+
Ok(packages) => {
648+
for (purl, pkg) in packages {
649+
all_packages.entry(purl).or_insert(pkg.path);
650+
}
651+
}
652+
Err(e) => {
653+
if !silent {
654+
eprintln!("Warning: Failed to scan {}: {}", vendor_path.display(), e);
655+
}
577656
}
578657
}
579658
}
@@ -600,11 +679,16 @@ pub async fn find_packages_for_rollback(
600679
}
601680
}
602681
for pkg_path in &pkg_paths {
603-
if let Ok(packages) =
604-
nuget_crawler.find_by_purls(pkg_path, nuget_purls).await
605-
{
606-
for (purl, pkg) in packages {
607-
all_packages.entry(purl).or_insert(pkg.path);
682+
match nuget_crawler.find_by_purls(pkg_path, nuget_purls).await {
683+
Ok(packages) => {
684+
for (purl, pkg) in packages {
685+
all_packages.entry(purl).or_insert(pkg.path);
686+
}
687+
}
688+
Err(e) => {
689+
if !silent {
690+
eprintln!("Warning: Failed to scan {}: {}", pkg_path.display(), e);
691+
}
608692
}
609693
}
610694
}

0 commit comments

Comments
 (0)