Skip to content

Commit a645c4f

Browse files
committed
refactor(source): Replace bool with enum
1 parent 617ab8d commit a645c4f

File tree

14 files changed

+99
-82
lines changed

14 files changed

+99
-82
lines changed

crates/resolver-tests/src/lib.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use std::time::Instant;
1212

1313
use cargo::core::dependency::DepKind;
1414
use cargo::core::resolver::{self, ResolveOpts, VersionPreferences};
15-
use cargo::core::source::{GitReference, SourceId};
15+
use cargo::core::source::{GitReference, QueryKind, SourceId};
1616
use cargo::core::Resolve;
1717
use cargo::core::{Dependency, PackageId, Registry, Summary};
1818
use cargo::util::{CargoResult, Config, Graph, IntoUrl};
@@ -128,11 +128,15 @@ pub fn resolve_with_config_raw(
128128
fn query(
129129
&mut self,
130130
dep: &Dependency,
131-
fuzzy: bool,
131+
kind: QueryKind,
132132
f: &mut dyn FnMut(Summary),
133133
) -> Poll<CargoResult<()>> {
134134
for summary in self.list.iter() {
135-
if fuzzy || dep.matches(summary) {
135+
let matched = match kind {
136+
QueryKind::Exact => dep.matches(summary),
137+
QueryKind::Fuzzy => true,
138+
};
139+
if matched {
136140
self.used.insert(summary.package_id());
137141
f(summary.clone());
138142
}

src/cargo/core/compiler/future_incompat.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Support for future-incompatible warning reporting.
22
33
use crate::core::compiler::BuildContext;
4-
use crate::core::{Dependency, PackageId, Workspace};
4+
use crate::core::{Dependency, PackageId, QueryKind, Workspace};
55
use crate::sources::SourceConfigMap;
66
use crate::util::{iter_join, CargoResult, Config};
77
use anyhow::{bail, format_err, Context};
@@ -293,7 +293,7 @@ fn get_updates(ws: &Workspace<'_>, package_ids: &BTreeSet<PackageId>) -> Option<
293293
Ok(dep) => dep,
294294
Err(_) => return false,
295295
};
296-
match source.query_vec(&dep, false) {
296+
match source.query_vec(&dep, QueryKind::Exact) {
297297
Poll::Ready(Ok(sum)) => {
298298
summaries.push((pkg_id, sum));
299299
false

src/cargo/core/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ pub use self::package_id_spec::PackageIdSpec;
88
pub use self::registry::Registry;
99
pub use self::resolver::{Resolve, ResolveVersion};
1010
pub use self::shell::{Shell, Verbosity};
11-
pub use self::source::{GitReference, Source, SourceId, SourceMap};
11+
pub use self::source::{GitReference, QueryKind, Source, SourceId, SourceMap};
1212
pub use self::summary::{FeatureMap, FeatureValue, Summary};
1313
pub use self::workspace::{
1414
find_workspace_root, resolve_relative_path, MaybePackage, Workspace, WorkspaceConfig,

src/cargo/core/registry.rs

+11-12
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::collections::{HashMap, HashSet};
22
use std::task::Poll;
33

44
use crate::core::PackageSet;
5-
use crate::core::{Dependency, PackageId, Source, SourceId, SourceMap, Summary};
5+
use crate::core::{Dependency, PackageId, QueryKind, Source, SourceId, SourceMap, Summary};
66
use crate::sources::config::SourceConfigMap;
77
use crate::util::errors::CargoResult;
88
use crate::util::interning::InternedString;
@@ -19,14 +19,13 @@ pub trait Registry {
1919
fn query(
2020
&mut self,
2121
dep: &Dependency,
22-
fuzzy: bool,
22+
kind: QueryKind,
2323
f: &mut dyn FnMut(Summary),
2424
) -> Poll<CargoResult<()>>;
2525

26-
fn query_vec(&mut self, dep: &Dependency, fuzzy: bool) -> Poll<CargoResult<Vec<Summary>>> {
26+
fn query_vec(&mut self, dep: &Dependency, kind: QueryKind) -> Poll<CargoResult<Vec<Summary>>> {
2727
let mut ret = Vec::new();
28-
self.query(dep, fuzzy, &mut |s| ret.push(s))
29-
.map_ok(|()| ret)
28+
self.query(dep, kind, &mut |s| ret.push(s)).map_ok(|()| ret)
3029
}
3130

3231
fn describe_source(&self, source: SourceId) -> String;
@@ -327,7 +326,7 @@ impl<'cfg> PackageRegistry<'cfg> {
327326
.get_mut(dep.source_id())
328327
.expect("loaded source not present");
329328

330-
let summaries = match source.query_vec(dep, false)? {
329+
let summaries = match source.query_vec(dep, QueryKind::Exact)? {
331330
Poll::Ready(deps) => deps,
332331
Poll::Pending => {
333332
deps_pending.push(dep_remaining);
@@ -483,7 +482,7 @@ impl<'cfg> PackageRegistry<'cfg> {
483482
for &s in self.overrides.iter() {
484483
let src = self.sources.get_mut(s).unwrap();
485484
let dep = Dependency::new_override(dep.package_name(), s);
486-
let mut results = match src.query_vec(&dep, false) {
485+
let mut results = match src.query_vec(&dep, QueryKind::Exact) {
487486
Poll::Ready(results) => results?,
488487
Poll::Pending => return Poll::Pending,
489488
};
@@ -575,7 +574,7 @@ impl<'cfg> Registry for PackageRegistry<'cfg> {
575574
fn query(
576575
&mut self,
577576
dep: &Dependency,
578-
fuzzy: bool,
577+
kind: QueryKind,
579578
f: &mut dyn FnMut(Summary),
580579
) -> Poll<CargoResult<()>> {
581580
assert!(self.patches_locked);
@@ -671,7 +670,7 @@ impl<'cfg> Registry for PackageRegistry<'cfg> {
671670
}
672671
f(lock(locked, all_patches, summary))
673672
};
674-
return source.query(dep, fuzzy, callback);
673+
return source.query(dep, kind, callback);
675674
}
676675

677676
// If we have an override summary then we query the source
@@ -690,7 +689,7 @@ impl<'cfg> Registry for PackageRegistry<'cfg> {
690689
n += 1;
691690
to_warn = Some(summary);
692691
};
693-
let pend = source.query(dep, fuzzy, callback);
692+
let pend = source.query(dep, kind, callback);
694693
if pend.is_pending() {
695694
return Poll::Pending;
696695
}
@@ -881,7 +880,7 @@ fn summary_for_patch(
881880
// No summaries found, try to help the user figure out what is wrong.
882881
if let Some(locked) = locked {
883882
// Since the locked patch did not match anything, try the unlocked one.
884-
let orig_matches = match source.query_vec(orig_patch, false) {
883+
let orig_matches = match source.query_vec(orig_patch, QueryKind::Exact) {
885884
Poll::Pending => return Poll::Pending,
886885
Poll::Ready(deps) => deps,
887886
}
@@ -906,7 +905,7 @@ fn summary_for_patch(
906905
// Try checking if there are *any* packages that match this by name.
907906
let name_only_dep = Dependency::new_override(orig_patch.package_name(), orig_patch.source_id());
908907

909-
let name_summaries = match source.query_vec(&name_only_dep, false) {
908+
let name_summaries = match source.query_vec(&name_only_dep, QueryKind::Exact) {
910909
Poll::Pending => return Poll::Pending,
911910
Poll::Ready(deps) => deps,
912911
}

src/cargo/core/resolver/dep_cache.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ use crate::core::resolver::{
1616
ActivateError, ActivateResult, CliFeatures, RequestedFeatures, ResolveOpts, VersionOrdering,
1717
VersionPreferences,
1818
};
19-
use crate::core::{Dependency, FeatureValue, PackageId, PackageIdSpec, Registry, Summary};
19+
use crate::core::{
20+
Dependency, FeatureValue, PackageId, PackageIdSpec, QueryKind, Registry, Summary,
21+
};
2022
use crate::util::errors::CargoResult;
2123
use crate::util::interning::InternedString;
2224

@@ -100,7 +102,7 @@ impl<'a> RegistryQueryer<'a> {
100102
}
101103

102104
let mut ret = Vec::new();
103-
let ready = self.registry.query(dep, false, &mut |s| {
105+
let ready = self.registry.query(dep, QueryKind::Exact, &mut |s| {
104106
ret.push(s);
105107
})?;
106108
if ready.is_pending() {
@@ -123,7 +125,7 @@ impl<'a> RegistryQueryer<'a> {
123125
dep.version_req()
124126
);
125127

126-
let mut summaries = match self.registry.query_vec(dep, false)? {
128+
let mut summaries = match self.registry.query_vec(dep, QueryKind::Exact)? {
127129
Poll::Ready(s) => s.into_iter(),
128130
Poll::Pending => {
129131
self.registry_cache.insert(dep.clone(), Poll::Pending);

src/cargo/core/resolver/errors.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::fmt;
22
use std::task::Poll;
33

4-
use crate::core::{Dependency, PackageId, Registry, Summary};
4+
use crate::core::{Dependency, PackageId, QueryKind, Registry, Summary};
55
use crate::util::lev_distance::lev_distance;
66
use crate::util::{Config, VersionExt};
77
use anyhow::Error;
@@ -228,7 +228,7 @@ pub(super) fn activation_error(
228228
new_dep.set_version_req(all_req);
229229

230230
let mut candidates = loop {
231-
match registry.query_vec(&new_dep, false) {
231+
match registry.query_vec(&new_dep, QueryKind::Exact) {
232232
Poll::Ready(Ok(candidates)) => break candidates,
233233
Poll::Ready(Err(e)) => return to_resolve_err(e),
234234
Poll::Pending => match registry.block_until_ready() {
@@ -294,7 +294,7 @@ pub(super) fn activation_error(
294294
// Maybe the user mistyped the name? Like `dep-thing` when `Dep_Thing`
295295
// was meant. So we try asking the registry for a `fuzzy` search for suggestions.
296296
let mut candidates = loop {
297-
match registry.query_vec(&new_dep, true) {
297+
match registry.query_vec(&new_dep, QueryKind::Fuzzy) {
298298
Poll::Ready(Ok(candidates)) => break candidates,
299299
Poll::Ready(Err(e)) => return to_resolve_err(e),
300300
Poll::Pending => match registry.block_until_ready() {

src/cargo/core/source/mod.rs

+16-11
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,16 @@ pub trait Source {
2929
fn requires_precise(&self) -> bool;
3030

3131
/// Attempts to find the packages that match a dependency request.
32-
///
33-
/// When fuzzy, each source gets to define what `close` means for it.
34-
/// Path/Git sources may return all dependencies that are at that URI,
35-
/// whereas an `Index` source may return dependencies that have the same canonicalization.
3632
fn query(
3733
&mut self,
3834
dep: &Dependency,
39-
fuzzy: bool,
35+
kind: QueryKind,
4036
f: &mut dyn FnMut(Summary),
4137
) -> Poll<CargoResult<()>>;
4238

43-
fn query_vec(&mut self, dep: &Dependency, fuzzy: bool) -> Poll<CargoResult<Vec<Summary>>> {
39+
fn query_vec(&mut self, dep: &Dependency, kind: QueryKind) -> Poll<CargoResult<Vec<Summary>>> {
4440
let mut ret = Vec::new();
45-
self.query(dep, fuzzy, &mut |s| ret.push(s)).map_ok(|_| ret)
41+
self.query(dep, kind, &mut |s| ret.push(s)).map_ok(|_| ret)
4642
}
4743

4844
/// Ensure that the source is fully up-to-date for the current session on the next query.
@@ -114,6 +110,15 @@ pub trait Source {
114110
fn block_until_ready(&mut self) -> CargoResult<()>;
115111
}
116112

113+
#[derive(Copy, Clone, PartialEq, Eq)]
114+
pub enum QueryKind {
115+
Exact,
116+
/// Each source gets to define what `close` means for it.
117+
/// Path/Git sources may return all dependencies that are at that URI,
118+
/// whereas an `Index` source may return dependencies that have the same canonicalization.
119+
Fuzzy,
120+
}
121+
117122
pub enum MaybePackage {
118123
Ready(Package),
119124
Download { url: String, descriptor: String },
@@ -144,10 +149,10 @@ impl<'a, T: Source + ?Sized + 'a> Source for Box<T> {
144149
fn query(
145150
&mut self,
146151
dep: &Dependency,
147-
fuzzy: bool,
152+
kind: QueryKind,
148153
f: &mut dyn FnMut(Summary),
149154
) -> Poll<CargoResult<()>> {
150-
(**self).query(dep, fuzzy, f)
155+
(**self).query(dep, kind, f)
151156
}
152157

153158
fn invalidate_cache(&mut self) {
@@ -214,10 +219,10 @@ impl<'a, T: Source + ?Sized + 'a> Source for &'a mut T {
214219
fn query(
215220
&mut self,
216221
dep: &Dependency,
217-
fuzzy: bool,
222+
kind: QueryKind,
218223
f: &mut dyn FnMut(Summary),
219224
) -> Poll<CargoResult<()>> {
220-
(**self).query(dep, fuzzy, f)
225+
(**self).query(dep, kind, f)
221226
}
222227

223228
fn invalidate_cache(&mut self) {

src/cargo/ops/cargo_add/mod.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use toml_edit::Item as TomlItem;
1919
use crate::core::dependency::DepKind;
2020
use crate::core::registry::PackageRegistry;
2121
use crate::core::Package;
22+
use crate::core::QueryKind;
2223
use crate::core::Registry;
2324
use crate::core::Shell;
2425
use crate::core::Workspace;
@@ -443,8 +444,7 @@ fn get_latest_dependency(
443444
}
444445
MaybeWorkspace::Other(query) => {
445446
let possibilities = loop {
446-
let fuzzy = true;
447-
match registry.query_vec(&query, fuzzy) {
447+
match registry.query_vec(&query, QueryKind::Fuzzy) {
448448
std::task::Poll::Ready(res) => {
449449
break res?;
450450
}
@@ -485,8 +485,8 @@ fn select_package(
485485
}
486486
MaybeWorkspace::Other(query) => {
487487
let possibilities = loop {
488-
let fuzzy = false; // Returns all for path/git
489-
match registry.query_vec(&query, fuzzy) {
488+
// Exact to avoid returning all for path/git
489+
match registry.query_vec(&query, QueryKind::Exact) {
490490
std::task::Poll::Ready(res) => {
491491
break res?;
492492
}
@@ -600,7 +600,7 @@ fn populate_available_features(
600600
MaybeWorkspace::Other(query) => query,
601601
};
602602
let possibilities = loop {
603-
match registry.query_vec(&query, true) {
603+
match registry.query_vec(&query, QueryKind::Fuzzy) {
604604
std::task::Poll::Ready(res) => {
605605
break res?;
606606
}

src/cargo/ops/common_for_install_and_uninstall.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize};
1111
use toml_edit::easy as toml;
1212

1313
use crate::core::compiler::Freshness;
14-
use crate::core::{Dependency, FeatureValue, Package, PackageId, Source, SourceId};
14+
use crate::core::{Dependency, FeatureValue, Package, PackageId, QueryKind, Source, SourceId};
1515
use crate::ops::{self, CompileFilter, CompileOptions};
1616
use crate::sources::PathSource;
1717
use crate::util::errors::CargoResult;
@@ -540,7 +540,7 @@ where
540540
}
541541

542542
let deps = loop {
543-
match source.query_vec(&dep, false)? {
543+
match source.query_vec(&dep, QueryKind::Exact)? {
544544
Poll::Ready(deps) => break deps,
545545
Poll::Pending => source.block_until_ready()?,
546546
}

src/cargo/sources/directory.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::path::{Path, PathBuf};
44
use std::task::Poll;
55

66
use crate::core::source::MaybePackage;
7-
use crate::core::{Dependency, Package, PackageId, Source, SourceId, Summary};
7+
use crate::core::{Dependency, Package, PackageId, QueryKind, Source, SourceId, Summary};
88
use crate::sources::PathSource;
99
use crate::util::errors::CargoResult;
1010
use crate::util::Config;
@@ -49,14 +49,17 @@ impl<'cfg> Source for DirectorySource<'cfg> {
4949
fn query(
5050
&mut self,
5151
dep: &Dependency,
52-
fuzzy: bool,
52+
kind: QueryKind,
5353
f: &mut dyn FnMut(Summary),
5454
) -> Poll<CargoResult<()>> {
5555
if !self.updated {
5656
return Poll::Pending;
5757
}
5858
let packages = self.packages.values().map(|p| &p.0);
59-
let matches = packages.filter(|pkg| fuzzy || dep.matches(pkg.summary()));
59+
let matches = packages.filter(|pkg| match kind {
60+
QueryKind::Exact => dep.matches(pkg.summary()),
61+
QueryKind::Fuzzy => true,
62+
});
6063
for summary in matches.map(|pkg| pkg.summary().clone()) {
6164
f(summary);
6265
}

src/cargo/sources/git/source.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::core::source::{MaybePackage, Source, SourceId};
1+
use crate::core::source::{MaybePackage, QueryKind, Source, SourceId};
22
use crate::core::GitReference;
33
use crate::core::{Dependency, Package, PackageId, Summary};
44
use crate::sources::git::utils::GitRemote;
@@ -89,11 +89,11 @@ impl<'cfg> Source for GitSource<'cfg> {
8989
fn query(
9090
&mut self,
9191
dep: &Dependency,
92-
fuzzy: bool,
92+
kind: QueryKind,
9393
f: &mut dyn FnMut(Summary),
9494
) -> Poll<CargoResult<()>> {
9595
if let Some(src) = self.path_source.as_mut() {
96-
src.query(dep, fuzzy, f)
96+
src.query(dep, kind, f)
9797
} else {
9898
Poll::Pending
9999
}

src/cargo/sources/path.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::path::{Path, PathBuf};
44
use std::task::Poll;
55

66
use crate::core::source::MaybePackage;
7-
use crate::core::{Dependency, Package, PackageId, Source, SourceId, Summary};
7+
use crate::core::{Dependency, Package, PackageId, QueryKind, Source, SourceId, Summary};
88
use crate::ops;
99
use crate::util::{internal, CargoResult, Config};
1010
use anyhow::Context as _;
@@ -500,12 +500,16 @@ impl<'cfg> Source for PathSource<'cfg> {
500500
fn query(
501501
&mut self,
502502
dep: &Dependency,
503-
fuzzy: bool,
503+
kind: QueryKind,
504504
f: &mut dyn FnMut(Summary),
505505
) -> Poll<CargoResult<()>> {
506506
self.update()?;
507507
for s in self.packages.iter().map(|p| p.summary()) {
508-
if fuzzy || dep.matches(s) {
508+
let matched = match kind {
509+
QueryKind::Exact => dep.matches(s),
510+
QueryKind::Fuzzy => true,
511+
};
512+
if matched {
509513
f(s.clone())
510514
}
511515
}

0 commit comments

Comments
 (0)