@@ -9,7 +9,7 @@ use cargo::{
9
9
} ,
10
10
ops,
11
11
ops:: { PackageOpts , Packages } ,
12
- sources:: registry :: RegistrySource ,
12
+ sources:: RegistrySource ,
13
13
util:: { interning:: InternedString , toml:: read_manifest, FileLock } ,
14
14
Config ,
15
15
} ;
@@ -60,18 +60,25 @@ fn hash<H: Hash>(hashable: &H) -> u64 {
60
60
}
61
61
62
62
fn fetch_candidates ( registry : & mut PackageRegistry , dep : & Dependency ) -> Result < Vec < Summary > > {
63
- let mut summaries = registry. query_vec ( dep, false ) ?;
63
+ let mut summaries = match registry. query_vec ( dep, false ) {
64
+ std:: task:: Poll :: Ready ( res) => res?,
65
+ std:: task:: Poll :: Pending => {
66
+ registry. block_until_ready ( ) ?;
67
+ return fetch_candidates ( registry, dep) ;
68
+ }
69
+ } ;
64
70
summaries. sort_by ( |a, b| b. package_id ( ) . partial_cmp ( & a. package_id ( ) ) . unwrap ( ) ) ;
65
71
Ok ( summaries)
66
72
}
67
73
68
- pub fn update_crates_io ( ) -> Result < ( ) > {
74
+ pub fn invalidate_crates_io_cache ( ) -> Result < ( ) > {
69
75
let config = Config :: default ( ) ?;
70
76
let _lock = config. acquire_package_cache_lock ( ) ?;
71
77
let source_id = SourceId :: crates_io ( & config) ?;
72
78
let yanked_whitelist = HashSet :: new ( ) ;
73
- let mut r = RegistrySource :: remote ( source_id, & yanked_whitelist, & config) ;
74
- r. update ( )
79
+ let mut r = RegistrySource :: remote ( source_id, & yanked_whitelist, & config) ?;
80
+ r. invalidate_cache ( ) ;
81
+ Ok ( ( ) )
75
82
}
76
83
77
84
pub fn crate_name_ver_to_dep ( crate_name : & str , version : Option < & str > ) -> Result < Dependency > {
@@ -112,13 +119,22 @@ impl CrateInfo {
112
119
let yanked_whitelist = HashSet :: new ( ) ;
113
120
114
121
let mut source = source_id. load ( & config, & yanked_whitelist) ?;
115
- source. update ( ) ?;
116
122
117
123
let package_id = match version {
118
124
None | Some ( "" ) => {
119
125
let dep = Dependency :: parse ( crate_name, None , source_id) ?;
120
126
let mut package_id: Option < PackageId > = None ;
121
- source. query ( & dep, & mut |p| package_id = Some ( p. package_id ( ) ) ) ?;
127
+ loop {
128
+ match source. query ( & dep, & mut |p| package_id = Some ( p. package_id ( ) ) ) {
129
+ std:: task:: Poll :: Ready ( res) => {
130
+ res?;
131
+ break ;
132
+ }
133
+ std:: task:: Poll :: Pending => {
134
+ source. block_until_ready ( ) ?;
135
+ }
136
+ }
137
+ }
122
138
package_id. unwrap ( )
123
139
}
124
140
Some ( version) => PackageId :: new ( crate_name, version, source_id) ?,
@@ -147,6 +163,7 @@ impl CrateInfo {
147
163
jobs : None ,
148
164
targets : Vec :: new ( ) ,
149
165
to_package : Packages :: Default ,
166
+ keep_going : false ,
150
167
} ;
151
168
152
169
// as of cargo 0.41 this returns a FileLock with a temp path, instead of the one
0 commit comments