Skip to content

Commit dd64215

Browse files
committed
Refactors
1 parent 8bc456c commit dd64215

File tree

4 files changed

+84
-233
lines changed

4 files changed

+84
-233
lines changed

crates/uv/src/commands/project/install_target.rs

Lines changed: 22 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,7 @@ impl<'lock> Installable<'lock> for InstallTarget<'lock> {
7575
match self {
7676
Self::Project { name, .. } => Box::new(std::iter::once(*name)),
7777
Self::Projects { names, .. } => Box::new(names.iter()),
78-
Self::NonProjectWorkspace { lock, .. } => {
79-
Box::new(lock.members().iter())
80-
}
78+
Self::NonProjectWorkspace { lock, .. } => Box::new(lock.members().iter()),
8179
Self::Workspace { lock, .. } => {
8280
// Identify the workspace members.
8381
//
@@ -297,9 +295,9 @@ impl<'lock> InstallTarget<'lock> {
297295
Err(ProjectError::MissingExtraProject(extra.clone()))
298296
}
299297
Self::Projects { .. } => {
300-
Err(ProjectError::MissingExtraWorkspace(extra.clone()))
298+
Err(ProjectError::MissingExtraProjects(extra.clone()))
301299
}
302-
_ => Err(ProjectError::MissingExtraWorkspace(extra.clone())),
300+
_ => Err(ProjectError::MissingExtraProjects(extra.clone())),
303301
};
304302
}
305303
}
@@ -355,7 +353,7 @@ impl<'lock> InstallTarget<'lock> {
355353

356354
for group in groups.explicit_names() {
357355
if !known_groups.contains(group) {
358-
return Err(ProjectError::MissingGroupWorkspace(group.clone()));
356+
return Err(ProjectError::MissingGroupProjects(group.clone()));
359357
}
360358
}
361359
}
@@ -376,8 +374,12 @@ impl<'lock> InstallTarget<'lock> {
376374
for group in groups.explicit_names() {
377375
if !known_groups.contains(group) {
378376
return match self {
379-
Self::Project { .. } => Err(ProjectError::MissingGroupProject(group.clone())),
380-
Self::Projects { .. } => Err(ProjectError::MissingGroupWorkspace(group.clone())),
377+
Self::Project { .. } => {
378+
Err(ProjectError::MissingGroupProject(group.clone()))
379+
}
380+
Self::Projects { .. } => {
381+
Err(ProjectError::MissingGroupProjects(group.clone()))
382+
}
381383
_ => unreachable!(),
382384
};
383385
}
@@ -402,108 +404,27 @@ impl<'lock> InstallTarget<'lock> {
402404
groups: &DependencyGroupsWithDefaults,
403405
) -> BTreeSet<&PackageName> {
404406
match self {
405-
Self::Project { name, lock, .. } => {
406-
// Collect the packages by name for efficient lookup.
407-
let packages = lock
408-
.packages()
409-
.iter()
410-
.map(|p| (p.name(), p))
411-
.collect::<BTreeMap<_, _>>();
412-
413-
// We'll include the project itself
414-
let mut required_members = BTreeSet::new();
415-
required_members.insert(*name);
416-
417-
// Find all workspace member dependencies recursively
418-
let mut queue: VecDeque<(&PackageName, Option<&ExtraName>)> = VecDeque::new();
419-
let mut seen: FxHashSet<(&PackageName, Option<&ExtraName>)> = FxHashSet::default();
420-
421-
let Some(root_package) = packages.get(name) else {
422-
return required_members;
423-
};
424-
425-
if groups.prod() {
426-
// Add the root package
427-
queue.push_back((name, None));
428-
seen.insert((name, None));
429-
430-
// Add explicitly activated extras for the root package
431-
for extra in extras.extra_names(root_package.optional_dependencies().keys()) {
432-
if seen.insert((name, Some(extra))) {
433-
queue.push_back((name, Some(extra)));
434-
}
435-
}
436-
}
437-
438-
// Add activated dependency groups for the root package
439-
for (group_name, dependencies) in root_package.resolved_dependency_groups() {
440-
if !groups.contains(group_name) {
441-
continue;
442-
}
443-
for dependency in dependencies {
444-
let name = dependency.package_name();
445-
queue.push_back((name, None));
446-
for extra in dependency.extra() {
447-
queue.push_back((name, Some(extra)));
448-
}
449-
}
450-
}
451-
452-
while let Some((pkg_name, extra)) = queue.pop_front() {
453-
if lock.members().contains(pkg_name) {
454-
required_members.insert(pkg_name);
455-
}
456-
457-
let Some(package) = packages.get(pkg_name) else {
458-
continue;
459-
};
460-
461-
let Some(dependencies) = extra
462-
.map(|extra_name| {
463-
package
464-
.optional_dependencies()
465-
.get(extra_name)
466-
.map(Vec::as_slice)
467-
})
468-
.unwrap_or(Some(package.dependencies()))
469-
else {
470-
continue;
471-
};
472-
473-
for dependency in dependencies {
474-
let name = dependency.package_name();
475-
if seen.insert((name, None)) {
476-
queue.push_back((name, None));
477-
}
478-
for extra in dependency.extra() {
479-
if seen.insert((name, Some(extra))) {
480-
queue.push_back((name, Some(extra)));
481-
}
482-
}
483-
}
484-
}
407+
Self::Project { lock, .. } | Self::Projects { lock, .. } => {
408+
let roots = self.roots().collect::<FxHashSet<_>>();
485409

486-
required_members
487-
}
488-
Self::Projects { names, lock, .. } => {
489410
// Collect the packages by name for efficient lookup.
490411
let packages = lock
491412
.packages()
492413
.iter()
493-
.map(|p| (p.name(), p))
414+
.map(|package| (package.name(), package))
494415
.collect::<BTreeMap<_, _>>();
495416

496417
// We'll include all specified projects
497418
let mut required_members = BTreeSet::new();
498-
for name in names.iter() {
499-
required_members.insert(name);
419+
for name in &roots {
420+
required_members.insert(*name);
500421
}
501422

502423
// Find all workspace member dependencies recursively for all specified packages
503424
let mut queue: VecDeque<(&PackageName, Option<&ExtraName>)> = VecDeque::new();
504425
let mut seen: FxHashSet<(&PackageName, Option<&ExtraName>)> = FxHashSet::default();
505426

506-
for name in names.iter() {
427+
for name in roots {
507428
let Some(root_package) = packages.get(name) else {
508429
continue;
509430
};
@@ -515,7 +436,8 @@ impl<'lock> InstallTarget<'lock> {
515436
}
516437

517438
// Add explicitly activated extras for the root package
518-
for extra in extras.extra_names(root_package.optional_dependencies().keys()) {
439+
for extra in extras.extra_names(root_package.optional_dependencies().keys())
440+
{
519441
if seen.insert((name, Some(extra))) {
520442
queue.push_back((name, Some(extra)));
521443
}
@@ -541,12 +463,12 @@ impl<'lock> InstallTarget<'lock> {
541463
}
542464
}
543465

544-
while let Some((pkg_name, extra)) = queue.pop_front() {
545-
if lock.members().contains(pkg_name) {
546-
required_members.insert(pkg_name);
466+
while let Some((package_name, extra)) = queue.pop_front() {
467+
if lock.members().contains(package_name) {
468+
required_members.insert(package_name);
547469
}
548470

549-
let Some(package) = packages.get(pkg_name) else {
471+
let Some(package) = packages.get(package_name) else {
550472
continue;
551473
};
552474

crates/uv/src/commands/project/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ pub(crate) enum ProjectError {
161161
MissingGroupProject(GroupName),
162162

163163
#[error("Group `{0}` is not defined in any project's `dependency-groups` table")]
164-
MissingGroupWorkspace(GroupName),
164+
MissingGroupProjects(GroupName),
165165

166166
#[error("PEP 723 scripts do not support dependency groups, but group `{0}` was specified")]
167167
MissingGroupScript(GroupName),
@@ -175,7 +175,7 @@ pub(crate) enum ProjectError {
175175
MissingExtraProject(ExtraName),
176176

177177
#[error("Extra `{0}` is not defined in any project's `optional-dependencies` table")]
178-
MissingExtraWorkspace(ExtraName),
178+
MissingExtraProjects(ExtraName),
179179

180180
#[error("PEP 723 scripts do not support optional dependencies, but extra `{0}` was specified")]
181181
MissingExtraScript(ExtraName),

crates/uv/src/commands/project/sync.rs

Lines changed: 30 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -109,37 +109,13 @@ pub(crate) async fn sync(
109109
&workspace_cache,
110110
)
111111
.await?
112-
} else if !package.is_empty() {
113-
// If a single package is specified, use it as the current project
114-
if package.len() == 1 {
115-
VirtualProject::Project(
116-
Workspace::discover(
117-
project_dir,
118-
&DiscoveryOptions::default(),
119-
&workspace_cache,
120-
)
112+
} else if let [name] = package.as_slice() {
113+
VirtualProject::Project(
114+
Workspace::discover(project_dir, &DiscoveryOptions::default(), &workspace_cache)
121115
.await?
122-
.with_current_project(package[0].clone())
123-
.with_context(|| format!("Package `{}` not found in workspace", package[0]))?,
124-
)
125-
} else {
126-
// Multiple packages specified - discover the workspace and validate all packages exist
127-
let workspace = Workspace::discover(
128-
project_dir,
129-
&DiscoveryOptions::default(),
130-
&workspace_cache,
131-
)
132-
.await?;
133-
134-
// Validate that all specified packages exist in the workspace
135-
for pkg in &package {
136-
if !workspace.packages().contains_key(pkg) {
137-
anyhow::bail!("Package `{pkg}` not found in workspace");
138-
}
139-
}
140-
141-
VirtualProject::NonProject(workspace)
142-
}
116+
.with_current_project(name.clone())
117+
.with_context(|| format!("Package `{name}` not found in workspace"))?,
118+
)
143119
} else {
144120
VirtualProject::discover(project_dir, &DiscoveryOptions::default(), &workspace_cache)
145121
.await?
@@ -493,49 +469,45 @@ fn identify_installation_target<'a>(
493469
workspace: project.workspace(),
494470
lock,
495471
}
496-
} else if !package.is_empty() {
497-
if package.len() == 1 {
498-
InstallTarget::Project {
472+
} else {
473+
match package {
474+
// By default, install the root project.
475+
[] => InstallTarget::Project {
499476
workspace: project.workspace(),
500-
name: &package[0],
477+
name: project.project_name(),
501478
lock,
502-
}
503-
} else {
504-
InstallTarget::Projects {
479+
},
480+
[name] => InstallTarget::Project {
505481
workspace: project.workspace(),
506-
names: package,
482+
name,
507483
lock,
508-
}
509-
}
510-
} else {
511-
// By default, install the root package.
512-
InstallTarget::Project {
513-
workspace: project.workspace(),
514-
name: project.project_name(),
515-
lock,
484+
},
485+
names => InstallTarget::Projects {
486+
workspace: project.workspace(),
487+
names,
488+
lock,
489+
},
516490
}
517491
}
518492
}
519493
VirtualProject::NonProject(workspace) => {
520494
if all_packages {
521495
InstallTarget::NonProjectWorkspace { workspace, lock }
522-
} else if !package.is_empty() {
523-
if package.len() == 1 {
524-
InstallTarget::Project {
496+
} else {
497+
match package {
498+
// By default, install the entire workspace.
499+
[] => InstallTarget::NonProjectWorkspace { workspace, lock },
500+
[name] => InstallTarget::Project {
525501
workspace,
526-
name: &package[0],
502+
name,
527503
lock,
528-
}
529-
} else {
530-
InstallTarget::Projects {
504+
},
505+
names => InstallTarget::Projects {
531506
workspace,
532-
names: package,
507+
names,
533508
lock,
534-
}
509+
},
535510
}
536-
} else {
537-
// By default, install the entire workspace.
538-
InstallTarget::NonProjectWorkspace { workspace, lock }
539511
}
540512
}
541513
}

0 commit comments

Comments
 (0)