Skip to content

Commit ce36ff5

Browse files
committed
fix!: Use the sparse registry
BREAKING CHANGE: This removes some features related to git
1 parent 1babc04 commit ce36ff5

File tree

42 files changed

+1244
-228
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1244
-228
lines changed

Cargo.lock

+946-81
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+6-5
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,15 @@ required-features = ["set-version"]
5858
[dependencies]
5959
concolor-control = { version = "0.0.7", default-features = false }
6060
cargo_metadata = "0.15.4"
61-
crates-index = "0.19.13"
61+
# Use this with default-features set to "true" (implicitly) so that reqwest,
62+
# a transitive dependency, is compiled with support for both webpki
63+
# certificates AND native certificates. We want support for both to be
64+
# present, and then to let the user _select_ through configuration which
65+
# one they want to be used.
66+
tame-index = { version = "0.13", features = ["sparse", "native-certs", "local"] }
6267
dunce = "1.0"
6368
env_proxy = "0.4.1"
6469
anyhow = "1.0"
65-
git2 = "0.17"
6670
hex = "0.4.3"
6771
home = "0.5.5"
6872
regex = "1.9.4"
@@ -99,7 +103,6 @@ default = [
99103
"rm",
100104
"upgrade",
101105
"set-version",
102-
"vendored-libgit2",
103106
]
104107
add = ["cli"]
105108
rm = ["cli"]
@@ -108,5 +111,3 @@ set-version = ["cli"]
108111
cli = ["color", "clap"]
109112
color = ["concolor-control/auto"]
110113
test-external-apis = []
111-
vendored-openssl = ["git2/vendored-openssl"]
112-
vendored-libgit2 = ["git2/vendored-libgit2"]

src/bin/upgrade/upgrade.rs

+15-34
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use std::path::PathBuf;
55

