@@ -29,6 +29,14 @@ use crate::file_fetcher::CreateCliFileFetcherOptions;
2929use crate :: file_fetcher:: create_cli_file_fetcher;
3030use crate :: jsr:: JsrFetchResolver ;
3131use crate :: npm:: NpmFetchResolver ;
32+ use crate :: npm:: PackageInfoLoadError ;
33+
34+ /// Packages whose metadata could not be fetched (e.g. unreachable or
35+ /// unauthorized private registries) are dropped from the update check. They are
36+ /// collected here, keyed and deduplicated by `(kind, name)`, so we can warn the
37+ /// user instead of skipping them silently.
38+ type SkippedPackages =
39+ std:: collections:: BTreeMap < ( DepKind , StackString ) , Arc < PackageInfoLoadError > > ;
3240
3341#[ derive( Debug , PartialEq , Eq , PartialOrd , Ord ) ]
3442struct OutdatedPackage {
@@ -129,11 +137,14 @@ fn print_outdated(
129137) -> Result < ( ) , AnyError > {
130138 let mut outdated = Vec :: new ( ) ;
131139 let mut seen = std:: collections:: BTreeSet :: new ( ) ;
140+ let mut skipped = SkippedPackages :: new ( ) ;
132141 for ( dep_id, resolved, latest_versions) in
133142 deps. deps_with_resolved_latest_versions ( )
134143 {
135144 let dep = deps. get_dep ( dep_id) ;
136145
146+ collect_skipped ( & mut skipped, dep. kind , & dep. req . name , & latest_versions) ;
147+
137148 let Some ( resolved) = resolved else { continue } ;
138149
139150 let latest = {
@@ -171,12 +182,75 @@ fn print_outdated(
171182 if !outdated. is_empty ( ) {
172183 outdated. sort ( ) ;
173184 print_outdated_table ( & outdated) ;
185+ }
186+
187+ print_skipped_warning ( & skipped) ;
188+
189+ if !outdated. is_empty ( ) {
174190 print_suggestion ( compatible) ;
175191 }
176192
177193 Ok ( ( ) )
178194}
179195
196+ /// Records a package whose metadata fetch failed, deduplicating by
197+ /// `(kind, name)` and keeping the first reason seen.
198+ fn collect_skipped (
199+ skipped : & mut SkippedPackages ,
200+ kind : DepKind ,
201+ name : & StackString ,
202+ latest_versions : & PackageLatestVersion ,
203+ ) {
204+ if let Some ( error) = & latest_versions. fetch_error {
205+ skipped
206+ . entry ( ( kind, name. clone ( ) ) )
207+ . or_insert_with ( || error. clone ( ) ) ;
208+ }
209+ }
210+
211+ fn print_skipped_warning ( skipped : & SkippedPackages ) {
212+ if skipped. is_empty ( ) {
213+ return ;
214+ }
215+
216+ log:: warn!( "" ) ;
217+ log:: warn!(
218+ "{}" ,
219+ color_print:: cformat!(
220+ "<yellow>Warning</>: Unable to check updates for {} package(s), their metadata could not be fetched (e.g. private registry auth or network issues)." ,
221+ skipped. len( ) ,
222+ )
223+ ) ;
224+
225+ if log:: log_enabled!( log:: Level :: Debug ) {
226+ for ( ( kind, name) , error) in skipped {
227+ log:: warn!(
228+ "{}" ,
229+ color_print:: cformat!(
230+ " <bold>{}:{}</> (registry: {})" ,
231+ kind. scheme( ) ,
232+ name,
233+ error. registry_url,
234+ )
235+ ) ;
236+ log:: warn!( " Reason: {}" , error. reason) ;
237+ }
238+ log:: warn!(
239+ "{}" ,
240+ color_print:: cformat!(
241+ "<p(245)>Verify your registry credentials (.npmrc) and network connectivity.</>"
242+ )
243+ ) ;
244+ } else {
245+ log:: warn!(
246+ "{}" ,
247+ color_print:: cformat!(
248+ "<p(245)>Run with </><u>--log-level=debug</><p(245)> for details on which packages could not be checked.</>"
249+ )
250+ ) ;
251+ }
252+ }
253+
180254pub async fn outdated (
181255 flags : Arc < Flags > ,
182256 update_flags : OutdatedFlags ,
@@ -367,13 +441,15 @@ async fn update(
367441 let mut to_update = Vec :: new ( ) ;
368442
369443 let mut can_update_to_latest = false ;
444+ let mut skipped = SkippedPackages :: new ( ) ;
370445
371446 for ( dep_id, resolved, latest_versions) in deps
372447 . deps_with_resolved_latest_versions ( )
373448 . into_iter ( )
374449 . collect :: < Vec < _ > > ( )
375450 {
376451 let dep = deps. get_dep ( dep_id) ;
452+ collect_skipped ( & mut skipped, dep. kind , & dep. req . name , & latest_versions) ;
377453 let new_version_req = choose_new_version_req (
378454 dep,
379455 resolved. as_ref ( ) ,
@@ -552,6 +628,8 @@ async fn update(
552628 }
553629 }
554630
631+ print_skipped_warning ( & skipped) ;
632+
555633 Ok ( ( ) )
556634}
557635
0 commit comments