66
use anyhow::Context as _;
77
use cargo_edit::{
8-
find, get_compatible_dependency, get_latest_dependency, registry_url, set_dep_version,
9-
shell_note, shell_status, shell_warn, shell_write_stdout, update_registry_index, CargoResult,
10-
CrateSpec, Dependency, LocalManifest, RustVersion, Source,
8+
get_compatible_dependency, get_latest_dependency, registry_url, set_dep_version, shell_note,
9+
shell_status, shell_warn, shell_write_stdout, CargoResult, CertsSource, CrateSpec, Dependency,
10+
IndexCache, LocalManifest, RustVersion, Source,
1111
};
1212
use clap::Args;
1313
use indexmap::IndexMap;
@@ -157,10 +157,7 @@ enum UnstableOptions {}
157157
/// messages.
158158
fn exec(args: UpgradeArgs) -> CargoResult<()> {
159159
let offline = false;
160-
if !offline {
161-
let url = registry_url(&find(args.manifest_path.as_deref())?, None)?;
162-
update_registry_index(&url, false)?;
163-
}
160+
let mut index = IndexCache::new(CertsSource::Native);
164161

165162
let metadata = resolve_ws(args.manifest_path.as_deref(), args.locked, offline)?;
166163
let root_manifest_path = metadata.workspace_root.as_std_path().join("Cargo.toml");
@@ -209,7 +206,6 @@ fn exec(args: UpgradeArgs) -> CargoResult<()> {
209206
.collect::<CargoResult<IndexMap<_, Option<_>>>>()?;
210207
let mut processed_keys = BTreeSet::new();
211208

212-
let mut updated_registries = BTreeSet::new();
213209
let mut modified_crates = BTreeSet::new();
214210
let mut git_crates = BTreeSet::new();
215211
let mut pinned_present = false;
@@ -292,26 +288,16 @@ fn exec(args: UpgradeArgs) -> CargoResult<()> {
292288
{
293289
// Update indices for any alternative registries, unless
294290
// we're offline.
295-
let registry_url = dependency
296-
.registry()
297-
.map(|registry| registry_url(&manifest_path, Some(registry)))
298-
.transpose()?;
299-
if !offline {
300-
if let Some(registry_url) = &registry_url {
301-
if updated_registries.insert(registry_url.to_owned()) {
302-
update_registry_index(registry_url, false)?;
303-
}
304-
}
305-
}
291+
let registry_url = registry_url(&manifest_path, dependency.registry())?;
292+
let index = index.index(&registry_url)?;
306293
let latest_compatible = VersionReq::parse(&old_version_req)
307294
.ok()
308295
.and_then(|old_version_req| {
309296
get_compatible_dependency(
310297
&dependency.name,
311298
&old_version_req,
312299
rust_version,
313-
&manifest_path,
314-
registry_url.as_ref(),
300+
index,
315301
)
316302
.ok()
317303
})
@@ -321,19 +307,14 @@ fn exec(args: UpgradeArgs) -> CargoResult<()> {
321307
.to_owned()
322308
});
323309
let is_prerelease = old_version_req.contains('-');
324-
let latest_version = get_latest_dependency(
325-
&dependency.name,
326-
is_prerelease,
327-
rust_version,
328-
&manifest_path,
329-
registry_url.as_ref(),
330-
)
331-
.map(|d| {
332-
d.version()
333-
.expect("registry packages always have a version")
334-
.to_owned()
335-
})
336-
.ok();
310+
let latest_version =
311+
get_latest_dependency(&dependency.name, is_prerelease, rust_version, index)
312+
.map(|d| {
313+
d.version()
314+
.expect("registry packages always have a version")
315+
.to_owned()
316+
})
317+
.ok();
337318
let latest_incompatible = if latest_version != latest_compatible {
338319
latest_version
339320
} else {

src/fetch.rs

+15-68
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
1-
use std::path::Path;
2-
use std::time::Duration;
3-
4-
use url::Url;
5-
61
use super::errors::*;
7-
use super::registry::registry_url;
8-
use super::shell_status;
2+
use super::AnyIndexCache;
93
use super::Dependency;
104
use super::RegistrySource;
115
use super::VersionExt;
@@ -24,19 +18,13 @@ pub fn get_latest_dependency(
2418
crate_name: &str,
2519
flag_allow_prerelease: bool,
2620
rust_version: Option<RustVersion>,
27-
manifest_path: &Path,
28-
registry: Option<&Url>,
21+
index: &mut AnyIndexCache,
2922
) -> CargoResult<Dependency> {
3023
if crate_name.is_empty() {
3124
anyhow::bail!("Found empty crate name");
3225
}
3326

34-
let registry = match registry {
35-
Some(url) => url.clone(),
36-
None => registry_url(manifest_path, None)?,
37-
};
38-
39-
let crate_versions = fuzzy_query_registry_index(crate_name, &registry)?;
27+
let crate_versions = fuzzy_query_registry_index(crate_name, index)?;
4028

4129
let dep = read_latest_version(&crate_versions, flag_allow_prerelease, rust_version)?;
4230

@@ -52,19 +40,13 @@ pub fn get_compatible_dependency(
5240
crate_name: &str,
5341
version_req: &semver::VersionReq,
5442
rust_version: Option<RustVersion>,
55-
manifest_path: &Path,
56-
registry: Option<&Url>,
43+
index: &mut AnyIndexCache,
5744
) -> CargoResult<Dependency> {
5845
if crate_name.is_empty() {
5946
anyhow::bail!("Found empty crate name");
6047
}
6148

62-
let registry = match registry {
63-
Some(url) => url.clone(),
64-
None => registry_url(manifest_path, None)?,
65-
};
66-
67-
let crate_versions = fuzzy_query_registry_index(crate_name, &registry)?;
49+
let crate_versions = fuzzy_query_registry_index(crate_name, index)?;
6850

6951
let dep = read_compatible_version(&crate_versions, version_req, rust_version)?;
7052

@@ -156,10 +138,8 @@ struct CrateVersion {
156138
/// Fuzzy query crate from registry index
157139
fn fuzzy_query_registry_index(
158140
crate_name: impl Into<String>,
159-
registry: &Url,
141+
index: &mut AnyIndexCache,
160142
) -> CargoResult<Vec<CrateVersion>> {
161-
let index = crates_index::Index::from_url(registry.as_str())?;
162-
163143
let crate_name = crate_name.into();
164144
let mut names = gen_fuzzy_crate_names(crate_name.clone())?;
165145
if let Some(index) = names.iter().position(|x| *x == crate_name) {
@@ -168,19 +148,19 @@ fn fuzzy_query_registry_index(
168148
}
169149

170150
for the_name in names {
171-
let crate_ = match index.crate_(&the_name) {
172-
Some(crate_) => crate_,
173-
None => continue,
151+
let krate = match index.krate(&the_name) {
152+
Ok(Some(krate)) => krate,
153+
_ => continue,
174154
};
175-
return crate_
176-
.versions()
155+
return krate
156+
.versions
177157
.iter()
178158
.map(|v| {
179159
Ok(CrateVersion {
180-
name: v.name().to_owned(),
181-
version: v.version().parse()?,
182-
rust_version: v.rust_version().map(|r| r.parse()).transpose()?,
183-
yanked: v.is_yanked(),
160+
name: v.name.to_string(),
161+
version: v.version.as_ref().parse()?,
162+
rust_version: v.rust_version.as_ref().map(|r| r.parse()).transpose()?,
163+
yanked: v.yanked,
184164
})
185165
})
186166
.collect();
@@ -295,39 +275,6 @@ fn read_compatible_version(
295275
Ok(Dependency::new(name).set_source(RegistrySource::new(version)))
296276
}
297277

298-
/// update registry index for given project
299-
pub fn update_registry_index(registry: &Url, quiet: bool) -> CargoResult<()> {
300-
let mut index = crates_index::Index::from_url(registry.as_str())?;
301-
if !quiet {
302-
shell_status("Updating", &format!("'{registry}' index"))?;
303-
}
304-
305-
while need_retry(index.update())? {
306-
shell_status("Blocking", "waiting for lock on registry index")?;
307-
std::thread::sleep(REGISTRY_BACKOFF);
308-
}
309-
310-
Ok(())
311-
}
312-
313-
/// Time between retries for retrieving the registry.
314-
const REGISTRY_BACKOFF: Duration = Duration::from_secs(1);
315-
316-
/// Check if we need to retry retrieving the Index.
317-
fn need_retry(res: Result<(), crates_index::Error>) -> CargoResult<bool> {
318-
match res {
319-
Ok(()) => Ok(false),
320-
Err(crates_index::Error::Git(err)) => {
321-
if err.class() == git2::ErrorClass::Index && err.code() == git2::ErrorCode::Locked {
322-
Ok(true)
323-
} else {
324-
Err(crates_index::Error::Git(err).into())
325-
}
326-
}
327-
Err(err) => Err(err.into()),
328-
}
329-
}
330-
331278
#[test]
332279
fn test_gen_fuzzy_crate_names() {
333280
fn test_helper(input: &str, expect: &[&str]) {

0 commit comments

Comments
 (0)